收录日期:2020/09/26 21:40:03 时间:2016/06/03 14:42:35 标签:C#
现摘抄MSDN示例如下,请注意中文注释处的疑问

注释1:这里算赋值?或作其它的理解,但为什么有按位或运算符“|”。如果是赋值,那Seasons.Winter 为什么不为4,而是winter?

注释2:这里的表达式和上面差不多,是不是说一个键可以对应多个键值?

注释3:既然e.Value 和 seasons[i] 的值都是字符串值,又怎么可以按位与运算?另外这个if块说明了什么,也就是说 ((Seasons)e.Value & seasons[i]) > 0 能说明什么问题

恭迎各位解答,老夫多谢啦!!!

using System;
using System.Collections;

// A traditional enumeration of some root vegetables.
public enum SomeRootVegetables
{
    HorseRadish,
    Radish,
    Turnip
}

// A bit field or flag enumeration of harvesting seasons.
[Flags]
public enum Seasons
{
    None = 0,
    Summer = 1,
    Autumn = 2,
    Winter = 4,
    Spring = 8,
    All = Summer | Autumn | Winter | Spring // 注释1
}

// Entry point.
public class EnumerationSample
{
    public static void Main()
    {
        // Hash table of when vegetables are available.
        Hashtable AvailableIn = new Hashtable();

        AvailableIn[SomeRootVegetables.HorseRadish] = Seasons.All;
        AvailableIn[SomeRootVegetables.Radish] = Seasons.Spring;
        AvailableIn[SomeRootVegetables.Turnip] = Seasons.Spring | 
            Seasons.Autumn; // 注释2

        // Array of the seasons, using the enumeration.
        Seasons[] seasons = new Seasons[] { Seasons.Winter, Seasons.Spring, 
            Seasons.Summer, Seasons.Autumn };

        // Print information of what vegetables are available each season.
        for (int i = 0; i < seasons.Length; i++)
        {
            Console.WriteLine("\r\nThe following root vegetables are 
                harvested in " + seasons[i].ToString("G") + ":");
            foreach (DictionaryEntry e in AvailableIn)
            {
                // A bitwise comparison.
                if (((Seasons)e.Value & seasons[i]) > 0) //注释3
                    Console.WriteLine("\t" + 
                        ((SomeRootVegetables)e.Key).ToString("G"));
            }
        }
    }
}


此程序的输出如下所示。
The following root vegetables are harvested in Summer:
HorseRadish
The following root vegetables are harvested in Autumn:
Turnip
HorseRadish
The following root vegetables are harvested in Winter:
HorseRadish
The following root vegetables are harvested in Spring:
Turnip
Radish
HorseRadish
up!
注释1: 我觉得可以理解成赋值,因为枚举类型本质上是整型,关于"Seasons.Winter 为什么不为4,而是winter?"这个结论是根据直接输出Seasons.Winter的结果下的吧,如果输出(int)Season.Winter就是4了

注释2:   不是  说一个键可以对应多个键值, Seasons.Spring | Seasons.Autumn 意思是 春天或秋天,就像枚举定义里面的 All(春夏秋冬都包括了)

注释3:  还是这句话:枚举类型本质上是整型, ((Seasons)e.Value & seasons[i]) > 0 是判断结果是否是春夏秋冬中的季节, 因为还存在一个 None

谢谢 leonchenjian(小黑) 的解答,我是新手,很多地方还是看不明白,能否详细解释一下?
可能我连枚举的基本概念都没弄清楚,如果你手头有枚举的详细论述,不妨贴给我,希望大家帮我UP!谢谢

注释1: 为什么讲“枚举类型本质上是整型?”并且Season.Winter值可以转换成整型

注释2: 我不懂表达式 Seasons.Spring | Seasons.Autumn 到底是什么意思?一字符串?

注释3:  还是不明白
so upset~! up again
up!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
如果用C++来定义一个枚举变量,会发现直接输出是整数,并且C++里面的枚举可以进行任何整数运算
注释1:这里算赋值?或作其它的理解,但为什么有按位或运算符“|”。如果是赋值,那Seasons.Winter 为什么不为4,而是winter?

Seasons.Winter 就是 4,Seasons.Winter == 4这个表达式的值为真。

你可以看成从Seasons.Winter到int存在一个隐式类型转换,

所以,All = Summer | Autumn | Winter | Spring 其实是把Summer、Autumn、Winter、Spring全部隐式类型转换成int,表达式成了 1 | 2 | 4 | 8 = 15,其实这个表达式就是All = 15;




注释2:这里的表达式和上面差不多,是不是说一个键可以对应多个键值?

没错,Flags特性标识多值枚举。



注释3:既然e.Value 和 seasons[i] 的值都是字符串值,又怎么可以按位与运算?另外这个if块说明了什么,也就是说 ((Seasons)e.Value & seasons[i]) > 0 能说明什么问题

错!e.Value和seasons[i]都不是字符串,都是枚举值,而前面说了枚举值存在到int的隐式类型转换,int可以按位与运算。

按位与运算经常用作掩码计算,简而言之,这里是判断e.Value是否包含seasons[i]季节。
哦,谢谢,我刚把上面的代码运行一下,输出的season和上面的顺序不一致,应该先是winter吧?微软也是粗心哦。
注释1:我不明白表达式Seasons.Winter输出的是“Winter”,“Winter”是一字符串对吧?字符串怎么可以隐式的转换成int型呢

另外ToString("G")这个"G"是作什么用的?,居然没报错
为什么说((Seasons)e.Value & seasons[i]) > 0 ,说明了e.Value包含了seasons[i]季节?我知道这里进行了布尔运算,但。。。。。。

楼上的我看不大懂,谁帮我打通任督二脉
我不明白表达式Seasons.Winter输出的是“Winter”,“Winter”是一字符串对吧?字符串怎么可以隐式的转换成int型呢


只不过是Season.Winter.ToString()方法输出"Winter"罢了,怎么能说Season.Winter是字符串呢?概念不清。

所有类型的对象在输出的时候多半都是调用他们的ToString方法,如int i = 1;的ToString返回"1",那int不也是字符串了?



"G"是格式化字符串,表明输出格式。多翻翻文档。。。。




最后一个问题就必须你自己去看书了。
“G”或“g” 如果 value 等于某个已命名的枚举常数,则返回该常数的名称;否则返回 value 的等效十进制数。 
例如,假定唯一的枚举常数命名为“Red”,其值为 1。如果将 value 指定为 1,则此格式返回“Red”。然而,如果将 value 指定为 2,则此格式返回“2”。

- 或 -

如果将 FlagsAttribute 自定义属性应用于枚举,则 value 将被视为位域,该位域包含一个或多个由一位或多位组成的标志。

如果 value 等于已命名的枚举常数的组合,则返回用分隔符分隔的这些常数名称的列表。将在 value 中搜索标志,从具有最大值的标志到具有最小值的标志进行搜索。对于与 value 中的位域相对应的每个标志,常数的名称连接到用分隔符分隔的列表。则将不再考虑该标记的值,而继续搜索下一个标志。

如果 value 不等于已命名的枚举常数的组合,则返回 value 的等效十进制数。
 
“X”或“x” 以十六进制形式表示 value(不带前导“0x”)。 
“D”或“d” 以十进制形式表示 value。 
“F”或“f” 对于“G”或“g”执行的行为是相同的,只是在 Enum 声明中不需要FlagsAttribute。 

请教各位大侠:如何把自己的Java程序打包后放到Domino中,该包的类及成员函数可以直接调用? 大哥门能不能提供《C++沉思录》E版的?谢谢了 如何用asp语言实现图片上传到数据库,和把图片从库中显示出来! 在Access中动态创建链接表的小问题 如何修改showmessage提示对话框中的标题栏 怎样下载文件到客户端?内含代码!在线等待 今天生日 散分!! 不小心把2000 server网上邻居中的“邻近的计算机”给删掉了,请问怎么恢复这个文件夹! 局部变量如果未进行初始化,是不是默认是0、nil、空串等值?抑或是一个不确定的任意值? 我要离婚了 .net组件中IDbCommand接口的实现,感觉很奇怪 如何使用JS动态的加入或删除Text输入框和表格的行? 水晶报表的这个小功能我不懂,请提示? TCP方式下send函数的问题 今天生日 散分!! 关于struts中多个模块之间的调用 怎样用asp.net对数据库中的内容进行修改和删除操做!个位指点一下!!! 编译时出现奇怪问题 怎么样才能得到端口 外键信息存在哪个表中?user_objects表中没有? C++::救命! OLE中用PP如何取消自带的菜单 如何知道rtf域 附件的 文件个数? 多了一个三角!散分!!! 大家帮我来看看这个问题!!!!! webRequest的Post方法发送xml串时,提示错误:(500) window.parent.leftFrame.cols(30%,30%,30%)代表什么啊 求MYSQL数据库备份和还原程序! 谁能发我份IBM db2 7的jdbc?? 请问:在 编译.cpp文件时没有错误,在构建.exe出现错误。