2012-01-14 65 views
1

我知道這有點假設,因爲我沒有循環這個,它只在程序運行中出現一次或兩次,所以它只會是一個完全不可思議的時間量,但我想知道是否有一個這些比其他更好,或者根本不重要,因爲優化器會優化掉更糟糕的代碼。以上哪兩項效率更高?

我有這個類:

class FOO_Data 
{ 
    private string description, url; 
    private bool editable; 

    public FOO_Data(string description, string url, bool editable) 
    { 
     this.description = description; 
     this.url = url; 
     this.editable = editable; 
    } 

    public string Description { get { return description; } set { description = value; } } 
    public string URL { get { return url; } set { url = value; } } 
    public bool Editable { get { return editable; } set { editable = value; } } 
} 

在我的代碼中一些其他的問題,我需要在這個類的一個數組編輯這個類的一個實例。

哪一個更好?這一個:

array[index] = new FOO_Data(data.Description, data.URL, System.Convert.ToBoolean(data.Editable)); 

或者這一個:

array[index].Description = data.Description; 
array[index].Editable = Convert.ToBoolean(data.Editable); 
array[index].URL = data.URL; 

我會傾向於第一,但我不是很肯定。我希望你能提供任何見解。

非常感謝!

+0

非常感謝您的洞察力。非常感謝:) – niemiro 2012-01-14 14:24:36

+2

在一個循環中運行兩個場景,使用千萬次迭代並用秒錶計時。我會假設唯一的區別是第二個不必爲堆棧值在堆棧上分配新的空間。在第一個中,舊值被銷燬並重新創建,這意味着GC需要清理。(字符串將被銷燬並重新創建,無論如何) – 2012-01-14 14:25:56

回答

3

如果array[index]null,試圖訪問成員的第二位代碼將拋出NullReferenceException

這不可能發生在代碼的第一位,在那裏你指定一個新構建的對象FOO_Data

就性能而言,如果由於對象創建是一個非常輕的過程,您確實不會看到任何差異。

+0

非常感謝您的回覆。我沒有想過那個空案。有趣...你的迴應非常感謝。我打算接受這10分鐘後的答案再次感謝:) – niemiro 2012-01-14 14:26:49

2

我會選擇第二種方法,稍作修改。

var foo = array[index]; 
if(foo == null) 
{ 
    foo = new Foo_Data(); 
    array[index] = foo; 
} 
foo.Description = data.Description; 
foo.Editable = ... 
... 
3

首先,如果你.Net的3個工作或更新,你可以使用自動實現的屬性:除了

public string Description { get; set;} 

與支持字段屬性。

關於哪一個更好,我認爲這是語法糖,但我更喜歡第一種方法,因爲封裝初始化,也在第二種方法中存在空例外的可能性。實際上你不應該考慮位優化。