C#7.2引入了in参数的修饰符,这对于结构特别是对于只读结构非常有意义.
它也可以用于参考类型
void Method(in StringBuilder value) { }
Run Code Online (Sandbox Code Playgroud)
默认情况下,引用类型是通过引用传递的,in上面的示例中只是一个冗余修饰符吗?
value = null你使用时是禁止的in,这是否意味着它只是通过将原始引用传递给堆位置并阻止更改来保留引用地址的副本?
in被编译成IL以完全相同的方式ref,除了in参数标有IsReadOnly属性.
这意味着in行为完全如此ref,但编译器(不是运行时)强制您不为in参数赋值.
因此,正如您正确指出的那样 - inreferenece-type参数通过引用传递(这意味着引用不会被复制并指向原始位置),但编译器会阻止您更改它.对于引用类型,我并没有真正看到它有多大用处,但是至少为了保持一致性,它不会受到影响.