2012-04-25 52 views
1

好的,我有這個課程和主要。我在VS 2010旗艦版和.NET 4客戶端上。C#中的屬性和數組會發生什麼?

internal class tezt 
{ 
    private int[] _numeros = new int[5]; 
    public int[] Numeros 
    { 
     get { return _numeros; } 
    } 
} 
public class tezt2 
{ 
    private int[] _numeros = new int[5]; 
    public int[] Numeros 
    { 
     get { return _numeros; } 
    } 
} 
class tezt3 
{ 
    private int[] _numeros = new int[5]; 
    public int[] Numeros 
    { 
     get { return _numeros; } 
    } 
} 
internal static class Program 
{ 
    private static void Main() 
    { 
     var arrNums = new tezt(); 
     var arrNums2 = new tezt2(); 
     var arrNums3 = new tezt3(); 
     Console.WriteLine(arrNums.Numeros[0]); 
     arrNums.Numeros[0] = 5; 
     Console.WriteLine(arrNums.Numeros[0]); 
     Console.WriteLine(arrNums2.Numeros[0]); 
     arrNums2.Numeros[0] = 6; 
     Console.WriteLine(arrNums2.Numeros[0]); 
     Console.WriteLine(arrNums3.Numeros[0]); 
     arrNums3.Numeros[0] = 7; 
     Console.WriteLine(arrNums3.Numeros[0]); 
     Console.ReadKey(true); 
    } 
} 

發生什麼事了這些線:

arrNums.Numeros[0] = 5; 
arrNums2.Numeros[0] = 6; 
arrNums3.Numeros[0] = 7; 

不應該因爲從這些對象都源自於類有沒有set參數,這些asignations絕不允許?

可以做些什麼來避免這種情況,爲了限制這種情況,如arrNums.Numeros[0] = 5;這樣做會引發錯誤?

+1

你沒有設置屬性。您正在從屬性獲取數組並將其分配給其元素。如果你不想要這個,不要公開一個數組。 – 2012-04-25 02:18:19

回答

2

您未設置Numeros屬性,您正在該屬性的索引處修改元素。您只爲該屬性使用獲取者

是不允許被賦予了新的價值,該對象的屬性的分配:

arrNums.Numeros = new int[5]; // will not compile. 

你可以做,吸氣返回IEnumerable<int>保護它:

class tezt3 
{ 
    private int[] _numeros = new int[5]; 
    public IEnumerable<int> Numeros 
    { 
     get { return _numeros; } 
    } 
} 

你也可以使用ReadOnlyCollection。在this question中深入討論了使用IEnumerable<T>ReadOnlyCollection<T>的優缺點。

+0

快速的問題,如果我使用你的代碼,我也想通過set參數來指定_numeros元素,我該如何實現它? – mishamosher 2012-04-25 02:23:56

+1

你可以提供一個設置底層集合的setter:'set {_numeros = value.ToArray(); }' – 2012-04-25 02:25:08

+0

Aja,現在,當我分配someting時,我說'arrNums.Numeros = new [] {5};',並且如果我想要一個'arrNums.Numeros = new [] {5,6,7,8 ,9};'以前,元素6,7,8和9將會丟失。無論如何要避免這一點? – mishamosher 2012-04-25 02:28:47

0

我也可以建議不要在屬性上使用數組。以下是來自Framework Design Guidelines的報價

返回數組的屬性可能非常具有誤導性。通常它是 必須返回一個內部數組的副本,以便用戶 不能更改內部狀態。這可能會導致代碼效率低下。

在下面的示例中,在循環的每次迭代中,Employees屬性在 中訪問兩次。這將是2N + 1份爲 以下簡短的代碼示例:

Company microsoft = GetCompanyData("MSFT"); 
for (int i = 0; i < microsoft.Employees.Length; i++) 
{ 
    if (microsoft.Employees[i].Alias == "kcwalina") 
    { ... } 
} 

Brad Abrams,書中的註釋,在這個陷阱的言論:

在這本書中的一些指南在 摘要中進行辯論並達成一致;其他人則在學校遭受嚴重敲門聲。 返回陣列的屬性指南是在難 敲門陣營。當我們在研究.NET Framework 1.0版 中的一些性能問題時,我們注意到正在創建並快速刪除數千個數組 。事實證明,框架中的許多地方 都遇到了這種模式。不用說,我們 修復了這些實例和指南。 - 布拉德艾布拉姆斯

相關問題