1

少なくともパラメーターにいくつかの制約を課すことなく、C# でジェネリック メソッドを使用したいのはなぜですか? ANY型を渡すことができる便利なことをするメソッドは本当に考えられません。

4

3 に答える 3

5

IEnumerable<T>拡張メソッドなど、それを使用するときはいつでも。

于 2013-03-10T21:05:46.190 に答える
5

簡単な例:

void Swap<T>(ref T a, ref T b)
{
    T temp = a;
    a = b;
    b = temp;
}

Tすべてのタイプが派生していることを忘れないでくださいSystem.Object。したがって、いくつかの便利なメソッドを継承します。まあ、厳密に言えば、すべてのタイプではありません。たとえば、インターフェースは継承しませんが、インターフェースをobject実装する型は継承します。したがって、Tがインターフェイスタイプであっても、C#を使用すると、から継承されたメンバーにアクセスできますobject

于 2013-03-10T21:07:40.263 に答える
1

メソッドが必要な場合...ジェネリック。

別の回答に投稿した例があります。ExecuteTimedActionというメソッドです。アクションといくつかのパラメーターを取り、アクションの時間を計測して実行し、結果を返します。これは、実行時間を記録する必要があるすべての共通ライブラリで使用されます。

このメソッドは、型 T を気にしません。別のメソッド (デリゲート) を実行し、そのメソッドの戻り値の型を返すだけです。制約を必要とするメソッド内に依存関係がないため、制約は必要ありません。

これは良い候補だと思います.確かに唯一の例ではありませんが、頭のてっぺんにあったものです. この回答からの方法は次のとおりです。

    /// <summary>
    /// Generic method for performing an operation and tracking the time it takes to complete (returns a value)
    /// </summary>
    /// <typeparam name="T">Generic parameter which can be any Type</typeparam>
    /// <param name="actionText">Title for the log entry</param>
    /// <param name="func">The action (delegate method) to execute</param>
    /// <returns>The generic Type returned from the operation's execution</returns>

    public static T ExecuteTimedAction<T>(string actionText, Func<T> executeFunc, Action<string> logAction)
    {
        string beginText = string.Format("Begin Execute Timed Action: {0}", actionText);

        if (null != logAction)
        {
            logAction(beginText);
        }
        else
        {
            LogUtil.Log(beginText);
        }

        Stopwatch stopWatch = Stopwatch.StartNew();
        T t = executeFunc(); // Execute the action
        stopWatch.Stop();

        string endText = string.Format("End Execute Timed Action: {0}", actionText);
        string durationText = string.Format("Total Execution Time (for {0}): {1}", actionText, stopWatch.Elapsed);

        if (null != logAction)
        {
            logAction(endText);
            logAction(durationText);                
        }
        else
        {
            LogUtil.Log(endText);
            LogUtil.Log(durationText);
        }

        return t;
    }
于 2013-03-10T21:18:06.437 に答える