位标志枚举
枚举为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。可以使用枚举类型定义位标志,从而使该枚举类型的实例可以存储枚举数列表中定义的值的任意组合。
示例:创建一个WPF程序
MainWindow.xaml文件
<Window x:Class="UseEnum_wpf.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <DatePicker Height="26" HorizontalAlignment="Left" Margin="151,52,0,0" Name="datePicker1" VerticalAlignment="Top" Width="192" SelectedDateChanged="datePicker1_SelectedDateChanged" /> <TextBox Height="26" HorizontalAlignment="Left" Margin="151,111,0,0" Name="textBox1" VerticalAlignment="Top" Width="192" /> </Grid> </Window>
MainWindow.xaml.cs文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; namespace UseEnum_wpf { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { [Flags] enum WeekDayFlags //一周时间枚举 { None = 0x0, //值为零,表示“未设置任何标志”的命名常量。 //如果零值不表示“未设置任何标志”,则请不能为标志指定零值。 Sunday = 0x1, Monday = 0x2, Tuesday = 0x4, Wednesday = 0x8, Thursday = 0x10, //0x10是十六进制数,代表十进制数16
Friday = 0x20, //0x20是十六进制数,代表十进制数32
Saturday = 0x40 //0x40是十六进制数,代表十进制数64
} //可以使用枚举类型定义位标志,从而使该枚举类型的实例可以存储枚举数列表中定义的值的任意组合。 /*使用按位 | (OR)或运算符,在某个枚举上设置标志*/ // 移除一个标志使用 ^ (XOR)异或运算符 //休息日 WeekDayFlags RestDay = WeekDayFlags.Saturday | WeekDayFlags.Sunday ; //工作日 WeekDayFlags WorkDay = WeekDayFlags.Monday| WeekDayFlags.Tuesday | WeekDayFlags.Wednesday | WeekDayFlags.Thursday | WeekDayFlags.Friday; public MainWindow() { InitializeComponent(); } //日期选择控件 private void datePicker1_SelectedDateChanged(object sender, SelectionChangedEventArgs e) { DateTime SelectedDate = (DateTime)this.datePicker1.SelectedDate; int SD = (int)SelectedDate.DayOfWeek; //根据一个整数值返回一个WeekDayFlags类型的值 WeekDayFlags SDwFlags = SelectedDateWeekDay(SD+1); //使用按位 & (AND)与运算,确定是否设置了特定标志 if ((RestDay & SDwFlags) == SDwFlags) { this.textBox1 .Text = "休息日"; } if ((WorkDay & SDwFlags) == SDwFlags) { this.textBox1.Text = "工作日"; } } //根据一个给定的值,返回一个WeekDay类型的值。 private WeekDayFlags SelectedDateWeekDay(int SD) { // WeekDayFlags wdf ; if (SD <= 2) { // wdf = sd return (WeekDayFlags)SD; } else { int SDw = 2; for (int i = SD -2; i > 0; i--) { SDw = SDw * 2; } return (WeekDayFlags)SDw; } } } }
运行效果: