我正在努力学习C#的文言文。当我读到一些文件时,我写了一个程序。但我不明白这个程序是怎么运作的。有人能帮我一下它的工作吗?
我在下面发布我的代码:
程序1 :
public partial class MainPage {
[Flags]
enum Days {
Monday,
Tuesday,
Wednesday,
Thursday,
Friday ,
Saturday,
Sunday
};
// Constructor
public MainPage() {
InitializeComponent();
Days holidays = Days.Sunday | Days.Saturday;
if ((Days.Sunday | holidays) == Days.Sunday) // This returns true. Why ?
MessageBox.Show("True");
else
MessageBox.Show("False");
}程序2 :
在这里,我在enum中赋值整数。
public partial class MainPage {
[Flags]
enum Days {
Monday = 1,
Tuesday = 2,
Wednesday = 5,
Thursday = 8,
Friday = 10,
Saturday = 3,
Sunday = 0
};
// Constructor
public MainPage() {
InitializeComponent();
Days holidays = Days.Sunday | Days.Saturday;
if ((Days.Sunday | holidays) == Days.Sunday) // Why this returns false ?
MessageBox.Show("True");
else
MessageBox.Show("False");
}在程序2中分配整数值后,if条件有什么不同?
发布于 2013-02-22 05:40:35
为了补充Jeremy的答案,考虑到他对天的第二个(和正确的)定义,二进制表示是:
0000 0001 Monday
0000 0010 Tuesday
0000 0100 Wednesday
0000 1000 Thursday
0001 0000 Saturday
0010 0000 Sunday接下来,执行以下操作
var holidays = Days.Sunday | Days.Saturday;这执行按位执行或:
0001 0000 Saturday
OR 0010 0000 Sunday
--------------------
0011 0000 Saturday | Sunday接下来,检查以下内容
((Days.Sunday | holidays) == Days.Sunday)这意味着:
0010 0000 Sunday
OR 0011 0000 holidays (= Saturday | Sunday)
---------
0011 0000 This is still holidays and does not equal Sundays如果要检查“假日”是否设置了星期日位,则应按位使用
((Days.Sunday及假日) == Days.Sunday)
0010 0000 Sunday
AND 0011 0000 holidays (= Saturday | Sunday)
---------
0010 0000 Sunday还请注意,最近版本的.NET框架内置了对标志检查的支持:
var holidays = Days.Sunday | Days.Saturday
holidays.HasFlag(Days.Sunday) //Will return true
holidays.HasFlag(Days.Monday) //Will return false您对Days enum的定义不应该与Flags一起使用,如果您将本文中的相同逻辑应用于定义中的值,您将得到一些非常奇怪的结果。
发布于 2013-02-22 05:23:37
默认情况下从0开始,如:
[Flags]
enum Days
{
Monday = 0,
Tuesday = 1,
Wednesday = 2,
Thursday = 3,
Friday = 4,
Saturday = 5,
Sunday = 6
};我想你和枚举上的位操作符搞混了。通常,为了使枚举与按位运算符一起工作,您可以这样声明它们:
[Flags]
enum Days
{
Monday = 0,
Tuesday = 1,
Wednesday = 2,
Thursday = 4,
Friday = 8,
Saturday = 16,
Sunday = 32
};发布于 2013-02-22 05:29:30
看起来,您混淆了按位操作|和逻辑运算符||。
在你最初的节目中,星期六分配5,周日分配6。
按位或:
8 4 2 1
0 1 0 1 = 5 Saturday
0 1 1 0 = 6 Sunday
-----------
0 1 1 1 = 7 Result (Holiday).按位或:
8 4 2 1
0 1 1 1 = 7 Holidays
0 1 1 0 = 6 Sunday
-----------
0 1 1 1 = 7 Result.但是,我运行了类似的代码:
using System;
namespace ConsoleApplication1
{
class Program
{
[Flags]
enum Days
{
Monday, //Default 0
Tuesday, //Default 1
Wednesday, //Default 3
Thursday, //Default 4
Friday, //Default 5
Saturday, //Default 6
Sunday //Default 7
};
static void Main(string[] args)
{
Days holidays = Days.Sunday | Days.Saturday;
if ((Days.Sunday | holidays) == Days.Sunday) // This returns true. Why ?
Console.WriteLine("True");
else
Console.WriteLine("False");
Console.ReadKey();
}
}
}结果:False (与您的示例不同)。
正如预期的那样,7不等于6。我的假设是,您的示例中缺少代码或错误类型的代码.。
如果使用得当,我强烈建议阅读FlagsAttribute应该如何工作,这涉及在位值(1、2、4、8、16、32)处创建枚举。
如果您的代码被纠正了,那么这可能更符合我认为您正在寻找的内容。
using System;
namespace ConsoleApplication1
{
class Program
{
[Flags]
enum Days
{
Monday = 1,
Tuesday = 2,
Wednesday = 4,
Thursday = 8,
Friday = 16,
Saturday = 32,
Sunday = 64
};
static void Main(string[] args)
{
Days holidays = Days.Sunday | Days.Saturday;
if ((Days.Sunday | holidays) == holidays)
Console.WriteLine("Sunday is a Holiday");
else
Console.WriteLine("Sunday is a Holiday");
if ((Days.Tuesday | holidays) == holidays)
Console.WriteLine("Tuesday is not a Holiday");
else
Console.WriteLine("Tuesday is not a Holiday");
Console.ReadKey();
}
}
}结果:Sunday is a Holiday Tuesday is not a Holiday
这起作用是因为
按位或:
64 32 16 8 4 2 1
0 1 0 0 0 0 0 = 32 Saturday
1 0 0 0 0 0 0 = 64 Sunday
----------------------
1 1 0 0 0 0 0 = 96 Result (Holiday).按位或:
64 32 16 8 4 2 1
1 1 0 0 0 0 0 = 96 Holiday
1 0 0 0 0 0 0 = 64 Sunday
----------------------
1 1 0 0 0 0 0 = 96 Result (Holiday).按位或:
64 32 16 8 4 2 1
1 1 0 0 0 0 0 = 96 Holiday
0 0 0 0 0 1 0 = 32 Tuesday
----------------------
1 1 0 0 0 1 0 = 97 Result (Not Holiday).https://stackoverflow.com/questions/15017387
复制相似问题