我应该为我的Linq2Sql数据使用Struct而不是轻量级数据类吗?

时间:2009-09-11 19:06:32

标签: c# .net linq-to-sql struct

我经常使用linq2sql生成的类,并创建一个简单的数据类,如此

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);
}

2 个答案:

答案 0 :(得分:7)

我选择class。可变的struct很少是好事。如果你没有看到使用结构而不是类的明显优势,你应该避免它。

具体来说,在您的情况下,使用struct会使方法更难修改实例的内容(例如,从JSON反序列化并填充一些属性;您必须使用ref所有时间)。

假设Entity是一个结构:

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

答案 1 :(得分:5)

我认为你误解了结构的意义。你说“它或多或少是结构的定义”,但你没有提到值类型语义(复制)一次 - 和那是结构的定义,IMO 。无论有多少方法等都无关紧要 - 它是关于值或引用类型的语义。

正如迈赫达德所说,可变结构很少是好事。我更强烈地说:它们几乎总是邪恶的,并且会引起很难诊断的奇怪错误。只说不 - 根据我的经验,结构很少是正确的选择。它们用于基本数据类型,如数字,日期,字符,枚举等。