【问题标题】:Array property syntax in C#C# 中的数组属性语法
【发布时间】:2011-10-25 06:27:13
【问题描述】:

我有一个具有整数数组属性的类,我正在尝试找出正确的语法。整数数组在类构造函数中被实例化。

class DemoClass
{
    private int[] myNumbers;
    public int[] MyNumbers
    {
        get { /* Some logic */ }
        set { /* Some logic */ }
    }

    public DemoClass(int elements)
    {
        // Here, the array should get instantiated using the elements.
    }
}

如果我希望我的客户端代码通过属性MyNumbers 从数组中检索一个数字,get/set 块语法如何工作?
如何发送正确的索引?
我必须初始化什么?

【问题讨论】:

  • 您是否正在尝试创建 indexer 属性?

标签: c# arrays syntax properties


【解决方案1】:

您在寻找:

class DemoClass
{
    public int[] MyNumbers { get; private set; }

    public DemoClass(int elements)
    {
        MyNumbers = new int[elements];
    }
}

至于除了公开私有字段(如您所愿)之外什么都不做的普通属性:

private int[] myNumbers;
public int[] MyNumbers
{
    get { return myNumbers; }
    set { myNumbers = value; }
}

【讨论】:

  • 我想知道当我不使用自动属性并且有一个用于存储数组的字段时它是如何工作的。
  • 数组只是 C# 中的一种引用类型,例如,您可以将 int[] 转换为 System.Array`。如果没有自动属性,您只需执行int[] nums; public int[] Nums { get { return nums;} set { nums = value } }。请注意,如果您想获取/设置数组的单个元素,您需要创建一个 indexer property
  • 我建议也使用私人设置器。
  • 谢谢,它有效!我想我通过思考如何将正确的索引传递给 MyNumbers 属性而想多了,但它是自动完成的。还有很多要学的。还要感谢塞尔盖。我将研究索引属性,看看它们能做什么。
  • 需要注意的是微软不建议在属性中使用数组:msdn.microsoft.com/en-us/library/0fss9skc%28v=vs.120%29.aspx
【解决方案2】:

CA1819:属性不应返回数组

http://msdn.microsoft.com/en-us/library/0fss9skc.aspx

属性返回的数组不受写保护,即使该属性是只读的。为了保持数组防篡改,该属性必须返回数组的副本。通常,用户不会理解调用此类属性对性能的不利影响。具体来说,他们可能会将属性用作索引属性。

要修复违反此规则的行为,请将属性设为方法或更改属性以返回集合而不是数组

【讨论】:

    【解决方案3】:

    它被称为Auto-Implemented Properties。所以如果你有类似的语法

    public int[] MyNumbers { get; set; }
    

    C# 编译器会自动为您创建支持字段。此功能是在 C# 3.0 中引入的,在此之前您总是必须使用支持字段来实现属性。

    您可以阅读更多内容:New C# "Orcas" Language Features: Automatic Properties, Object Initializers, and Collection Initializers

    【讨论】:

      【解决方案4】:
      class DemoClass
      {
          private int[] myNumbers;
          public int[] MyNumbers
          {
              get { return myNumbers; }
              set { myNumbers = value;}
          }
      
          public DemoClass(int elements)
          {
              // Here, the array should get instantiated using the elements.
              MyNumbers = new int[5] { 1, 2, 3, 4, 5};
          }
      }
      

      【讨论】:

        【解决方案5】:
         class DemoClass
            {
                private int[] myNumbers;
                public int[] MyNumbers
                {
                    get { return myNumbers; }
                    set { myNumbers = value; }
                }
        
                public DemoClass(int[] elements)
                {
                    myNumbers = elements;
                    // Here, the array should get instantiated using the elements.
                }
            }
        

        【讨论】:

          【解决方案6】:

          如果数组中元素的数量是固定的,我只会为数组提供一个getter,而不用setter。您仍然可以为数组中的单个元素分配值,但这将防止有人从您下方交换整个数组(或将其设置为null。代码如下所示:

          class DemoClass
          {
              public int[] MyNumbers
              { get; private set; }
          
              public DemoClass(int elements)
              {
                  MyNumbers = new int[elements];
              }
          }
          

          如果元素的数量不固定,那么你应该使用List<int> 而不是数组,然后你肯定想要一个没有setter的属性。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-12-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-02-25
            • 1970-01-01
            • 2017-12-21
            相关资源
            最近更新 更多