Подтвердить что ты не робот

Перегрузка оператора присваивания в С#

Я знаю, что оператор = не может быть перегружен, но должен быть способ сделать то, что я хочу здесь:

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

Итак, я мог бы пойти,

Velocity ms = 0;
ms = 17.4;
ms += 9.8;

и др.

Я не уверен, как это сделать. Я решил, что просто напишу несколько таких классов:

class Power
{
    private Double Value { get; set; }

    //operator overloads for +, -, /, *, =, etc
}

Но, видимо, я не могу перегрузить оператор присваивания. Есть ли способ получить это поведение?

4b9b3361

Ответ 1

Похоже, вы должны использовать структуру, а не класс..., а затем создать неявный оператор преобразования, а также различные операторы для добавления и т.д.

Вот пример кода:

public struct Velocity
{
    private readonly double value;

    public Velocity(double value)
    {
        this.value = value;
    }

    public static implicit operator Velocity(double value)
    {
        return new Velocity(value);
    }

    public static Velocity operator +(Velocity first, Velocity second)
    {
        return new Velocity(first.value + second.value);
    }

    public static Velocity operator -(Velocity first, Velocity second)
    {
        return new Velocity(first.value - second.value);
    }

    // TODO: Overload == and !=, implement IEquatable<T>, override
    // Equals(object), GetHashCode and ToStrin
}

class Test
{
    static void Main()
    {
        Velocity ms = 0;
        ms = 17.4;
        // The statement below will perform a conversion of 9.8 to Velocity,
        // then call +(Velocity, Velocity)
        ms += 9.8;
    }
}

(В качестве побочной заметки... Я не вижу, как это действительно представляет скорость, так как это, безусловно, требует как направления, так и величины).

Ответ 2

Вы можете создавать неявные операторы преобразования. Хороший пример: страница в MSDN.

Это также хорошая идея сделать их неизменяемыми структурами. Именно это и есть "примитивы", и то, что делает невозможным унаследовать их. Вам нужна структура, потому что вы хотите семантику типа значения, а не семантику ссылочного типа. И вы хотите, чтобы они были неизменными, потому что изменяемые типы значений обычно представляют собой плохую идею.

Ответ 3

Я думаю, что он не может быть перегружен, потому что все классы С# производны от Object, поэтому они являются в основном объектами, и когда вы используете операторы присваивания, вы в основном просто ссылаетесь на другой объект. С другой стороны, если вы используете структуру, то вам в основном нужна вся информация, поэтому, когда вы используете оператор =, все поля будут скопированы.

Итак, я бы сказал, посмотри на него и реализуй функцию Copy(), и вы должны быть в порядке: -)