Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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#enum类型时不需要声明为静态?_C#_Variables_Enums_Static - Fatal编程技术网

为什么在静态方法中使用C#enum类型时不需要声明为静态?

为什么在静态方法中使用C#enum类型时不需要声明为静态?,c#,variables,enums,static,C#,Variables,Enums,Static,这是我的第一篇文章,我期待着加入这个社区 最初我的代码编译有问题。我有一个静态方法,它调用字典中的转换值。经过一些研究,我了解到不仅方法需要声明为静态的,而且变量也需要声明为静态的 使我困惑的是,pressure.Unit类型的枚举不需要声明为static。我已经使用了一些其他变量,比如double和int-type,似乎它们也必须被称为static才能在static方法中使用 有谁能确切地向我解释一下枚举类型的特殊之处,它允许它在不被称为静态的情况下工作?实际上,在向声明中添加static时,

这是我的第一篇文章,我期待着加入这个社区

最初我的代码编译有问题。我有一个静态方法,它调用字典中的转换值。经过一些研究,我了解到不仅方法需要声明为静态的,而且变量也需要声明为静态的

使我困惑的是,pressure.Unit类型的枚举不需要声明为static。我已经使用了一些其他变量,比如double和int-type,似乎它们也必须被称为static才能在static方法中使用

有谁能确切地向我解释一下枚举类型的特殊之处,它允许它在不被称为静态的情况下工作?实际上,在向声明中添加static时,也会产生编译错误

这是我的代码的快照:

public class Pressure
    {
        public enum Unit
        {
            psi,
            psf,

            mPa,
            Pa,
            hPa,
            kPa,
            MPa,

            mmH2O,
            mH2O,
            inH2O,
            ftH2O,

            mmHg,
            inHg,

            atm,
            bar,

            kgcm2            
        }


        // Conversions for each unit to/from Pa
        private static readonly Dictionary<Unit, double> conversions = new Dictionary<Unit, double>()
        {
            { Unit.psi, 6894.76 },
            { Unit.psf, 47.9 },

            { Unit.mPa, 0.001 },
            { Unit.Pa, 1 },
            { Unit.hPa, 100 },
            { Unit.kPa, 1000 },
            { Unit.MPa, 1000000 },

            { Unit.mmH2O, 9.80665 },
            { Unit.mH2O, 980.665 },
            { Unit.inH2O, 248.84 },
            { Unit.ftH2O, 2986.08 },

            { Unit.mmHg, 133.322 },
            { Unit.inHg, 3386.39 },

            { Unit.atm, 101325 },
            { Unit.bar, 100 },

            { Unit.kgcm2,  98068} 
        };


        /// <summary>
        /// Converts pressure between engineering units.
        /// </summary>
        /// <param name="value">Pressure value</param>
        /// <param name="unitIn">Pressure unit of input value</param>
        /// <param name="unitOut">Pressure unit of returned value</param>
        /// <returns>Pressure value in the output pressure unit.</returns>
        public static double Convert(double value, Unit unitIn, Unit unitOut)
        {
            return value * conversions[unitIn] / conversions[unitOut];
        }
    }
公共课压力
{
公共枚举单元
{
psi,
psf,
兆帕,
帕
hPa,
千帕,
兆帕,
mmH2O,
mH2O,
inH2O,
ftH2O,
毫米汞柱,
嗯,
自动取款机,
酒吧,
kgcm2
}
//每台机组与Pa之间的换算
私有静态只读字典转换=新建字典()
{
{Unit.psi,6894.76},
{Unit.psf,47.9},
{Unit.mPa,0.001},
{Unit.Pa,1},
{Unit.hPa,100},
{Unit.kPa,1000},
{Unit.MPa,1000000},
{Unit.mmH2O,9.80665},
{Unit.mH2O,980.665},
{Unit.inH2O,248.84},
{Unit.ftH2O,2986.08},
{Unit.mmHg,133.322},
{Unit.inHg,3386.39},
{Unit.atm,101325},
{Unit.bar,100},
{Unit.kgcm2,98068}
};
/// 
///在工程单位之间转换压力。
/// 
///压力值
///输入值的压力单位
///返回值的压力单位
///输出压力单位中的压力值。
公共静态双转换(双值、单位unitIn、单位unitOut)
{
返回值*conversions[unitIn]/conversions[unitOut];
}
}

我目前正在使用Visual Studio 14.0.25431.01 Update 3。

没有问题,因为您从未访问类型为
单元的非静态成员

您只访问枚举成员,在本例中,枚举成员与常量并没有什么区别

这样考虑:

  • 当使用这样的枚举成员时,编译器确切地知道选择哪个值,因为只有一个(定义基本上是静态的)
  • 尝试访问非静态成员变量时,编译器将不知道要访问哪个实例/对象的成员
下面是一个不同的类,可以更好地将其可视化:

class Person {
    enum Gender {
        Man, Woman, Thing
    };

    Gender gender;
    string name;
}
您可以随时使用
Gender.Man
和其他,因为它只是一个定义,而不是
人的成员或属性

在任何时候你都可以问“什么是
人”
,你知道答案,因为这只是一个定义


但是现在试着问一下“什么是
性别”
?“如果不知道是哪个
人,你就无法回答这个问题,因为它是一个非静态成员变量。

这是因为枚举是一种仅是常量枚举的类型

要使用枚举,您仍然需要它的一个实例,在这种情况下,该实例可以是静态的

 public enum Unit
    {
        psi,
        psf,

        mPa,
        Pa,
        hPa,
        kPa,
        MPa,

        mmH2O,
        mH2O,
        inH2O,
        ftH2O,

        mmHg,
        inHg,

        atm,
        bar,

        kgcm2
    }

    public static Unit MyUnit { get; set; } = Unit.hPa;

转换是一个变量,如果要从静态方法调用它,则必须将其声明为静态

原因是非静态变量/方法属于类的某个实例,而静态变量/方法不属于,它们只是类的静态部分(即,您可以在不实例化类的情况下调用它们)

Unit既不是变量也不是方法,它是一种类型,因此它无论如何都不会绑定到特定实例


枚举是在类中定义的,这意味着您必须引用包含它的类才能使用它,但它不会改变它未绑定到任何实例的事实。

请记住,
转换
是包含对象实例的静态变量。因此,

{ Unit.psi, 6894.76 },
{ Unit.psf, 47.9 },
{ Unit.mPa, 0.001 },
// ...
只是字典里的普通词条

冒着过分简化的风险,
enum
是一个实例,而不是任何东西的实际实例。(注意:
enum
的“底层”类型是
int
)。在静态变量和方法中使用类型不需要是静态的;例如,静态变量的类型为
Dictionary
,它肯定不是静态的

如果它有用,当您执行类似于
Unit.mPa
的操作时,请将其视为常量,而不是检索实际实例。事实上,将枚举定义为“…由一组名为枚举器列表的命名常量组成的独特类型。”

我的观点是,这里唯一有意义的是静态变量和方法。显然,如果方法是静态的,那么变量也必须是静态的(尽管反过来不是真的;您可以从实例方法调用静态变量)


希望这能澄清一些问题(如果没有,请随时发表评论,以便我可以编辑)。

谢谢,这很有意义。我的困惑是,我认为enum就像一个变量双精度或字典。谢谢你的澄清。谢谢。当你说你仍然需要一个枚举实例时,我有点困惑。在我的代码中,我没有看到它的任何实例。或者它是在调用名称空间时自动实例化的吗?好吧,请将其视为枚举本身是自动静态的,只公开一个常量列表。我还有很多事要做