2009-09-11 58 views
2

我經常採取LINQ2SQL生成的類,並創建一個簡單的純數據類,像這樣我應該爲我的Linq2Sql數據使用Struct而不是輕量級數據類嗎?

public class myentity 
{ 
    public Guid id { get; set; } 
    public string name { get; set; } 
    // etc 
} 

我不把方法這些類和我主要是把它們作爲輔助類,所以我可以序列化到/來自json和其他類似的行爲,很容易。

我的問題是,我應該在這種情況下,而不是一個類使用結構?

將它作爲一個結構體,或多或少地定義一個結構體似乎是有意義的,但我不知道這裏的性能是否理想,因爲我經常將類從方法傳遞給方法,由於結構是值類型,因此不需要大量副本。

我經常做的另一件事是使用Linq2Sql的延遲執行來返回我自己的輕量版本的Linq2Sql類,而不是他們生成的。我不完全確定如果使用結構而不是類會在這裏產生一些不利的性能影響。

的我怎麼會使用延遲執行的例子是這樣的

public IEnumerable<myentity> getEntities() 
{ 
    return from me in MyEntity return new myentity() { id = me.id, name = me.name }; 
} 

public IEnumerable<myentity> getEntitiesThatStartWith(string s) 
{ 
    return from me in getEntities() where me.name.StartsWith(s); 
} 

回答

7

我會用class去。一個可變的struct很少是一件好事。如果你沒有看到使用結構而不是類的明顯優勢,你應該避免它。

具體而言,在你的情況下,使用struct會使修改實例內容的方法變得更加困難(例如,從JSON反序列化並填充一些屬性;你必須始終使用ref)。

假設Entity是一個結構:

List<Entity> entities = ...; 
entities[0].Name = "Test"; // won't compile. 
+0

哇,我不知道,我需要更多地閱讀ALOT更多的結構,謝謝 – 2009-09-11 19:22:14

5

我認爲你誤解結構的點。你說「這或多或少是一個結構的定義」,但你沒有提到值類型語義(複製)一次 - 和這就是結構,IMO的定義。不管有多少種方法,等等 - 都是關於值或引用類型的語義。

正如Mehrdad所說,可變結構很少是一件好事。我更強烈地說:它們幾乎總是邪惡的,並且會造成難以診斷的怪異錯誤。只是說不 - 結構很少是我的經驗中的正確選擇。他們是基本的數據類型,如數字,日期,字符,枚舉等

+0

啊,大概,我會說實話,我我推遲了很多關於struct的學習,我試圖學習它們,那是什麼讓我在這裏。我只是將結構看作只存儲數據並且沒有任何方法的輕量級對象,這正是我的數據類正在做的事情。 – 2009-09-11 19:17:49

相關問題