这里有许多问题涉及C#中Structs和Classes之间的差异,以及何时使用其中一个.(一句话答案:如果你需要价值语义,请使用结构.)有很多关于如何选择其中一种的指导方针,其中大部分归结为:除非你满足这些特定要求,否则使用一个类,然后使用结构.
这一切都对我有意义.
但是,我似乎无法找到任何在系统中使用结构的人的现实例子.我是(半)新的C#,我很难想象结构是真正正确的选择的具体情况(至少,我还没有遇到过.)
所以,我转向SO世界大脑.在某些情况下,您实际在系统中使用结构的情况下,哪个类不起作用?
Gav*_*n H 20
好吧,一个班级仍然适用于它,但我能想到的一个例子就像一个点.假设它是x和y值,您可以使用结构.
struct Point {
int x;
int y;
}
Run Code Online (Sandbox Code Playgroud)
在我看来,我宁愿有一个更简单的一对整数表示,而不是在实际实体没有真正具有太多(或任何)行为的情况下定义使用具有实例化的类.
Sta*_* R. 17
我使用结构来表示地理位置
struct LatLng
{
public decimal Lattitude
{
get;
set;
}
public decimal Longitude
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
这表示单个实体,例如我可以将2个LatLng一起添加或在此单个实体上执行其他操作.
struct类型适用于表示轻量级对象,如Point,Rectangle和Color.尽管可以将点表示为类,但在某些情况下结构更有效.例如,如果声明1000个Point对象的数组,则将为引用每个对象分配额外的内存.在这种情况下,结构更便宜.
此外,如果您查看基本类型Int32,decimal,double ..etc,您会注意到它们都是结构体,这允许它们是值类型,同时允许它们实现某些关键接口.
Money结构可能是最常见的结构之一,但电话号码或地址也很常见.
public struct Money
{
public string Currency { get; set; }
public double Amount { get; set; }
}
public struct PhoneNumber
{
public int Extension { get; set; }
public int RegionCode { get; set; }
//... etc.
}
public struct FullName
{
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
请记住,虽然在.NET中,结构的内存占用量不应大于16字节,因为如果它们变大,CLR必须分配额外的内存.
另外,因为结构在堆栈上"活动"(而不是作为引用类型的堆),如果需要实例化许多相同类型的对象,可以考虑使用结构.
典型的例子是框架nullable types,例如int?.这些使用结构,因此它们保留了int的值语义,但提供了一种方法,使它们无需装箱就可以将它们转换为引用类型.
如果您不想通过引用传递某些内容,则可以使用结构.假设您有一个数据集合,或者您希望按值传递的对象(即,您传递给它的任何东西都使用它自己的唯一副本,而不是对原始版本的引用)那么struct是正确的类型使用.