程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#3.0筆記(三)var關鍵字與擴展方法

C#3.0筆記(三)var關鍵字與擴展方法

編輯:關於C#

從這篇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所在的類型以及程序集。我們 可以看下一個調用的示例:

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

結果:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved