代码之家  ›  专栏  ›  技术社区  ›  Alastair Pitts

C#中的运算符重载-实际代码应该放在哪里?

  •  6
  • Alastair Pitts  · 技术社区  · 16 年前

    有点概念性的问题:

    我正在以向量3(3个int值)的形式创建我的自定义结构,并且我正在重载标准运算符(+、-、*、/、==等等)

    当我构建一个供外部使用的库时,我试图遵守FxCop规则。因此,他们建议使用执行相同功能的方法。

    例如,加法(),减法(),等等。。。

    为了节省代码重复,其中一个方法(操作符重载或实际方法)将调用另一个方法。

    我的问题是,哪个应该叫哪个?

    (A)

        public static MyStruct operator +(MyStruct struc1, MyStruct struct2)
        {
            return struc1.Add(struct2);
        }
    
        public MyStruct Add(MyStruct other)
        {
            return new MyStruct (
                this.X + other.X,
                this.Y + other.Y,
                this.Z + other.Z);
        }
    

    或:

        public static MyStruct operator +(MyStruct struc1, MyStruct struct2)
        {
            return new MyStruct (
                struct1.X + struct2.X,
                struct1.Y + struct2.Y,
                struct1.Z + struct2.Z);
        }
    
        public MyStruct Add(MyStruct other)
        {
            return this + other;
        }
    

    我真的不确定这两种方法是否更可取,但我正在寻找一些意见:)

    6 回复  |  直到 16 年前
        1
  •  24
  •   bitbonk    16 年前

    我会和一个朋友一起去。由于运算符重载不符合CLS(并非所有.NET语言都支持重载运算符),因此可以将其视为上下文中的语法糖 添加方法。

        2
  •  3
  •   Jon Skeet    16 年前

    任何一个这真的没关系。我希望代码无论如何都要内联,所以跟着你认为更可读的东西去。

        3
  •  2
  •   Letterman    16 年前

    方法才是真正的东西。方法可以获取额外的参数,它们可以标记为虚拟(=>可以重写)、重载,并且通常更符合语言的性质。在寻找实际原因之前,我认为你需要感受一下。

        4
  •  1
  •   Marc Gravell    16 年前

    因为它是一个 struct virtual 更简单)-所以我会选择“B”,因为我想打电话 + Add ... 减少间接性。

    class 真正需要 +

        5
  •  0
  •   Agent_9191    16 年前

    我会投票支持选项B,因为在查看运算符中实际使用的值/属性时,这是一个更直观的地方。

        6
  •  0
  •   Casey    16 年前

    出于上面提到的许多原因,我也会选择A,特别是因为我将操作符重载视为包装实际方法的语法机制。

    推荐文章