2011-05-10 29 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中的類時可以使用的能力。