Почему может '=' не быть перегруженным в C#?

Надеюсь, это показание кода может дать вам более четкую идею. В принципе, «это» в функции стрелок является текущей версией контекста «this». Смотрите код:

// 'this' in normal function & arrow function
var this1 = {
    number: 123,
    logFunction: function () { console.log(this); },
    logArrow: () => console.log(this)
};
this1.logFunction(); // Object { number: 123}
this1.logArrow(); // Window 
18
задан Svante 1 March 2009 в 13:46
поделиться

9 ответов

Память справилась, языки обычно работают со ссылками, а не объектами. При определении класса и его участников, Вы определяете поведение объекта, но когда Вы создаете переменную, Вы работаете со ссылками на те объекты.

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

Type var1 = new Type();
Type var2 = new Type();

var2 = var1;

В коде выше, два объекта создаются на "куче", одном отнесенном var1 и другом var2. Теперь последний оператор высказывает var2 контрольное мнение к тому же объекту, который отсылает var1. После той строки сборщик "мусора" может освободить второй объект и в памяти существует только один объект. В целом процессе никакая операция не применяется к самим объектам.

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

31
ответ дан 30 November 2019 в 05:45
поделиться

Если бы Вы перегрузились '=', то Вы никогда не были бы в состоянии изменить ссылку на объект после того, как она была создана.... думают об этом - какой-либо вызов к theObjectWithOverloadedOperator=something в перегруженном операторе привел бы к другому вызову к перегруженному оператору... поэтому, что будет действительно делать перегруженный оператор? Установка Maybe некоторые другие свойства - или устанавливание значения к новому объекту (неизменность)? Обычно не, что '=' подразумевает..

можно, однако, переопределить неявный & явные операторы броска: http://www.blackwasp.co.uk/CSharpConversionOverload.aspx

16
ответ дан 30 November 2019 в 05:45
поделиться

, поскольку действительно не имеет смысла делать так.

В C# = присваивает ссылку на объект на переменную. Таким образом, это воздействует на переменные и ссылки на объект, не сами объекты. Нет никакого смысла в перегрузке его в зависимости от типа объекта.

В операторе определения C++ = имеет смысл для классов, экземпляры которых могут быть созданы, например, на стеке, потому что сами объекты хранятся в переменных, не ссылках на них. Таким образом, имеет смысл определять, как выполнить такое присвоение. Но даже в C++, если у Вас есть набор полиморфных классов, которые обычно используются через указатели или ссылки, Вы обычно явно запрещаете копирование их как это путем объявления оператора = и копируете конструктора как частного (или наследовавшись повышению:: noncopyable), из-за точно тех же причин как, почему Вы не переопределяете = в C#. Просто, если у Вас есть ссылка или указатель класса A, Вы действительно не знаете, указывает ли это на экземпляр класса A или класса B, который является подклассом A. Вы действительно знаете, как выполнить = в этой ситуации?

8
ответ дан 30 November 2019 в 05:45
поделиться

На самом деле перегрузка operator = имела бы смысл, если Вы могли бы определить классы с семантикой значения <забастовка> и выделить объекты этих классов в стеке . Но в C# Вы не можете.

7
ответ дан 30 November 2019 в 05:45
поделиться

Одно возможное объяснение состоит в том, что Вы не можете сделать надлежащих ссылочных обновлений при перегрузке оператора присваивания. Это буквально завинтило бы семантику, потому что, когда люди будут ожидать, что ссылки обновят, Ваш =, оператор может также делать что-то еще полностью. Не очень дружелюбный программист.

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

4
ответ дан 30 November 2019 в 05:45
поделиться

Я не думаю, что существует любая действительно конкретная единственная причина указать на. Обычно я думаю, что идея идет как это:

  • , Если Ваш объект является большим, сложным объектом, делая что-то, что не является присвоением с =, оператор, вероятно, вводит в заблуждение.

  • , Если Ваш объект является маленьким объектом, можно также сделать его неизменным и возвратить новые копии при выполнении операций на нем, так, чтобы оператор присваивания работал способ, которым Вы ожидаете из поля (как System.String делает.)

3
ответ дан 30 November 2019 в 05:45
поделиться

Позволяется в C++ и если не осторожный, это может привести к большому поиску ошибки и беспорядку.

Эта статья объясняет это в мельчайших подробностях.

http://www.relisoft.com/book/lang/project/14value.html

1
ответ дан 30 November 2019 в 05:45
поделиться

Можно перегрузить присвоение в C#. Просто не на всем объекте, только на членах его. Вы объявляете свойство с методом set:

class Complex
{
    public double Real
    {
        get { ... }
        set { /* do something with value */ }
    }

    // more members
}

Теперь, когда Вы присваиваете Real, Ваши собственные выполнения кода.

причина, присвоение на объект не заменимо, состоит в том, потому что это уже определяется языком для значения чего-то жизненно важного.

3
ответ дан 30 November 2019 в 05:45
поделиться

Поскольку стрельба в себя в ноге осуждена.

На более серьезной ноте можно только надеяться, что Вы имели в виду сравнение, а не присвоение. Платформа делает тщательно продуманное условие для вмешательства с оценкой равенства/эквивалентности, ищите "compar" в справке или онлайн с MSDN.

0
ответ дан 30 November 2019 в 05:45
поделиться
Другие вопросы по тегам:

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