Я нашел Профилировщик Памяти.NET вчера, и я должен сказать, что очень впечатлен им.
я собираюсь заказать свою лицензию сегодня.
В C # ваши переменные никогда не изменяются вызываемыми объектами без явной передачи их в качестве ссылок (например, int.TryParse (s, out i)
, где вы явно указываете из
ключевое слово). Эта функция усложняет задачу, позволяя перегруженному оператору изменять содержимое операндов без вашего явного разрешения.
Например,
public static MyStruct operator + (ref MyStruct left, ref MyStruct right) {
left = new MyStruct(); // !!!!!!!!
return something(left, right);
}
Когда вы ссылаетесь на такой оператор в C #:
MyStruct x = new MyStruct();
MyStruct y = new MyStruct();
MyStruct z = x + y; // in C#, you never expect `x` to be changed.
Я думаю, это потому, что оператор (в более математической точке зрения, которую, кажется, принимает C #) логически является чем-то, что объединяет свои аргументы в новое значение и никогда не должен ничего изменять. C ++, похоже, рассматривает операторы скорее как версию общих операций с более удобным синтаксисом, чем функции, чем как способ представления математики в частности. Я думаю, что в C # вы почти никогда не встретите таких вещей, как определение операторов для потоковых операций и тому подобное.