繁体   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