枚举类型
来源:互联网 发布:linux下端口扫描工具 编辑:程序博客网 时间:2024/06/10 02:21
枚举类型可是用Flags 标志,表示这些枚举类型可以作为位域(即一组标志)处理。
比如下面的枚举类型:
[Flags]
enum MultiHue : short
{
Black = 0,
Red = 1,
Green = 2,
Blue = 4
};
这里用 2 的幂(即 1、2、4、8 等)定义枚举常量。这意味着组合的枚举常量中的各个标志都不重叠。
但是,要注意的是:在当前程序中,如果你没有定义这些枚举类型的值,则默认系统给你的定义可不是 2 的幂,而是从0开始,每次累加1。
比如下面的代码:
class Program
{
static void Main(string[] args)
{
Console.WriteLine(MultiHue.Blue);
Console.WriteLine((int)MultiHue.Blue);
Console.ReadLine();
}
}
[Flags]
enum MultiHue : short
{
Black,
Red,
Green,
Blue
}
控制台打印出来的是 :
Blue
3
所以,到目前的结论是:在定义会位操做的枚举类型的时候,必须用 2 的幂(即 1、2、4、8 等)定义枚举常量。不可以不附值。
而如果你的这个枚举类型被 Web Service 作为一个方法的参数使用了。
在客户端VS2005 系统自动会给你的MultiHue 附值。
客户端会产生了下面的代码,而不管你服务器端定义的枚举数字值是多少。:
[System.FlagsAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")]
public enum MultiHue
{
Black = 1,
Red = 2,
Green = 4,
Blue = 8
};
注意,不论我们服务器段是否给 ,每个枚举类型附值,客户端VS2005替你产生的代码都是上述方式。
这时候你会发现,每个枚举类型的数字值可能会发生变化了。
原因就是 枚举类型的序列化是序列化成了文本,而不是数字。
由于客户端和服务器端没有数字的传递,当然客户端和服务器端的枚举项的值当然有很大的可能会不一样了。
所以这里的结论是:如果Web Service用到枚举类型,一定不要用枚举类型的数字值,因为服务器端和客户端会不一样。
参考:http://ikriv.com:8765/en/prog/info/dotnet/WebServices_and_Enums.html
综上所述。
如果你希望对枚举类型进行位操作,
比如注意以下两点:
1、在定义的时候,必须用 2 的幂(即 1、2、4、8 等)定义枚举常量。不可以不附值。
2、如果Web Service用到枚举类型,一定不要用枚举类型的数字值,因为服务器端和客户端会不一样。
再看一个稍稍复杂的例子,用上面的知识点,就可以解释后面的例子为啥会这样。
比如有这样一个Web Service。
[Flags]
public enum MultiHue
{
Black = 8,
Red = 1,
Green = 2,
Blue = 4
};
[WebMethod]
public MultiHue GetColor()
{
return MultiHue.Red | MultiHue.Green | MultiHue.Black;
}
客户端调用代码如下:
localhost.WebService ws = new Client.localhost.WebService();
localhost.MultiHue re = ws.GetColor();
Console.WriteLine(re);
Console.WriteLine((int)re);
Console.ReadLine();
这时候控制台显示的信息是:
Black, Red, Green
7
而这时候VS2005产生的客户端的MultiHue 枚举为:
[System.FlagsAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.42")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://tempuri.org/")]
public enum MultiHue {
/// <remarks/>
Black = 1,
/// <remarks/>
Red = 2,
/// <remarks/>
Green = 4,
/// <remarks/>
Blue = 8,
}
用我们前面提到的两个知识点,就可以解释为何会这样。
- 枚举类型
- 枚举类型
- 枚举类型
- 枚举类型
- 枚举类型
- 枚举类型
- 枚举类型
- 枚举类型
- 枚举类型
- 枚举类型
- 枚举类型
- 枚举类型
- 枚举类型
- 枚举类型
- 枚举类型
- 枚举类型
- 枚举类型
- 枚举类型
- 超越IT技术顾问,售前谈演讲之--演讲的姿态篇
- 中文分词
- 技术资料收藏:Windows系统文件中文详解
- 项目马上要投标
- 售前必看的五个故事
- 枚举类型
- 售前技术顾问之痛二 投标篇
- ORA-06401: NETCMN: invalid driver designator 的解决办法
- MS-SQL锁
- 如何用JDom读取XML文档(转载)
- 人脸识别
- 软件设计师考试
- 软件开发中的理想与现实(十二)——作坊的经理失业了
- (翻译)加入俱乐部吧