2011-05-10 30 views
1

以下代码做了什么?如何使用属性将专用数组公开为只读?

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

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

有没有更好的方法来保护阵列myPrivates?是否有可能使其只能使用?

+3

*“为什么不让myPrivates只读?”*好吧..你想要它读吗-只要?如果你需要一个setter,那么显然它不应该是只读的。如果你不需要setter,那么使它成为只读。 – 2011-05-10 19:36:03

+4

我认为保护私生子总是个好主意。 – jessegavin 2011-05-10 19:36:30

+0

你为什么写C#Javastyle? – 2011-05-10 19:37:05

回答

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的一个。

+0

myPrivates在哪里?我需要得到并设置课堂内。 – 2011-05-10 19:45:01

+0

这是一个汽车财产。我将添加一个使用示例。 – joce 2011-05-10 19:47:03

+0

作为speudo代码感兴趣。我寻找答案然而 – 2011-05-10 19:52:18

4

你的问题是极其不清楚。

您可能试图写

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

如果你想阻止人们修改阵列(例如,instance.MyArray[5] = 42),你需要暴露一个ReadOnlyCollection<int>代替。

+0

生成编译错误,当我使用 – 2011-05-10 19:43:31

0

如果从的Java背景的(您括号提示等等),你可能需要知道.NET有一个概念叫做属性,所以你可以说:

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

甚至自动属性:

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

} 
+0

我来自C++ .. – 2011-05-10 19:44:22

1

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

所以,你的代码可以翻译成:现在

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

,为您更通用的问题,“你可以在类中做”。那么...这真的是,确实是开放的问题,值得一个长时间的解释。但是,只是浮光掠影,您可以:

  • 定义的对象(即一个class做什么)
  • 通过fields(一个简单的变量)和properties描述为对象的特点(看起来像一个字段的方法)。
  • 通过methods描述为对象的行为(这是一个功能的面向对象的行话)
  • 定义你的项目(对象,特征和/或行为)是否为静态或实例。简而言之,实例表示您正在处理对象/特征/行为的特定实例; static意味着你在全家对象的工作
  • 定义access control为对象/特征/行为(例如,内部的,公共的,受保护的,私有的)

有这么多更多的可以这样说,但是这应该让你知道你在使用.NET中的类时可以使用的能力。