Надеюсь, это показание кода может дать вам более четкую идею. В принципе, «это» в функции стрелок является текущей версией контекста «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
Память справилась, языки обычно работают со ссылками, а не объектами. При определении класса и его участников, Вы определяете поведение объекта, но когда Вы создаете переменную, Вы работаете со ссылками на те объекты.
Теперь, оператор = применяется к ссылкам, не объектам. При присвоении ссылки на другого, Вы на самом деле высказываете контрольное мнение получения к тому же объекту, который другая ссылка.
Type var1 = new Type();
Type var2 = new Type();
var2 = var1;
В коде выше, два объекта создаются на "куче", одном отнесенном var1 и другом var2. Теперь последний оператор высказывает var2 контрольное мнение к тому же объекту, который отсылает var1. После той строки сборщик "мусора" может освободить второй объект и в памяти существует только один объект. В целом процессе никакая операция не применяется к самим объектам.
Возвращение к тому, почему = не может быть перегружен, внедрение систем является единственной разумной вещью, которую можно сделать со ссылками. Можно перегрузить операции, которые применяются к объектам, но не к ссылкам.
Если бы Вы перегрузились '=', то Вы никогда не были бы в состоянии изменить ссылку на объект после того, как она была создана.... думают об этом - какой-либо вызов к theObjectWithOverloadedOperator=something в перегруженном операторе привел бы к другому вызову к перегруженному оператору... поэтому, что будет действительно делать перегруженный оператор? Установка Maybe некоторые другие свойства - или устанавливание значения к новому объекту (неизменность)? Обычно не, что '=' подразумевает..
можно, однако, переопределить неявный & явные операторы броска: http://www.blackwasp.co.uk/CSharpConversionOverload.aspx
, поскольку действительно не имеет смысла делать так.
В C# = присваивает ссылку на объект на переменную. Таким образом, это воздействует на переменные и ссылки на объект, не сами объекты. Нет никакого смысла в перегрузке его в зависимости от типа объекта.
В операторе определения C++ = имеет смысл для классов, экземпляры которых могут быть созданы, например, на стеке, потому что сами объекты хранятся в переменных, не ссылках на них. Таким образом, имеет смысл определять, как выполнить такое присвоение. Но даже в C++, если у Вас есть набор полиморфных классов, которые обычно используются через указатели или ссылки, Вы обычно явно запрещаете копирование их как это путем объявления оператора = и копируете конструктора как частного (или наследовавшись повышению:: noncopyable), из-за точно тех же причин как, почему Вы не переопределяете = в C#. Просто, если у Вас есть ссылка или указатель класса A, Вы действительно не знаете, указывает ли это на экземпляр класса A или класса B, который является подклассом A. Вы действительно знаете, как выполнить = в этой ситуации?
На самом деле перегрузка operator =
имела бы смысл, если Вы могли бы определить классы с семантикой значения <забастовка> и выделить объекты этих классов в стеке забастовка>. Но в C# Вы не можете.
Одно возможное объяснение состоит в том, что Вы не можете сделать надлежащих ссылочных обновлений при перегрузке оператора присваивания. Это буквально завинтило бы семантику, потому что, когда люди будут ожидать, что ссылки обновят, Ваш =, оператор может также делать что-то еще полностью. Не очень дружелюбный программист.
можно использовать неявный и явный к/от операторам преобразования для смягчения некоторых кажущихся недостатков не способный перегрузить присвоение.
Я не думаю, что существует любая действительно конкретная единственная причина указать на. Обычно я думаю, что идея идет как это:
, Если Ваш объект является большим, сложным объектом, делая что-то, что не является присвоением с =
, оператор, вероятно, вводит в заблуждение.
, Если Ваш объект является маленьким объектом, можно также сделать его неизменным и возвратить новые копии при выполнении операций на нем, так, чтобы оператор присваивания работал способ, которым Вы ожидаете из поля (как System.String
делает.)
Позволяется в C++ и если не осторожный, это может привести к большому поиску ошибки и беспорядку.
Эта статья объясняет это в мельчайших подробностях.
Можно перегрузить присвоение в C#. Просто не на всем объекте, только на членах его. Вы объявляете свойство с методом set:
class Complex
{
public double Real
{
get { ... }
set { /* do something with value */ }
}
// more members
}
Теперь, когда Вы присваиваете Real
, Ваши собственные выполнения кода.
причина, присвоение на объект не заменимо, состоит в том, потому что это уже определяется языком для значения чего-то жизненно важного.
Поскольку стрельба в себя в ноге осуждена.
На более серьезной ноте можно только надеяться, что Вы имели в виду сравнение, а не присвоение. Платформа делает тщательно продуманное условие для вмешательства с оценкой равенства/эквивалентности, ищите "compar" в справке или онлайн с MSDN.