为什么你会想在 c# 中使用泛型方法而不至少对参数施加一些约束?我真的想不出一种方法可以做任何可以传递任何类型的有用的事情。
问问题
146 次
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
an 因此继承了几个有用的方法。好吧,严格来说不是每种类型。例如,接口不会继承自,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 回答