Я немного запутался в модификаторе параметра in:
Я знаю, если я пишу перед параметром, это ссылка только для чтения, что быстрее, чем передача большого количества по значению. Согласно документации https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/in-parameter-modifier говорится, что модификатор параметра in является необязательным на месте вызова:
Указывать аргументы на сайте вызова обычно необязательно. Нет семантической разницы между передачей аргументов по значению и передачей их по ссылке с использованием модификатора in. Модификатор in на сайте вызова является необязательным, поскольку вам не нужно указывать, что значение аргумента может быть изменено. Вы явно добавляете модификатор in на сайт вызова, чтобы аргумент передавался по ссылке, а не по значению. Явное использование in имеет следующие два эффекта:
Во-первых, указание на сайте вызова вынуждает компилятор выбирать метод, определенный с соответствующим параметром. В противном случае, когда два метода отличаются только наличием in, перегрузка по значению является лучшим совпадением.
Во-вторых, указание в декларирует ваше намерение передать аргумент по ссылке
Когда я использую его в своем коде:
public static kAssetKind? DetermineAssetKind(in string extension)...
И я называю это здесь:
...{FilePath = mainFile, Kind = DetermineAssetKind(Path.GetExtension(mainFile)) ?? kAssetKind.Other};
все в порядке, строка передается по ссылке, но если я напишу прежде:
DetermineAssetKind(in Path.GetExtension(mainFile))
в получить ошибку, что она может быть передана по ссылке. Таким образом, существует разница между входящим на месте вызова и он говорит: «Во-вторых, указание на объявляет ваше намерение передать аргумент по ссылке», но я подумал, что он передаст его по ссылке, даже если я не буду использовать входящий на месте вызова? И имеет ли смысл передавать строку, как в ссылке, потому что классы являются ссылками?