C# 7.2 использование "в параметре" для операторов

В 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#, но мне любопытно, будет ли это иметь эффект.

0 ответов

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

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

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

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

Другие вопросы по тегам