Существует ли обходное решение для перегрузки оператора присваивания в C#?

32
задан Steve 8 August 2013 в 14:23
поделиться

4 ответа

Это все еще не, вообще очищаются мне, что Вам действительно нужно это. Также:

  • Ваш тип Числа должен быть структурой (который вероятен - числа являются наиболее распространенным примером структур). Обратите внимание, что все типы, как которые Вы хотите, чтобы Ваш тип действовал (интервал, десятичное число и т.д.) являются структурами.

или:

  • Ваш тип Числа должен быть неизменным, заставив каждую операцию мутации возвратить новый экземпляр, в этом случае Вам не нужны данные, которые будут скопированы на присвоении так или иначе. (На самом деле Ваш тип должен быть неизменным, является ли это структурой. Изменяемые структуры являются злыми, и число, конечно, не должно быть изменяемым ссылочным типом.)
28
ответ дан Jon Skeet 27 November 2019 в 20:12
поделиться

можно использовать 'неявное' ключевое слово для создания перегрузки для присвоения:

предположим у Вас есть тип как Foo, которого Вы чувствуете, неявно конвертируемо от строки. Вы записали бы следующий статический метод в своем классе Foo:

public static implicit operator Foo(string normalString)
{
    //write your code here to go from string to Foo and return the new Foo.
}

сделавший это, можно затем использовать следующее в коде:

Foo x = "whatever";
44
ответ дан Jonathan Wood 27 November 2019 в 20:12
поделиться

Вы не будете в состоянии работать вокруг этого имеющий взгляд C++, начиная с = b; имеет другую семантику в C++, чем в C#. В C#, = b; высказывает мнение к тому же объекту как b. В C++ = b изменяет содержание a. У обоих есть их взлеты и падения. Это похоже на Вас, делают

MyType * a = new MyType();
MyType * b = new MyType(); 
a = b; /* only exchange pointers. will not change any content */

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

обходное решение легко:

MyType a = new MyType();
MyType b = new MyType();

// instead of a = b
a.Assign(b);

Правовая оговорка : я не разработчик C#

, Вы могли создать свойство только для записи как это. тогда сделайте a. Сам = b; выше.

public MyType Self {
    set {
        /* copy content of value to this */
        this.Assign(value);
    }
}

Теперь, это не хорошо. Так как это нарушает principle-of-least-surprise (POLS). Нельзя было бы ожидать изменяться, если Вы делаете a. Сам = b;

6
ответ дан Johannes Schaub - litb 27 November 2019 в 20:12
поделиться

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

Операции, который изменяет данные, конечно, возвратили бы новые экземпляры.

3
ответ дан Cristian Libardo 27 November 2019 в 20:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: