generics を使った比較メソッド

C# で generics(総称性)を使って比較メソッドを作成します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. C# で generics(総称性)を使って大きい方の値を返すメソッドを作成します。
    C++ の template に相当する機能ですが、書き方は簡単でも使い勝手は今一です。 (^_^;)
    C++ では type parameter で受け取った引数に対して直接演算が出来るのに対して、C# では 四則演算や、 比較演算などをするとエラーになります。 (;_;)
    /************************************************/
    /*★ generics を使った比較メソッド    前田 稔 ★*/
    /************************************************/
    using System;
    
    class Print
    {
        public static int Main()
        {
            int    n1 = Max<int>(5, 10);   // int 版の Max を明示的に呼び出し
            int    n2 = Max(5, 10);        // int 版の Max が自動的に生成される
            Console.WriteLine("Max<int>(5, 10)={0}  Max(5, 10)={1}",n1, n2);
    
            double x  = Max(5.0, 10.0);    // double 版の Max が自動的に生成される
            Console.WriteLine("Max(5.0, 10.0)={0}",x);
            string s  = Max("abc", "cat"); // string 版の Max (辞書式順序で比較)
            Console.WriteLine("Max(abc, cat)={0}",s);
    
            Console.ReadLine();
            return 0;
        }
        public static T Max<T>(T a, T b)
            where T : IComparable
        {
            return a.CompareTo(b) > 0 ? a : b;
        }
    }
    
  2. C# で使われる多くの型は IComparable インターフェースを実装しています。
    そこで type parameter で受け取った引数に対して、IComparable インターフェースのメソッド CompareTo() を使って比較を行います。
    CompareTo() を使うには where コンテキストキーワードを使用して「クラス T は IComparable を実装している」という制約を課します。
    つまり CompareTo() が使用できる型に限って、type parameter として渡すことが出来るようになります。
    type parameter で受け取った型と同じ型をリターンするので、メソッドの形式が T Max<T> となっています。
    generics の説明は generics の基礎 を参照して下さい。
        public static T Max<T>(T a, T b)
            where T : IComparable
        {
            return a.CompareTo(b) > 0 ? a : b;
        }
       
  3. where で制約を課せるなら、これを利用して直接計算が出来ないかと探して見たのですが、見つかりませんでした。 (^_^;)

超初心者のプログラム入門(C# Frame Work)