none
C#所有的属性,是不是被CLR变成方法了? RRS feed

  • 问题

  •  Nullable<int> x = 5;
                Nullable<int> y = null;
                const int ss =100;
                Console.WriteLine("x: HasValue={0} ,Value={1}", x.HasValue, x.Value);
                Console.WriteLine("y: HasValue={0} ,Value={1}", y.HasValue, y.GetValueOrDefault());

                Console.WriteLine("___________________________________________________{0}", Environment.NewLine);

     

    IL:

    Member: (0a000013) get_HasValue:
      CallCnvntn: [DEFAULT]
      hasThis
      ReturnType: Boolean
      No arguments.
     MemberRef #3 (0a000014)
     -------------------------------------------------------
      Member: (0a000014) get_Value:
      CallCnvntn: [DEFAULT]
      hasThis
      ReturnType: Var!0
      No arguments.

     

     

    2011年12月18日 9:28

答案

  • 是的。所有的属性只是语法糖。在编译成 IL 后,属性的定义会被保留 (.property, Property metadata),而其调用则根据语义会变成 get_Property 和 set_Property。这两个方法的名字在 IL 级别是可以改变的。不过语言级别不支持。
    Mark Zhou
    2011年12月19日 10:44

全部回复

  • 自己顶一下。怕帖子沉了,没有回答我的问题了。

    2011年12月18日 9:59
  • 是的。所有的属性只是语法糖。在编译成 IL 后,属性的定义会被保留 (.property, Property metadata),而其调用则根据语义会变成 get_Property 和 set_Property。这两个方法的名字在 IL 级别是可以改变的。不过语言级别不支持。
    Mark Zhou
    2011年12月19日 10:44
  • 哦。非常感谢,我对中间语言不了解,故发个帖子,来求知,验证我的所知所学。谢谢你,看见你提到语法糖,那你的编程逻辑思维或者看待C#编程这方面,应该是属于国外的表达方式。不过,我挺喜欢的。一开始,我也怀疑,定义了太多的属性,速度怎么没有显著的下降。原来变成方法了。

    谢谢。

          初学者。。匿名

    2011年12月19日 12:32