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

时间:2017-01-29 21:57:12

标签: c# variables enums static

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

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

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

任何人都可以向我解释一下enum类型有什么特别之处,它允许它在不被称为静态的情况下工作吗?实际上,当向声明添加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];
        }
    }

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

4 个答案:

答案 0 :(得分:0)

没有问题,因为您永远不会访问Unit类型的非静态成员。

您只访问枚举成员,在这种情况下,枚举成员与常量不同。

以这种方式考虑:

  • 使用这样的枚举成员时,编译器确切地知道要选择哪个值,因为只有一个(定义基本上是静态的)。
  • 当尝试访问非静态成员变量时,编译器不知道您要访问哪个实例/对象的成员。

这是一个不同的类,可以更好地形象化:

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

    Gender gender;
    string name;
}

您可以随时使用Gender.Man和其他人,因为它只是一个定义,而不是Person的成员或财产。

您可以随时询问&#34;什么是Man?&#34;你知道答案,因为它只是一个定义。

但是现在试着询问&#34;什么是gender?&#34;您无法在不知道哪个Person的情况下回答这个问题,因为它是非静态成员变量。

答案 1 :(得分:0)

那是因为Enum是一种只是枚举常量的类型。

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

 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;

答案 2 :(得分:0)

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

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

单位不是变量也不是方法,它是一种类型,因此它不会绑定到特定实例。

枚举在类中定义的事实使它nested意味着你必须引用包含它的类才能使用它,但它并没有改变它的含义。没有绑定任何实例。

答案 3 :(得分:0)

请记住,conversions是一个包含对象的实例的静态变量。因此,

{ Unit.psi, 6894.76 },
{ Unit.psf, 47.9 },
{ Unit.mPa, 0.001 },
// ...

只是字典中的普通条目。

有过度简化的风险,enumtype,而不是任何实际的实例。 (注意:enum的&#34;基础&#34;类型是int)。类型不需要是静态的,以便在静态变量和方法中使用;例如,您的静态变量的类型为Dictionary,绝对静态。

如果它有用,当你执行类似Unit.mPa之类的操作时,请将其视为常量,而不是检索实际实例。实际上,documentation将枚举定义为&#34; ...一个由称为枚举器列表的一组命名常量组成的不同类型。&#34;

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

希望这能澄清一些事情(如果没有请随意评论,以便我可以编辑)。