重温net2.0新特性之可空类型、匿名方法

 

 

一.可空类型

相信大家都有过操作数据库的经历,当我们SELECT出来一组值,将它赋值给我们定义的实体实例列表的时候,我们不免会遇到字段值为空,也就是值类型是DBNull的情况,当对应的实体属性是doule,int这些值类型的时候,这样赋值就会发生异常,这是我们不想看到的,net2.0推出一款可空类型,有效避免上述问题的发生,为编程人员带来的极大的方便!

可空类型表示可被赋值为null的值类型,正常情况下整数是不可为空的,如果不赋值将被初始化为0,如果是可空类型,那么默认值是NULL

这样写的:T?即声明一个可空类型 System.Nullable<T>的缩写

For Example....

int?x=10  //这样声明就表示x可以接收整型值,也可以接收null

bool? y=true; //y除了可以赋值为true或者false,还可以赋值null

这样呢,如开篇所说的那个问题,在我们使用select出来的列表值 的时候,我们就可以判断一下是否为null

 

它有三个重要的方法及属性,hasvalue,value, int j = t.x.GetValueOrDefault();得到基础类型的默认值      

可空类型主要针对于值类型变量

注意:一个可空类型不能赋值给一个不是可空的类型,一个普通类型可以赋值给一个可空类型(只限一样的基本类型),因为说明一个变量是可空的,只是说明它在原有的基础多了一个null值。从而方便很多场合的运算。

 

二.匿名方法

2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法C# 2.0 引入了匿名方法。它是采用一种“内联”的方式将代码与委托实例相关联。就是为了简化程序的代码量,匿名方法即是省去了委托代理的方法的定义过程,使委托与方法更快速的绑定,如我想让一个委托一个方法,这个方法弹出一个窗口,看下面的代码:

delegate void proDelegate(string str);//声明委托

   //命名方法

        void MessageBoxTest(string str)

        {

            MessageBox.Show(str);

        }

实例化方代码:

            proDelegate pro = new proDelegate(MessageBoxTest);

            pro("命名方法");

在这里命名方法的功能很简单,就是弹出一个窗体,只执行了一条语句,但是必须将该语句提取到一个具有完整参数列表的单独方法中,这样看起来比较繁锁,使用匿名方法,该事件处理代码明显变得更简洁了:

去掉上面命名方法的部分,在委托实例化的时候我们使用匿名方法,用一个关键字delegate 和可选的参数列表和包含在 { } 分隔符中的语句列表省去方法声明的部分:

   proDelegate pro = delegate(string str){ MessageBox.Show(str); };

 pro("匿名方法");

匿名方法可以用在任何需要使用委托类型的地方。您可以将匿名方法传递给任何方法,只要该方法接受适当的委托类型作为参数即可,将上述程序改装一下:

//调用方

 testDelegate(delegate(string str) { MessageBox.Show(str); });

//声明

        void testDelegate(proDelegate pro)

        {

            pro("匿名方法");

         }

上述匿名方法代码的结果都是弹出一个“匿名方法”的对话框(公司的破网上传不了图片,将就一下了)

几个关键问题:

1.       匿名方法的参数可以指定也可以不指定,要是指定了必须与委托定义的相同。

不指定参数与参数列表为空的区别,还是拿上面的例子说话吧:

 proDelegate pro = delegate{ MessageBox.Show(“匿名方法”); }; //不指定参数列表 正确

proDelegate pro = delegate(){ MessageBox.Show(“匿名方法”); };//列表为空 错误

这个是不对的,因为写了一个()表示的就不是ProDelegate这个委托了,而是个没有参数列表的委托 delegate void proError(),这两个委托是不兼容的,将proErrorp 这个委托实例化给proDelegate显然是错的。

2.       匿名方法的返回值与委托的返回值必须相同或兼容。

 

 

机制:匿名方法仅仅是通过编译器的一层额外的处理,来简化委托实例化的工作,编译时会根据参数及返回类型来猜测出一个方法来。静态方法中的匿名方法就会产生一个静态的方法,实例方法会产生出一个实例方法,如下:

Void Function()

{

 ProDelegate pro=delete {…..};

}

实际上就相当于这样

Void Function()

{

 ProDelegate pro=new proDelegate(this.xxxMethod);

}

 

Void xxxMethod()

{……..}

 

 

如果是静态类就会这样

Static void Function()

{

 ProDelegate pro=delete{….};

}

实际上就是这样的

Static void Function()

{

         ProDelegate pro=new ProDelegate(xxxMethod);

}

Static void xxxMethod()

{….}

编译器编译的时候会function方法来推断这个匿名方法应该是个静态方法,这个是很容易理解的,如果不是静态的,上哪去找那个方法的实例呢?

posted @ 2008-07-24 08:28  慧致澜馨  阅读(755)  评论(4编辑  收藏  举报