C#3.0笔记(三)var关键字与扩展方法
2009-05-17 21:26
260 查看
从这篇blog开始真正开始关心3.0里面的特性,本篇主要介绍下Var关键字与扩展方法。
初识var关键字
C#3.0中为我们提供了var关键字来定义隐式化的局部变量,定义方式:
其实在使用var关键字时,编译器会根据初始化变量的变量值来推断变量的数据类型,我们可以通过IL来看下上面几句代码在编译之后的表示:
我们可以清楚的看到编译器会根据值来推断变量的类型,所以var关键字在本质上并没有改变什么。在foreach字句中也可以使用var关键字如:
使用var关键字的注意点
1) 隐式类型变量定义时必须要定义初始值;
2) 不能用null来初始化;
3) 不能使用var作为方法的返回值或则参数类型;
4) 不能用var定义类的成员;
扩展方法的由来与定义
当一个类型被定义好了之被编译进一个程序集后,它的定义工作就已经结束了,一般的时候我们要添加新的方法的时候,只能去修改代码重新编译(也可以通过反射机制去修改)。在C#3.0里面为我们提供了扩展方法这样东西。当我们需要为某个类型添加功能,但又没有源代码的时候,扩展方法是比较好的选择。下面我们来对object类型定义一个扩展方法:
在定义一个扩展方法时要注意三点:
1)必须把方法定义在静态类中,也就是说方法也必须是静态的;
2)所有的方法的第一个参数必须加上this关键字;
3)扩展方法的调用只能在内存中的实例中调用,或则通过静态类调用。
上面的扩展方法就是通过放射机制察看object所在的类型以及程序集。我们可以看下一个调用的示例:
![](http://images.cnblogs.com/cnblogs_com/Henllyee/WindowsLiveWriter/C3.0var_A1DB/image_thumb.png)
要注意的一点,扩展方法在this后面紧接着的是要扩展的类型。扩展方法除了第一个方法外,其他的参数就跟定义一般的方法一样。
推荐定义的方式以及一个完整的例子
在上面的例子中我们将方法定义在一个名为MyExtensions类里面,但是我们需要注意的一点就是所在的命名空间,如果我们的命名空间不是System那么我们要让object类型使用到此方法,就需要每次导入命名空间。这显然不是一种好的方式,所以一般定义扩展方法时建议将所在类的放在目标的类型命名空间下。下面我们看一个完整的例子:
HenllyeeExtensions.cs:
调用的示例:
结果:
![](http://images.cnblogs.com/cnblogs_com/Henllyee/WindowsLiveWriter/C3.0var_A1DB/image_thumb_1.png)
下一篇:C#3.0笔记(四)对象初始化器与匿名类型
![](http://images.cnblogs.com/cnblogs_com/henllyee/png-1665.png)
作者:Henllyee Cui
出处: http://henllyee.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。
初识var关键字
C#3.0中为我们提供了var关键字来定义隐式化的局部变量,定义方式:
var i = 0; var myBool = true; var myString = "Henllyee";
其实在使用var关键字时,编译器会根据初始化变量的变量值来推断变量的数据类型,我们可以通过IL来看下上面几句代码在编译之后的表示:
.locals init ([0] int32 i, [1] bool myBool, [2] string myString)
我们可以清楚的看到编译器会根据值来推断变量的类型,所以var关键字在本质上并没有改变什么。在foreach字句中也可以使用var关键字如:
var lists = new List<int>() { 1, 2, 4, 100 }; foreach (var i in lists) { Console.Write(i + ",", i.ToString()); }
使用var关键字的注意点
1) 隐式类型变量定义时必须要定义初始值;
2) 不能用null来初始化;
3) 不能使用var作为方法的返回值或则参数类型;
4) 不能用var定义类的成员;
扩展方法的由来与定义
当一个类型被定义好了之被编译进一个程序集后,它的定义工作就已经结束了,一般的时候我们要添加新的方法的时候,只能去修改代码重新编译(也可以通过反射机制去修改)。在C#3.0里面为我们提供了扩展方法这样东西。当我们需要为某个类型添加功能,但又没有源代码的时候,扩展方法是比较好的选择。下面我们来对object类型定义一个扩展方法:
public static string DisplayDefinigAssembly(this object obj) { return String.Format("{0} lives here :\n\t {1}\n", obj.GetType().Name, Assembly.GetAssembly(obj.GetType())); }
在定义一个扩展方法时要注意三点:
1)必须把方法定义在静态类中,也就是说方法也必须是静态的;
2)所有的方法的第一个参数必须加上this关键字;
3)扩展方法的调用只能在内存中的实例中调用,或则通过静态类调用。
上面的扩展方法就是通过放射机制察看object所在的类型以及程序集。我们可以看下一个调用的示例:
![](http://images.cnblogs.com/cnblogs_com/Henllyee/WindowsLiveWriter/C3.0var_A1DB/image_thumb.png)
static void Main(string[] args) { DataSet ds = new DataSet(); Console.Write(ds.DisplayDefinigAssembly()); Console.Read(); }
要注意的一点,扩展方法在this后面紧接着的是要扩展的类型。扩展方法除了第一个方法外,其他的参数就跟定义一般的方法一样。
推荐定义的方式以及一个完整的例子
在上面的例子中我们将方法定义在一个名为MyExtensions类里面,但是我们需要注意的一点就是所在的命名空间,如果我们的命名空间不是System那么我们要让object类型使用到此方法,就需要每次导入命名空间。这显然不是一种好的方式,所以一般定义扩展方法时建议将所在类的放在目标的类型命名空间下。下面我们看一个完整的例子:
HenllyeeExtensions.cs:
namespace System { public static class HenllyeeExtensions { public static void Foo(this int i, string Msg) { Console.WriteLine("{0} called Foo() say '{1}'", i, Msg); } } }
调用的示例:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data; namespace Demo { class Program { static void Main(string[] args) { int i = 0; i.Foo("Hello,Henllyee!"); Console.Read(); } } }
结果:
![](http://images.cnblogs.com/cnblogs_com/Henllyee/WindowsLiveWriter/C3.0var_A1DB/image_thumb_1.png)
下一篇:C#3.0笔记(四)对象初始化器与匿名类型
![](http://images.cnblogs.com/cnblogs_com/henllyee/png-1665.png)
作者:Henllyee Cui
出处: http://henllyee.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。
相关文章推荐
- c#3.0新特性(一):var关键字、自动属性、初始化器和扩展方法
- C#学习笔记四: C#3.0自动属性&匿名属性及扩展方法
- [读书笔记]C#学习笔记五: C#3.0自动属性,匿名属性及扩展方法
- C#3.0 新特性学习笔记(4):扩展方法
- [读书笔记]C#学习笔记五: C#3.0自动属性,匿名属性及扩展方法
- [读书笔记]C#学习笔记五: C#3.0自动属性,匿名属性及扩展方法
- C#3.0新特性之扩展方法介绍
- C#3.0 中的扩展方法 (Extension Methods)
- C#3.0 中的扩展方法 (Extension Methods)
- C#学习笔记-索引器,指针类型,隐式类型,扩展方法,分部方法,匿名类型
- php学习笔记------[php面向对象中常用关键字与魔术方法]
- Python学习笔记4-如何快速的学会一个Python的模块、方法、关键字
- C#3.0新特性:扩展方法初探
- .net framework3.5新特性(1):var、初始化、匿名类和扩展方法
- C#3.0新体验(二) 扩展方法
- toString()方法对数字与关键字parseInt()方法对带有数字的字符串中数字进制之间转换-学习笔记
- ASP.Net MVC开发基础学习笔记:二、HtmlHelper与扩展方法
- JAVA笔记4__static关键字/对象数组/foreach/方法的可变参数
- C#3.0学习(1)---隐含类型局部变量和扩展方法
- C#中的自动属性、隐式类型var、对象初始化器与集合初始化器、扩展方法