熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

詳解C#中相等運算符重載可能造成的陷阱

2013-11-13 10:15:30  來源: .NET編程 

  本文將對作者開發過程中碰到的C#中相等運算符重載可能造成的陷阱問題通過對這一陷阱的解決能讓大家對相等運算符重載有更深的了解

  最近編程時遇到一個相等運算符重載的問題想來該是C#的一個陷阱

  我定義的Coordinate類原先是這樣重載相等運算符的

  publice class Coordinates

  {

  

  public override bool Equals(object obj)

  {

  if (!(obj is Coordinates)) return false;

  Coordinates other = (Coordinates)obj;

  return (thislongitudeCompareTo(otherlongitude) == ) && (thislatitudeCompareTo(otherlatitude) == );

  }

  public static bool operator ==(Coordinates lhs Coordinates rhs)

  {

  return lhsEquals(rhs);

  }

  public static bool operator !=(Coordinates lhs Coordinates rhs)

  {

  return !(lhs == rhs);

  }

  

  }

  這也是運算符重載時常見的情況但在具體使用時有種情況下會出現問題即當一個Coordinate對象本身為NULL而它再與NULL比較時如下所示

  Coordinates actualPos = null

  if (actualPos == null)

  {

  

  }

  else

  {

  

  }

  運行時就會拋出錯誤提示說某個指針為空跟蹤的結果發現就是承載的==運算符出現問題它會調用lhsEquals(rhs)語句結果就是lhs本身不存在導致異常

  為此我試圖在調用該語句前排除這種情況於是把重載函數改為

  public static bool operator ==(Coordinates lhs Coordinates rhs)

  {

  if (lhs == null) return (rhs == null);

  return lhsEquals(rhs);

  }

  結果發現這個函數會繼續調用自身隨後依然是出現異常

  要解決這個問題就必須打破這樣的死循環於是嘗試著把lhs映射為object如下所示

  public static bool operator ==(Coordinates lhs Coordinates rhs)

  {

  if ((lhs as object) == null) return ((rhs as object) == null);

  return lhsEquals(rhs);

  }

  lhs被映射為object後的==就會采用object的相等運算符結果自然OK這樣的問題相信使用C#編程遲早會遇到可能還莫名其妙希望以上文章對大家有用


From:http://tw.wingwit.com/Article/program/net/201311/13080.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.