C# 中的数组属性语法

Posted

技术标签:

【中文标题】C# 中的数组属性语法【英文标题】:Array property syntax in 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 属性? 【参考方案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的属性。

【讨论】:

以上是关于C# 中的数组属性语法的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在继承属性中为封闭的泛型使用 C# 语法,但 CLR 语法很好

C# 9 record 并非简单属性 POCO 的语法糖

Python中的这个属性语法是啥? [复制]

在c#中将对象列表转换为数组-“x => x.Name”语法是啥意思? [复制]

C#十种语法糖

C# 将用户添加到 Active Directory - 指定给目录服务的属性语法无效