С точки зрения производительности, вероятно, не очень. Вы добавляете дополнительную разыменование.
Возьми код
public class C
{
public void WithoutIn(string s)
{
Console.WriteLine(s);
}
public void WithIn(in string s)
{
Console.WriteLine(s);
}
}
Это выглядит как:
C.WithoutIn(System.String)
L0000: mov ecx, edx
L0002: call System.Console.WriteLine(System.String)
L0007: ret
C.WithIn(System.String ByRef)
L0000: mov ecx, [edx]
L0002: call System.Console.WriteLine(System.String)
L0007: ret
( 1010 * SharpLab *).
Единственная разница - mov ecx, [edx]
, а не mov ecx edx
. Я полагаю, что разыменование немного замедлит ход событий, но не на какую-либо заметную величину.
На практике это означает, что вы не можете сделать это:
public void M(in string s)
{
s = "foo"; // CS8331: Cannot assign to variable 'in string' because it is a readonly variable
}
in
был добавлен в язык для улучшения поддержки передачи структур по ссылке. Я бы поставил под сомнение любой код, который использовал его со ссылочным типом: я бы предположил, что он возник в результате того, что тип значения впоследствии был изменен на ссылочный тип, а не из-за какого-то преднамеренного решения.