C# 类枚举结构
可能重复:C# 类枚举结构,c#,struct,enums,C#,Struct,Enums,可能重复: 示例代码: public struct State { private readonly byte state; private State (byte pState) { state = pState; } // property... public static State StateOne { get { return new State (1
示例代码:
public struct State
{
private readonly byte state;
private State (byte pState)
{
state = pState;
}
// property...
public static State StateOne
{
get
{
return new State (1);
}
}
// or...
public static readonly State StateOne = new State (1);
}
我应该使用属性还是字段?在本例中,性能并不重要。除非您将该属性用作新实例的工厂,否则您应该将返回的“新状态(1)”缓存在私有成员中,并在第一次调用后返回该状态,这将初始化它。(单身人士)
进一步澄清:
所写内容的不同之处在于,字段始终指向同一实例,而属性始终创建并返回新实例,因此属性始终创建新实例,这可能不是您想要的,并且可能是一个性能问题,具体取决于情况。除非您将该属性用作新实例的工厂,否则您应该将返回的“新状态(1)”缓存在私有成员中,并在将初始化它的第一次调用后返回该属性。(单身人士)
进一步澄清:
您所写内容的不同之处在于,字段始终指向同一实例,而属性始终创建并返回新实例,因此属性不断创建新实例,这可能不是您想要的,并且可能是性能问题,具体取决于具体情况。在我看来,它是字段,因为它是您需要的最小值,并且可能更可读。但实际上,在给定传递值语义的情况下,在这个结构中呈现的这种琐碎的情况中并没有实际的区别
特别是-属性的参数,带有缓存的本地字段(如这里的另一个答案所示),由于引用相等,因此完全无效,因为根据其定义,值类型永远不能是引用相等的。在我看来,它是字段,因为它是您需要的最小值,并且可能更可读。但实际上,在给定传递值语义的情况下,在这个结构中呈现的这种琐碎的情况中并没有实际的区别
特别是,由于引用相等,带有缓存本地字段的属性参数(如这里的另一个答案)完全无效,因为根据其定义,值类型永远不能是引用相等的。我希望在这里使用字段而不是属性。看看MS guys是如何完成类似工作的:
//String.cs
public int Length { get; } //string has a property named Length
public static string Empty = ... //string has a public field named Empty
试着想想“string有一个公共属性Empty”,不,Empty不是string的属性。你的情况几乎一样。“State有一个名为One的属性”听起来很奇怪。我想在这里使用字段而不是属性。看看MS guys是如何完成类似工作的:
//String.cs
public int Length { get; } //string has a property named Length
public static string Empty = ... //string has a public field named Empty
试着想想“string有一个公共属性Empty”,不,Empty不是string的属性。你的情况几乎一样。“State有一个名为One的属性”听起来很奇怪。如果这是一个结构而不是一个类,我为什么要缓存?没有什么区别-作为一个结构,值是通过值传递的。@zgnilec就像我说的,这取决于你想要什么,要继续创建实例还是返回相同的实例并保留对其的引用?结构不是引用。您可以将它们框起来,但每次这样做都会得到一个新的引用。@AndrasZoltan所以您要说的是(在他的例子中)通过多次访问字段,这与访问属性中的getter是一样的?如果这是一个结构而不是一个类,为什么我要缓存?没有什么区别-作为一个结构,值是通过值传递的。@zgnilec就像我说的,这取决于你想要什么,要继续创建实例还是返回相同的实例并保留对其的引用?结构不是引用。您可以将它们框起来,但每次这样做都会得到一个新的引用。@AndrasZoltan您的意思是(在他的示例中)通过多次访问字段,它与访问属性中的getter是一样的?