我正在构建一个有趣的小应用程序来确定我是否应该骑自行车上班。
我想测试一下是下雨还是雷雨。
public enum WeatherType : byte
{ Sunny = 0, Cloudy = 1, Thunderstorm = 2, Raining = 4, Snowing = 8, MostlyCloudy = 16 }
我想我可以做这样的事情:
WeatherType _badWeatherTypes = WeatherType.Thunderstorm | WeatherType.Raining;
if(currentWeather.Type == _badWeatherTypes)
{
return false;//don't bike
}
但这不起作用,因为 _badWeatherTypes 是两种类型的组合。我想将它们分开,因为这应该是一种学习经历,并且将其分开在其他情况下可能会很有用(即,发票未付款原因等......)。
我也不想这样做:(这将消除为多人配置的能力)
if(WeatherType.Thunderstorm)
{
return false; //don't bike
}
etc...
您当前的代码会说明是否是exactly“下雨打雷”。要查明是否“下雨、打雷,可能还有其他情况”,您需要:
if ((currentWeather.Type & _badWeatherTypes) == _badWeatherTypes)
判断是否“下雨”or雷鸣般的,可能还有其他”你需要:
if ((currentWeather.Type & _badWeatherTypes) != 0)
编辑(为了完整性):
最好使用FlagsAttribute
,即用[Flags]
。对于按位逻辑来说,这不是必需的,但会影响如何ToString()
行为。 C# 编译器忽略此属性(至少目前;C# 3.0 规范没有提及它),但对于作为有效标志的枚举来说通常是一个好主意,并且它记录了该类型的预期用途。同时,约定是当您使用标志时,您将枚举名称复数 - 因此您将其更改为WeatherTypes
(因为任何实际值实际上都是 0 种或多种天气类型)。
还值得思考“阳光明媚”的真正含义。目前它的值为 0,这意味着它不存在其他所有内容;你不可能同时晴天和下雨(当然,这在物理上是可能的)。请不要编写禁止彩虹的代码! ;) 另一方面,如果在您的实际用例中您确实想要一个意味着“不存在所有其他值”的值,那么您就可以了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)