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; }
}
答案 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; }
请记住,编译器将所有这些都放在一边 初始化代码进入 构造函数(每个构造函数),和 因为没有默认值 构造函数,你不能这样做 初始化。
现在,对于有趣的部分..你通常 实例化这样的结构:“
答案 2 :(得分:1)
POCO和DTO不是一回事。
POCO是一个通常具有状态和行为的业务对象。
DTO是一个轻量级对象,用于在应用程序层之间传输状态。
我显然会使用POCO类和DTO类。