技术控

    今日:57| 主题:49101
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] Story of Equality in .Net - Part 6

[复制链接]
枕梦 发表于 2016-10-2 23:05:32
245 8

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Background:

  This article is in the continuation of series of articles regarding how Equality works in .Net, the purpose is to have the developers more clear understanding on how .Net handles equality for different types.
  What we learned so far:

     Following are the key points that we learned from the previous parts until now:
      
         
  • C# does not syntactically distinguish between value and reference equality which means it can sometimes be difficult to predict what the equality operator will do in particular situations.     
  • There are often multiple different ways of legitimately comparing values. .Net addresses this by allowing types to specify their preferred natural way to compare for equality, also providing a mechanism to write equality comparers that allow you to place a default equality for each type      
  • It is not recommended to test floating point values for equality because rounding errors can make this unreliable     
  • There is an inherent conflict between implementing equality, type-safety and good Object Oriented practices.     
  • Net provides the types equality implementation out of the box, few methods are defined by the .Net framework on the Object class which are available for all types.     
  • By default the virtual Object.Equals method does reference equality for reference types and value equality for value types, but for value types it uses reflection which is a performance overhead for value types and any type can override Object.Equals method to change the logic of how it checks for equality e.g. String, Delegate and Tuple do this for providing value equality, even though these are reference types.     
  • Object class also provides a static Equals method which can be used when there is chance that one or both of the parameters can be null , other than that it behaves identical to the virtual Object.Equals method.     
  • There is also a static ReferenceEquals method which provides a guaranteed way to check for reference equality.     
  • IEquatable interface can be implemented on a type to provide a strongly typed Equals method which also avoids boxing for value types. It is implemented for  primitive numeric types but unfortunately Microsoft has not been very proactive  implementing for other value types in the FCL( Framework Class Library ) .     
  • For Value Types using == operator gives us the same result as calling Object.Equals but underlying mechanism of == operator is different in IL( Intermediate Language ) as compared to Object.Equals, so the Object.Equals implementation provided for that primitive type is not called, instead an IL instruction ceq gets called which says that compare the two values that are being loaded on the stack right now and perform equality comparison using CPU registers.     
  • For Reference Types ,  == operator and Object.Equals method call both work differently behind the scenes which can be verified by inspecting the IL code generated. It also uses ceq instruction which do the comparison of memory addresses.   
    If you want to read the other parts published until now, you can read them here:
         
       
  •   Story of Equality in .Net – Part 1   
  •   Story of Equality in .Net – Part 2   
  •   Story of Equality in .Net – Part 3   
  •   Story of Equality in .Net – Part 4    
  • Story of Equality in .Net – Part 5     
   Introduction:

     We will be looking at String type in this post that how Equality works for it. You might be aware that for strings the equality operator compares values not references which we had seen in the first post of this series. It is because String has overridden the implementation of Equals to behave in this manner.
   We will investigate how == operator and Object.Equals method behave for equality checking.
  Equality Operator and String:

  Consider the following piece of code:
  [code]class Program
{

    static void Main(String[] args)
    {

        string s1 =  "Ehsan Sajjad";
        string s2 = String.Copy(s1);

        Console.WriteLine(ReferenceEquals(s1, s2));
        Console.WriteLine(s1 == s2);
        Console.WriteLine(s1.Equals(s2));
            
        Console.ReadKey();

    }

}[/code]   The above code is very similar to what we have looked at before as well, but this time we have String type variables in place. We are creating a string and holding its reference in s1 variable and on next line we are creating copy of the string and holding its reference in another variable names s2 .
   Then we are checking for reference equality for both the variables that are they both pointing to same memory location or not, then in next two lines we are checking the output of equality operator and Object.Equals method.
  Now we will build the project and run it to see what it outputs on the console. The following is the output printed on console:
   
Story of Equality in .Net - Part 6-1 (particular,different,difficult,sometimes,regarding)

   You can see that ReferenceEquals has returned false which means that both the string are different instances, but the == operator and Equals method have returned true , so it is clear that for Strings the equality operator does indeed test the value for equality not the reference exactly as Object.Equals does.
  Behind the Scenes of Equality Operator for String

   Let’s see how the equality operator is doing that. Now let’s examine the IL code generated for this example. For doing that, Open the Visual studio Developer Command Prompt , for opening it, go to Start Menu >> All Programs >> Microsoft Visual Studio >> Visual Studio Tools>> Developer Command Prompt

Story of Equality in .Net - Part 6-2 (particular,different,difficult,sometimes,regarding)

   Type ildasm on the command prompt, this will launch the IL disassembler which is used  to look at the IL code contained in an assembly, it is installed automatically when you install Visual Studio , so you don’t need to do anything for installing it.
12345下一页
友荐云推荐




上一篇:Learning Reinforcement Learning (with Code, Exercises and Solutions)
下一篇:DDDBelfast Retrospective
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

Tammy 发表于 2016-10-3 04:51:40
有钱任性
回复 支持 反对

使用道具 举报

邓雪 发表于 2016-10-5 02:17:06
帮不上什么忙,把帖子顶上去吧!
回复 支持 反对

使用道具 举报

fengzhi99 发表于 2016-10-5 21:57:21
低端粗俗甩节操
回复 支持 反对

使用道具 举报

aakendy 发表于 2016-11-6 13:05:17
占位编辑
回复 支持 反对

使用道具 举报

xgang12315 发表于 2016-11-8 20:08:51
楼下有什么好吐槽的么?
回复 支持 反对

使用道具 举报

骑着母猪去约会 发表于 2016-11-9 04:05:05
喜欢的摇,不喜欢的滚。
回复 支持 反对

使用道具 举报

刘子依 发表于 2016-11-10 23:04:49
前排,留名!
回复 支持 反对

使用道具 举报

老乡网 发表于 2016-11-16 18:52:13
楼主,你说,你几个意思?
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表