代码之家  ›  专栏  ›  技术社区  ›  Allen Rice 0x6A75616E

对于linq2sql数据,我应该使用结构而不是轻量级数据类吗?

  •  2
  • Allen Rice 0x6A75616E  · 技术社区  · 15 年前

    我经常使用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 回复  |  直到 15 年前
        1
  •  7
  •   Mehrdad Afshari    15 年前

    我愿意和你一起去 class . 易变的 struct 很少是好事。如果您没有看到使用结构而不是类的明显优势,那么应该避免使用它。

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

    假定 Entity 是一个结构:

    List<Entity> entities = ...;
    entities[0].Name = "Test"; // won't compile.
    
        2
  •  5
  •   Jon Skeet    15 年前

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

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