【问题标题】:Generic syntactic sugar or true improvement通用语法糖或真正的改进
【发布时间】:2011-12-29 20:24:32
【问题描述】:

我对以下方法调用有疑问:

var ctl1 = this.FindControlRecursively("SomeField") as HiddenField;
var ctl = this.FindControlRecursively<HiddenField>("SomeField");

这是这两个调用的 IL:

IL_0010:  ldstr      "AsyncReset"
IL_0015:  call       class [System.Web]System.Web.UI.Control   [Amc.WebG081.MethodExtensions]Amc.WebG081.ControlExtensions::FindControlRecursively(class [System.Web]System.Web.UI.Control,string)

IL_001a:  isinst     [System.Web]System.Web.UI.WebControls.HiddenField
IL_001f:  stloc.0
IL_0020:  ldarg.0
IL_0021:  ldstr      "AsyncReset"
IL_0026:  call       !!0 [Amc.WebG081.MethodExtensions]Amc.WebG081.ControlExtensions::FindControlRecursively<class [System.Web]System.Web.UI.WebControls.HiddenField>(class [System.Web]System.Web.UI.Control,string)

我一直认为在这种情况下,这种方法的通用版本更多的是“语法糖”而不是真正的改进。 IL 是不是在讲述一个不同的故事?

【问题讨论】:

    标签: c# asp.net generics il


    【解决方案1】:

    泛型内置于 C# 中,因此它是“真正的改进”。因此,为什么运行时协变和逆变是可能的,以及对泛型类型的反射和基于运行时反射的泛型类型的创建(例如List&lt;T&gt;,其中 T 在运行时确定)。

    这与 C++ 不同,在 C++ 中,模板在很多方面都是语法糖。编译器实际上会为您使用的每个泛型类型生成代码 - 因此,Add&lt;T&gt; 将创建 Add&lt;int&gt;Add&lt;long&gt;Add&lt;short&gt;Add&lt;MyClass&gt; 等等,如果您正在使用这些函数,对于类也是如此。这样做的好处主要是运算符和其他一些较小的东西 - 如果这些类型中的每一个都有一个 + 运算符,并且Add&lt;T&gt;(T a, T b) 返回 a + b,那么所有类型都可以正常工作。 C# 的编译器会抱怨,因为它不能/不能在编译时解析任何类型的运算符声明。此外,C#(不是 100% 肯定,但可能是 90%)为引用类型(如果您正在使用该实现)创建 1 个泛型类型实现,然后为每个值类型(如 int、long、Decimal、MyStruct 等)创建 1 个根据需要获取他们自己的实现)。

    【讨论】:

      【解决方案2】:

      在 java 中,泛型是语法糖,但在 c# 中,它们是内置的。看看这个: www.25hoursaday.com/CsharpVsJava.html

      【讨论】:

        猜你喜欢
        • 2011-03-08
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2021-07-09
        • 2013-07-05
        • 2011-04-21
        • 1970-01-01
        • 2020-10-03
        相关资源
        最近更新 更多