C # 7.2 использование «в параметре» для операторов - PullRequest
0 голосов
/ 12 октября 2018

В C # 7.2 мы видели введение модификатора in для параметров метода для передачи ссылок на объекты только для чтения.Я работаю над новым проектом .NET Standard, используя 7.2, и из любопытства я попытался скомпилировать с ключевым словом in параметры для операторов равенства для структуры.

т.е. - public static bool operator == (in Point l, in Point r)

не - public static bool operator == (Point l, Point r)

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

Так что мой вопрос заключается в том, действительно ли этоимеет функциональное различие, и если это так, есть ли какая-либо особая причина поощрять или препятствовать использованию in с аргументами оператора.Мои первоначальные мысли заключаются в том, что нет никакой разницы, особенно если оператор встроен.Однако, если это действительно имеет значение, кажется, что параметры должны использоваться везде ( везде, где имеют смысл только ссылки для чтения, то есть ), поскольку они обеспечивают бонус скорости, и, в отличие от ref иout, не требуйте от пользователя добавлять эти ключевые слова при передаче объектов.Это позволит более эффективно передавать объект типа значения без единого изменения пользователя методов и операторов.

В целом, это может выходить за рамки мелкомасштабных оптимизаций, о которых беспокоится большинство разработчиков C #, ноМне любопытно, имеет ли это эффект.

1 Ответ

0 голосов
/ 04 февраля 2019

независимо от того, имеет ли это на самом деле функциональную разницу ... Мои первоначальные мысли о том, что нет никакой разницы, особенно если оператор встроен

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

есть ли какая-либо конкретная причина, чтобы поощрять или препятствовать использованию аргументов in с аргументами оператора.

Согласно этой статье рекомендуется применятьМодификатор in, когда типы значений больше System.IntPtr.Size.Но важно, чтобы тип значения был readonly struct.В противном случае модификатор in может нанести ущерб производительности, поскольку компилятор создаст защитную копию при вызове методов и свойств struct, поскольку они могут изменить состояние аргумента.

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