2009-11-13 1 views
6

Немного концептуального вопроса:Перегрузка оператора на C# - где должен идти код кода?

Я создаю свою пользовательскую структуру в виде вектора Vector3 (3 значения int), и я работал с перегрузкой стандартных операторов (+, -, *, /, == etc ...)

Поскольку я создаю библиотеку для внешнего использования, я пытаюсь соответствовать правилам FxCop. Поэтому они рекомендуют использовать методы, которые выполняют одну и ту же функцию.

Например. .Add(), .Subtract() и т. Д.

Чтобы сохранить дублирование кода, один из этих методов (перегрузка оператора или фактический метод) будет вызывать другой.

Мой вопрос, который должен назвать, какой?

Является ли это (и это только пример кода):

)

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); 
    } 

или:

B)

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; 
    } 

Я действительно не уверен, либо предпочтительнее, но я ищу некоторые мнения :)

+1

Почему вы создали методы, основанные вместо статических, с двумя параметрами? Это то, что рекомендовали FxCop? –

ответ

24

Я бы пошел с A). Так как перегрузка оператора не соответствует требованиям CLS (не все языки .NET поддерживают перегрузку операторов), ее можно рассматривать как синтаксический сахар вокруг Добавить метод.

+0

Ах, я не понимал, что перегрузка оператора не соответствует CLI. А). Благодаря! –

+1

Тот факт, что он не совместим с CLI, не означает, что скомпилированная dll не будет работать с другими языками. – Dykam

+0

@ Dykam: Конечно, нет, но ваши клиенты должны написать что-то вроде MyStruct.op_Addition (myStruct1, myStruct2) ', если он использует язык CLI, который не поддерживает перегрузку оператора для +. – bitbonk

0

Я бы проголосовал за вариант B, так как это более интуитивное место, чтобы посмотреть, какие значения/свойства фактически используются в операторе.

3

Либо. Это действительно неважно. Я бы ожидал, что код будет встроен в любом случае, так что идите с тем, что считаете более читаемым.

+1

, но это именно то, что он спрашивает .. что мы считаем более читаемым – Letterman

1

Поскольку это struct, наследование не является проблемой (в противном случае «А» делает virtual проще) - так что я пошел бы с «B», просто потому, что я ожидаю, чтобы позвонить более +, чем я называю Add ... меньше косвенности.

Для class с подлинной потребностью в + и наследовании (маловероятно), я бы пошел «А».

2

Определенно A.

Методы - это настоящая вещь. Метод может получить дополнительные параметры, они могут быть помечены как виртуальные (=> могут быть переопределены), перегружены и, как правило, больше характер языка. Прежде чем искать практическую причину, я думаю, вам нужно это почувствовать. , кроме того, языковой протокол CIL не является обязательным для поддержки перегрузки оператора и такой явной победы в методе.

0

Я бы также пошел с A по многим причинам, указанным выше, в частности, потому что я рассматриваю перегрузку оператора как синтаксический механизм, который обертывает фактический метод.

Смежные вопросы