在c#中何时使用无约束的泛型方法

本文关键字:无约束 泛型方法 何时使 | 更新日期: 2023-09-27 18:03:09

为什么要在c#中使用泛型方法而不至少对参数施加一些约束呢?我真的想不出一个方法,做任何有用的东西,可以传递任何类型。

在c#中何时使用无约束的泛型方法

简单的例子:

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

不要忘记每种类型T都是从System.Object派生的,因此继承了一些有用的方法。严格来说,不是每一种类型。例如,接口不能从object继承,但实现它们的类型可以。因此,即使T是接口类型,c#也允许您访问从object继承的成员。

当你有使用它的时候,例如IEnumerable<T>扩展方法

当你需要…通用的。

我有一个例子,我张贴在另一个答案。它是一个叫做executetimmedaction的方法。它接受一个动作、几个参数、乘以这个动作、执行它并返回结果。它在一个公共库中用于任何我需要记录执行时间的东西。

这个方法不关心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;
    }