Какие модификаторы аргументов методов существуют в C# кроме ref
Что проверяют
Знаете ли вы механику передачи аргументов по ссылке и ограничения каждого модификатора, а не только их список. Почти всегда следом спрашивают разницу между ref, out и in и почему in иногда замедляет код.
Как отвечать
Модификаторы параметров помимо ref:
out: передача по ссылке для возврата значения. Вызывающему не нужно инициализировать переменную, а метод обязан присвоить её до выхода. С C# 7 её можно объявить прямо в вызове,int.TryParse(s, out var n), или отбросить черезout _;in: ссылка только для чтения, появилась в C# 7.2. Нужна для больших структур, чтобы не копировать их. На месте вызоваinможно не писать, и компилятор примет даже литерал, создав временную переменную;ref readonly: C# 12. Похож наin, но показывает, что ожидается именно переменная, и на литерал выдаёт предупреждение;params: переменное число аргументов, только последним параметром и только один. До C# 13 это был только массив, теперь допустимыSpan<T>,ReadOnlySpan<T>и коллекции вродеList<T>иIEnumerable<T>. Вариант сReadOnlySpan<T>избавляет от аллокации массива на каждый вызов;this: у первого параметра метода в статическом классе, делает метод расширения;scoped: C# 11, ограничивает время жизниref-параметра илиref struct, чтобы ссылку нельзя было вернуть из метода.
Ограничения тоже спрашивают: у async-методов и итераторов не бывает параметров ref, in и out, а лямбда не может захватить ref-параметр. Перегрузки не могут отличаться только выбором между ref, in и out.
Где спотыкаются
Называют default модификатором. T item = default это значение необязательного параметра, а не способ передачи.
Советуют in для любых структур. Если структура не readonly, при вызове её методов компилятор делает защитную копию, и выигрыш превращается в потерю.
Считают, что ref для ссылочного типа ничего не меняет. Без ref метод получает копию ссылки и может менять сам объект, но не переменную вызывающего. С ref он может присвоить ей новый экземпляр.