如何使用属性将私有数组公开为只读?

时间:2011-05-10 19:34:28

标签: c# properties private protected

以下代码有何作用?

class MyClass {
    private int[] myPrivates;
    public int[] GetMyPrivates
    {
      get { return myPrivates; }
    }

    protected int[] SetMyPrivates
    {
      set { myPrivates = value; }
    }
}

是否有更好的方法来保护阵列myPrivates?是否有可能只让它重新上架?

4 个答案:

答案 0 :(得分:4)

您的问题非常不清楚。

您可能正在尝试撰写

public int[] MyArray { 
    get { return data; }
    protected set { data = value; }
}

如果您想阻止人们修改数组(例如instance.MyArray[5] = 42),则需要公开ReadOnlyCollection<int>

答案 1 :(得分:1)

您可以做的最好的事情之一就是使用.NET的auto-implemented properties。这是一个允许您声明没有支持字段的属性的功能。支持字段由.NET自动生成。

因此,您的代码可以转换为:

class MyClass
{
   public int[] GetMyPrivates
   {
      get;
      protected set;
   }
}

现在,关于你更通用的问题,“你能在课堂上做什么”。嗯......这是一个非常真正开放的问题,值得长期解释。但是,只需浏览表面,您就可以:

  • 定义对象( class 所做的事情)
  • 通过 fields (一个简单变量)和 properties (一种看起来像字段的方法)描述对象的特征。
  • 通过 methods (这是函数的面向对象的术语)描述对象的行为。
  • 定义您的项目(对象,特征和/或行为)是静态的还是实例的。简而言之,实例意味着您正在处理对象/特征/行为的特定实例; static 表示您正在处理整个对象系列
  • 为您的对象/特征/行为定义 access control (例如,内部,公共,受保护,私有)

还有更多可以说的内容,但这可以让您了解在.NET中使用类时可以使用的强大功能

答案 2 :(得分:0)

您可以通过以下方式替换您的getter和setter:

class MyClass {
    public int[] MyValues { get; protected set; }

    public MyClass() {
        MyValues = new [] {1, 2, 3, 4, 5};
    }

    public void foo {
        foreach (int i in MyValues) {
            Trace.WriteLine(i.ToString());
        }
    }
}

MyOtherClass {
    MyClass myClass;

    // ...
    void bar {
        // You can access the MyClass values in read outside of MyClass, 
        // because of the public property, but not in write because 
        // of the protected setter.
        foreach (int i in myClass.MyValues) {
            Trace.WriteLine(i.ToString());
        }
    }
}

您可以添加几乎任何属性 的保护级别为getter和setter。

答案 3 :(得分:0)

如果您来自 Java背景(您的括号提示),您可能需要知道.NET有一个名为properties的概念,因此您可以说:

class MyClass {
    private int[] myPrivates;
    public int[] MyPrivates {
      get { return myPrivates; }
      set {myPrivates = value;}
    }
}

甚至是自动属性:

class MyClass {
    public int[] MyPrivates {get; set;}

}