枚举类型

来源:互联网 发布: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,
    }
用我们前面提到的两个知识点,就可以解释为何会这样。