代码改变世界

C#3.0笔记(三)var关键字与扩展方法

2009-05-17 21:26  Henry Cui  阅读(2236)  评论(8编辑  收藏  举报

从这篇blog开始真正开始关心3.0里面的特性,本篇主要介绍下Var关键字与扩展方法。

初识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所在的类型以及程序集。我们可以看下一个调用的示例:

image

   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();
            }
        }
    }

结果:

 

image

 

 

下一篇:C#3.0笔记(四)对象初始化器与匿名类型

作者:Henllyee Cui
出处: http://henllyee.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。