簡體   English   中英

沒有引用類型的c#struct

[英]c# struct with no reference types

考慮一個不包含任何引用字段的結構(只有基本類型和其他結構)。

考慮這個結構將在集合中使用,我希望它的行為類似於值類型(即int)。

  • 我需要覆蓋operator ==和operator!=?
  • 我需要覆蓋Equals嗎?
  • 我需要復制構造函數嗎?
  • 我需要擔心作業嗎?
  • 我需要覆蓋GetHashCode嗎?
  1. 取決於你,默認==和!=將重定向到默認的Equals實現,但更好的做法是直接使用Equals而不是==或!=
  2. 默認情況下,Equals應對值類型和引用類型的引用相等性執行按位比較,因此,如果結構包含作為引用類型的字段,則需要重寫Equals以對它們執行適當的比較。 除此之外,MSDN建議最后覆蓋Equals,以獲得性能優勢。

特別是如果您的值類型包含作為引用類型的字段,您應該重寫Equals(Object)方法。 這可以提高性能並使您能夠更接近地表示類型的相等含義。

  1. 在變量/方法之間傳遞時,默認情況下會復制結構,因此無需編寫復制構造函數。 我能想到的唯一情況是,如果你的結構包含作為引用類型的字段,並且你想要創建一個復制構造函數來執行它們的深層復制,由你決定。
  2. 你是什​​么意思擔心任務?
  3. 是。 如果您要將結構體用作HashSet的成員或作為Dictionary中的鍵,您可能希望提供GetHashCode的自定義實現。

最好實現IEquatable以避免裝箱(默認Equals接受一個對象類型,因此你的struct必須經過裝箱才能適應這種類型)。 集合(數組,字典等)通常會檢查其成員是否實現IEquatable,並使用IEquatable.Equals,因此最好實現它。 還建議實現默認的Equals(來自System.Object)並直接指向IEquatable.Equals實現。 例:

struct MyStruct : IEquatable<MyStruct>
{
    public int A { get; set; }

    public int B { get; set; }

    public bool Equals(MyStruct other)
    {
        return A == other.A && B == other.B;
    }

    public override bool Equals(object obj)
    {
        if (!(obj is MyStruct)) return false;
        return ((MyStruct)obj).Equals(this);
    }

    public override int GetHashCode()
    {
        return (A, B).GetHashCode();
    }
}

我還提供了一個如何實現GetHashCode的例子,最好的方法是使用Tuple的實現。

再次,實現==和!=取決於您標准庫(System,System.Collections等)使用System.Equals或IEquatable.Equals進行比較,您也應該這樣做。

所以不,實現==和!=是沒有必要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM