3.Extension Methods(拡張方法)

9438 ワード

<iframe align=“top”maginwidth=“0”margheight=“0”src=“http://www.zealware.com/46860.html“frame border=”0“width=”468“scrolling=”の“height=”60"
拡張方法は何ですか?簡単に言えば、拡張方法は、開発者が既存のタイプの方法定義と実現を簡単に拡張するメカニズムである。具体的には、まず、拡張方法は静的な方法でなければなりません。文法的には、その呼び出しと実例的な方法には違いがありません。やはりコードを見て話しましょう。
   1: public static class ExtensionMethodDemo
   2: {
   3:     public static decimal ToMoney(this string money)
   4:     {
   5:         decimal number = 0m;
   6: 
   7:         if (!decimal.TryParse(money, out number))
   8:         {
   9:             throw new ArgumentException("Money Error Information.");
  10:         }
  11: 
  12:         return number;
  13:     }
  14: 
  15:     public static int ToAge(this string age)
  16:     {
  17:         int number = 0;
  18: 
  19:         if (!int.TryParse(age, out number))
  20:         {
  21:             throw new ArgumentException("Age Error Information.");
  22:         }
  23: 
  24:         return number;
  25:     }
  26: }
このコードの役割は、stringタイプを拡張し、直接stringタイプをdecimalまたはintタイプに変換する方法を持たせることであり、呼び出し方法は以下の通りである。
   1: static void Main(string[] args)
   2: {
   3:     string moneyInput = Console.ReadLine();
   4: 
   5:     decimal money = moneyInput.ToMoney();
   6:     int age = "24".ToAge();
   7: 
   8:     // TODO: Do something...
   9: }
簡単に文字列に加えて、実際のプロジェクトでよく使われる方法を二つ追加しました。また、拡張方法はCの簡潔で上品な文法伝統を継承しています。
前に示したように、拡張方法は静的でなければならないので、staticキーワードは不可欠であり、拡張方法は非泛型または非嵌合型の静的なクラスでしか宣言できない。これはキーワードthisを通じてその最初のパラメータの修飾子として宣言されている。拡張方法は従来の静的方法と同じ能力を備えており、複雑な拡張方法を見ても良い。
   1: namespace DevLab
   2: {
   3:     class Program
   4:     {
   5:         static void Main(string[] args)
   6:         {
   7:             string[] names = new string[] { "ZeroCool", "Michael", "Autumoon" };
   8:             string[] nameRange = names.Range(0, 2);
   9: 
  10:             var ages = new int[] { 1, 2, 3, 4 };
  11:             var ageRange = ages.Range(1, 2);
  12: 
  13:             // TODO: Do something...
  14:         }
  15:     }
  16: 
  17:     public static class ExtensionMethodDemo
  18:     {
  19:         public static T[] Range<t>(<span style="COLOR: #0000ff">this</span> T[] original, <span style="COLOR: #0000ff">int</span> startIndex, <span style="COLOR: #0000ff">int</span> count)</t>
  20:         {
  21:             if (startIndex  original.Length)
  22:             {
  23:                 throw new ArgumentException("Argument Error Information.");
  24:             }
  25: 
  26:             T[] result = new T[count];
  27:             Array.Copy(original, startIndex, result, 0, count);
  28: 
  29:             return result;
  30:         }
  31:     }
  32: }
このコードを通して、拡張方法という仕組みの強さが見られますよね。
さらに、例示的な方法は、拡張方法の呼び出しよりも優先され、名前空間内で宣言された拡張方法は、名前空間外で宣言された拡張方法の呼び出しよりも優先されることに留意されたい。また、機能性に関しては、拡張方法は実例の方法より明らかではなく、より多くの制限があるので、マイクロソフトの公式は、拡張方法を慎重に適用することを勧めています。最後に、拡張方法はまだ属性、イベント、オペレータなどのタイプをサポートしていません。
Trackback:http://tb.blog.csdn.net/TrackBack.aspx?PostId=1887761