2007年12月5日

Enum视为位域

    消失了一段时间,重新归来.Copy一段MSDN的讲解.
    位域通常用于由可组合出现的元素组成的列表,而枚举常数通常用于由互相排斥的元素组成的列表。因此,位域设计为通过按位“或”运算组合来生成未命名的值,而枚举常数则不是。语言在对位域的使用和对枚举常数的使用上不同。

   用于 FlagsAttribute 和 Enum 的准则

  • 只有要对数值执行按位运算(AND、OR、XOR)时才对枚举使用 FlagsAttribute 自定义属性。

  • 用 2 的幂(即 1、2、4、8 等)定义枚举常量。这意味着组合的枚举常量中的各个标志都不重叠。

  • 请考虑为常用标志组合创建一个枚举常量。例如,如果用于文件 I/O 操作的枚举包含枚举常量 Read = 1Write = 2,请考虑创建枚举常量 ReadWrite = Read OR Write,该常量组合了 ReadWrite 标志。此外,在某些情况下,可能会将用于组合标志的按位 OR 运算视为一种高级概念,在简单任务中不需要执行此操作。

  • 将负数定义为标志枚举常量时应谨慎,因为很多标志位置都可能设置为 1,这可能使您的代码产生混淆并易于发生代码错误。

  • 测试数值中是否已设置标志的一种简便方法为:在数值和标志枚举常量之间执行按位“与”操作,这种方法会将数值中与标志不对应的所有位都设置为零,然后测试该操作的结果是否等于该标志枚举常量。

  • None 用作值为零的标志枚举常量的名称。在按位 AND 运算中,不能使用 None 枚举常量测试标志,因为所得的结果始终为零。但是,您可以在数值与 None 枚举常量之间执行逻辑(不是按位)比较,以确定数值中是否已设置任何位。

    如果创建的是值枚举而不是标志枚举,创建 None 枚举常量仍十分有用。原因是在默认情况下,公共语言运行库会将用于枚举的内存初始化为零。因此,如果不定义值为零的常量,则枚举在创建时将包含非法值。

    如果明显存在应用程序需要表示的默认情况,请考虑使用值为零的枚举常量表示默认值。如果不存在默认情况,请考虑使用值为零的枚举常量(这意味着该情况不由任何其他枚举常量表示)。

  • 不要仅为了反映枚举自身的状态而定义枚举值。例如,不要定义仅用于标记枚举末尾的枚举常量。如果需要确定枚举的最后一个值,请显式检查该值。此外,如果枚举常量范围中的所有值都有效,还可以对第一个和最后一个枚举常量执行范围检查。

  • 不要指定保留供将来使用的枚举常量。

  • 在定义采用枚举常量作为值的方法或属性时,应考虑对该值进行验证。原因是即使没有在枚举中定义某个数值,也可以将该数值强制转换为枚举类型。

 

// Example of the FlagsAttribute attribute.
using System;

class FlagsAttributeDemo
{
    
// Define an Enum without FlagsAttribute.
    enum SingleHue : short
    
{
        Black 
= 0,
        Red 
= 1,
        Green 
= 2,
        Blue 
= 4
    }
;

    
// Define an Enum with FlagsAttribute.
    [FlagsAttribute] 
    
enum MultiHue : short
    
{
        Black 
= 0,
        Red 
= 1,
        Green 
= 2,
        Blue 
= 4
    }
;

    
static void Main( )
    
{
        Console.WriteLine( 
            
"This example of the FlagsAttribute attribute \n" +
            
"generates the following output." );
        Console.WriteLine( 
            
"\nAll possible combinations of values of an \n" +
            
"Enum without FlagsAttribute:\n" );
        
        
// Display all possible combinations of values.
        forint val = 0; val <= 8; val++ )
            Console.WriteLine( 
"{0,3} - {1}"
                val, ( (SingleHue)val ).ToString( ) );

        Console.WriteLine( 
            
"\nAll possible combinations of values of an \n" +
            
"Enum with FlagsAttribute:\n" );
        
        
// Display all possible combinations of values.
        
// Also display an invalid value.
        forint val = 0; val <= 8; val++ )
            Console.WriteLine( 
"{0,3} - {1}"
                val, ( (MultiHue)val ).ToString( ) );
    }
 
}
 

/*
This example of the FlagsAttribute attribute
generates the following output.

All possible combinations of values of an
Enum without FlagsAttribute:

  0 - Black
  1 - Red
  2 - Green
  3 - 3
  4 - Blue
  5 - 5
  6 - 6
  7 - 7
  8 - 8

All possible combinations of values of an
Enum with FlagsAttribute:

  0 - Black
  1 - Red
  2 - Green
  3 - Red, Green
  4 - Blue
  5 - Red, Blue
  6 - Green, Blue
  7 - Red, Green, Blue
  8 - 8
*/

posted @ 2007-12-05 00:21 残叶 阅读(577) 评论(0) 推荐(0) 编辑

2007年9月26日

ASP.NET 2.0 HttpHandler实现生成图片验证码(转)

摘要: 1. 处理程序文件 ValidateImageHandler.ashx代码如下 using System; using System.Web; using System.Web.SessionState; using System.Drawing; using System.Drawing.Imaging; using System.Text; /**//// /// Validate... 阅读全文

posted @ 2007-09-26 10:53 残叶 阅读(469) 评论(1) 推荐(0) 编辑

2007年9月6日

Asp.net 2.0生命周期

摘要: Asp.net 2.0生命周期可以分为Web Page、Server Control和 Application 生命周期: 一、Web Page Life Cycle 如果 @ Page 指令的 AutoEventWireup 属性设置为 true(或者如果未定义该属性,因为默认情况下为 true),页事件将自动绑定至使用 Page_event 命名约定的方法. 下表... 阅读全文

posted @ 2007-09-06 17:14 残叶 阅读(491) 评论(0) 推荐(0) 编辑

ASP.NET 2.0 的 App_Offline.htm

摘要: 在ASP.NET 2.0 站点根目录下,只要存在 App_Offline.htm 文件,那么所有对.aspx的请求都将转向App_Offline.htm 。而且浏览器的地址栏显示的是所请求的.aspx的URL。 这样当我们的站点需要维护时,只要把App_Offline.htm 拷贝到站点根目录下即可。 注意事项: (1)IIS 不能 Stop。 (2)... 阅读全文

posted @ 2007-09-06 16:31 残叶 阅读(210) 评论(0) 推荐(0) 编辑

2007年8月2日

联合使用抽象类和接口

摘要: 飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。 根据上面这句话,我们可以设计抽象类继承与接口,子类再继承与抽象类实现接口中的方法.使抽象类与接口完美结合. 接口: public interface IInterface { void Fly(); } 抽象类: abstract class ... 阅读全文

posted @ 2007-08-02 17:39 残叶 阅读(692) 评论(0) 推荐(0) 编辑

2007年7月24日

C#中抽象类和接口的区别

摘要: 大家都容易把这两者搞混,我也一样,在听李建忠老师的设计模式时,他也老把抽象类说成接口,弄的我就更糊涂了,所以找了些网上的资料. 一、抽象类: 抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基... 阅读全文

posted @ 2007-07-24 00:02 残叶 阅读(26150) 评论(22) 推荐(15) 编辑

2007年7月19日

C#静态构造函数

摘要: 这段时间开始看看设计模式,刚刚看了下Singleton模式,实现其最简洁的方法是: class Singleton { public static readonly Singleton instance = new Singleton(); private Singleton() { } } 很多人对这段代码不大理解,其实等价与: ... 阅读全文

posted @ 2007-07-19 13:53 残叶 阅读(827) 评论(0) 推荐(0) 编辑

2007年7月13日

封装K2.net 2003中的K2ROM

摘要: 在用K2.net 2003开发Workflow时,我们常常要封装一个K2ROM以对K2流程进行处理.下面就是一个K2流程要用到的最基本的一些操作. using System;using System.Collections;using SourceCode.K2ROM;using System.Data;using System.Data.SqlClient;using System.Config... 阅读全文

posted @ 2007-07-13 15:27 残叶 阅读(1509) 评论(1) 推荐(0) 编辑

2007年6月29日

Asp.net开发小技巧

摘要: 一.多个控件同用一个事件,从而可让代码更清晰,更简单,可维护性强 如下:多个Button共用一个事件处理的2种方法 1.利用OnCommand事件 protected void Button_Click(object sender, CommandEventArgs e)... 阅读全文

posted @ 2007-06-29 11:07 残叶 阅读(314) 评论(0) 推荐(0) 编辑

2007年6月28日

跨页面提交数据的方法

摘要: 1.利用网页A中的Button属性PostBackUrl 定向到目标B网页,在B网页中利用Page.PreviousPage属性访问使用 PostBackUrl 属性从其他页发送的值.2.在A网页中利用Server.Transfer("目标页",True)定向到目标B网页,在B网页中利用Page.PreviousPage属性访问使用 PostBackUrl 属性从其他页发送的值.或用Request... 阅读全文

posted @ 2007-06-28 18:07 残叶 阅读(566) 评论(0) 推荐(0) 编辑

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示