我只是好奇,使用in关键字作为引用类型参数(如字符串)是否有任何优势?
样品:
bool IsNice(字符串灰烬){ return greeding.Contains(“:-)”);}VS
…
在性能方面,可能并不多。您正在添加额外的解除引用。
拿代码
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
( SharpLab )。
唯一的区别是 mov ecx, [edx] 而不是 mov ecx edx 。我认为这种解除引用会使事情略微减慢,但不会以任何可观察的数量减慢。
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 已添加到语言中以增强对通过引用传递结构的支持。我会对使用引用类型的任何代码提出疑问:我假设它是由于值类型稍后被更改为引用类型而导致的,而不是因为一些刻意的决定。
in
来自“ 在C#7.2中的参数 - 只读参考 “:
在C#中的参数只是ref参数,除了它们在方法内是只读的。并且,它们无法进一步修改。你只能推荐它们。
那么只读?
两者表现不同。
在第二个示例中,方法将观察对通过引用传递的变量所做的任何更改。
在第一种情况下,你没有传入一个变量,你只是传入一个值。如果通过获取变量的值获得该值,则不会观察到之后对该变量的任何更改。
在初始调用方法之后变量很难改变,所以我不希望它在实践中经常发生变化,但它是可能的。