为什么在静态方法中使用C#enum类型时不需要声明为静态?
这是我的第一篇文章,我期待着加入这个社区 最初我的代码编译有问题。我有一个静态方法,它调用字典中的转换值。经过一些研究,我了解到不仅方法需要声明为静态的,而且变量也需要声明为静态的 使我困惑的是,pressure.Unit类型的枚举不需要声明为static。我已经使用了一些其他变量,比如double和int-type,似乎它们也必须被称为static才能在static方法中使用 有谁能确切地向我解释一下枚举类型的特殊之处,它允许它在不被称为静态的情况下工作?实际上,在向声明中添加static时,也会产生编译错误 这是我的代码的快照:为什么在静态方法中使用C#enum类型时不需要声明为静态?,c#,variables,enums,static,C#,Variables,Enums,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就像一个变量双精度或字典。谢谢你的澄清。谢谢。当你说你仍然需要一个枚举实例时,我有点困惑。在我的代码中,我没有看到它的任何实例。或者它是在调用名称空间时自动实例化的吗?好吧,请将其视为枚举本身是自动静态的,只公开一个常量列表。我还有很多事要做