我对编程课程中的内容感到很困惑.
简而言之 - 我发现了一种具有这种结构的方法:
public void MethodA<T>(T a) where T : IComparable
{
//...
}
Run Code Online (Sandbox Code Playgroud)
据我所知 - 我们可以使用相同的确切效果:
public void MethodB(IComparable a)
{
//...
}
Run Code Online (Sandbox Code Playgroud)
这两种方式在某种程度上是否有所不同,并且其中一种方式优于另一种方式?如果是这样,那么如何才能看出其中一个更好用?
非常感谢!
我好奇,所以我自己做了一个小测试代码:
public interface ITest
{
int Value { get; set; }
}
public struct TestStruct : ITest
{
public int Value { get; set; }
}
private static void TestMethodGeneric<T>(T value) where T : ITest
{
}
private static void TestMethodNonGeneric(ITest value)
{
}
Run Code Online (Sandbox Code Playgroud)
在我的主要方法中,我使用两个调用:
TestStruct ts = new TestStruct {Value = 10};
TestMethodNonGeneric(ts);
TestMethodGeneric(ts);
Run Code Online (Sandbox Code Playgroud)
这是由此产生的IL代码:
非通用:
IL_0031: ldloc.0 // ts
IL_0032: box Tests.Program/*02000002*//TestStruct/*02000026*/
IL_0037: call void Tests.Program/*02000002*/::TestMethodNonGeneric(class Tests.Program/*02000002*//ITest/*02000025*/)/*06000002*/
IL_003c: nop
Run Code Online (Sandbox Code Playgroud)
通用:
IL_0059: ldloc.0 // ts
IL_005a: call void Tests.Program/*02000002*/::TestMethodGeneric<valuetype Tests.Program/*02000002*//TestStruct/*02000026*/>(!!0/*valuetype Tests.Program*//*02000002*//*/TestStruct*//*02000026*//**/)/*06000001*/
IL_005f: nop
Run Code Online (Sandbox Code Playgroud)
所以你看,在通用版本中,使用了特定的类型,因此没有发生装箱.
在非泛型版本中,必须将struct值转换为值ITest,因此它将被装箱.因此,通用版本具有(非常小的)性能优势.
只是我的两分钱,这两种方法可能存在其他或多或少的重要差异.
| 归档时间: |
|
| 查看次数: |
51 次 |
| 最近记录: |