Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类枚举结构_C#_Struct_Enums - Fatal编程技术网

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是一样的?