【问题标题】:Should I use a Struct instead of a lightweight data class for my Linq2Sql data?我应该为我的 Linq2Sql 数据使用 Struct 而不是轻量级数据类吗?
【发布时间】:2009-09-11 19:06:31
【问题描述】:

我经常使用 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);
}

【问题讨论】:

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


    【解决方案1】:

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

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

    假设Entity 是一个结构:

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

    【讨论】:

    • 哇,我不知道,我需要阅读更多关于结构的内容,谢谢
    【解决方案2】:

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

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

    【讨论】:

    • 啊,也许,老实说,我已经推迟了很多关于 struct 的学习,我正在努力学习它们,这就是让我来到这里的原因。我只是将结构视为一个轻量级的对象,它只存储数据并且没有任何方法,这正是我的数据类正在做的事情。
    猜你喜欢
    • 2014-07-03
    • 1970-01-01
    • 2010-12-04
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多