2011-09-26 71 views
0

我知道struct是值類型,class是.Net中的引用類型。我想知道這裏是否有更好的解決方案。默認初始化創建一個struct vs類對象的數組

例,

public struct Holder 
{ 
    public double Value { get; set; } 

    public Holder() 
    { 
     this.Value = 0.0; 
    } 
} 

使用這種結構的:

void SomeFunction(int n) 
{ 
    Holder[] valueHolders = new Holder[n]; 
    ... 
    valueHolders[0].Value = someValue; 
} 

這工作完全正常。現在只需將Holder更改爲class即可。它拋出一個null對象引用,因爲valueHolders包含所有值爲null

現在我已經改變了我的代碼

valueHolders[0] = new Holder(); 
valueHolders[0].Value = someValue; 

它工作正常。有沒有辦法像struct類型那樣一次創建valueHolders中的所有元素。

+0

可變結構是邪惡的。 – SLaks

+0

你確定公共持有人()甚至編譯? –

回答

0

C#需要顯式初始化引用類型。這可以很容易地在一個循環中完成:

Holder[] valueHolders = new Holder[n]; 
for (int i = 0; i < n; i++) 
{ 
    valueHolders[i] = new Holder(); 
} 

您可以藉此一點,並在你的類像這樣暴露了一個靜態方法:

public class Holder { 
    static public Holder[] InitArray(ulong length) { 
     Holder[] holders = new Holder[length]; 
     for (ulong i = 0; i < length; i++) { 
      holders[i] = new Holder; 
     } 
     return holders; 
    } 
} 

... 

var valueHolders = Holder.InitArray(n); 

你可以把它進一步用通用擴展方法:

public static class ArrayInitializer 
{ 
    public static T[] Init<T>(this T[] array) where T : new() 
    { 
     for(int i = 0; i < array.Length; i++) 
     { 
      array[i] = new T(); 
     } 
     return array; 
    } 
} 

... 

var valueHolders = new Holder[n].Init(); 
+0

謝謝,但我期待着與此不同的東西。 – AksharRoop

+0

你在期待什麼?你的問題的答案是:「不,沒有辦法像使用結構一樣來完成它,因爲對象的工作方式不同,而且這裏有一個方法可以實現。」 –

+0

@丹尼斯,正確的名詞是「引用類型」,而不是「對象」。這是因爲'struct'也是'object's(即它們從'object'繼承而來)。 – svick