在构建POCO或简单DTO时,我可以使用结构而不是类吗?

时间:2010-09-27 18:15:41

标签: c#

 public class Customer
    {
        public int CustomerId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    public struct Customer
    {
        public int CustomerId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

3 个答案:

答案 0 :(得分:13)

您的第二个代码段是可变结构。这是一个非常糟糕的主意,IMO - 它们在各种不同的情况下表现得很奇怪,因为当你可能没想到它们时,可以复制价值。

你当然可以创建不可变的结构,有时候这是合适的 - 但我个人觉得通常引用类型行为更自然。对于结构体,您还需要担心无论您使用何种构造函数,始终可以将变量设置为默认值 - 因此对于数字类型,字段将为零,对于引用类型,字段将为零。这对于必须处理无处不在的对象的可能性,而对于类,您可以向构造函数(或工厂方法)添加适当的验证,以确保您唯一需要担心的是空引用。

效率论证最终变得棘手,因为双方都有利弊,具体取决于你对对象做了什么。

缩短答案(太迟了?) - 我会默认使用类;为自然个体值(“即时”或“整数”)保存值类型。

答案 1 :(得分:1)

以下是结构和类之间差异的链接:

http://msdn.microsoft.com/en-us/library/aa288471%28VS.71%29.aspx

它声称结构更有效但我认为通过ref传递更有效,然后传递大数据的值。

这可能是个问题:

  

“虽然CLR允许它,但C#可以   不允许结构具有默认值   无参数构造函数。原因   对于值类型,编译器就是这样   默认情况下,既不生成默认值   构造函数,它们也不生成   调用默认构造函数。所以,   即使你碰巧定义了一个   默认构造函数,它不会   打电话,这只会让你感到困惑。   为避免此类问题,C#   编译器不允许定义a   用户的默认构造函数。和   因为它不会生成默认值   构造函数,你无法初始化   定义它们时的字段,如:   崩

     

struct MyWrongFoo {         int x = 1; }

     

请记住,编译器将所有这些都放在一边   初始化代码进入   构造函数(每个构造函数),和   因为没有默认值   构造函数,你不能这样做   初始化。

     

现在,对于有趣的部分..你通常   实例化这样的结构:“

http://www.codeproject.com/KB/cs/structs_in_csharp.aspx

答案 2 :(得分:1)

POCO和DTO不是一回事。

POCO是一个通常具有状态和行为的业务对象。

DTO是一个轻量级对象,用于在应用程序层之间传输状态

我显然会使用POCO类和DTO类。