我基本上创建了一个轻量级类,它传递了大约10个参数,它不会改变这些参数,它只是在构造函数中将它们存储在本地.
一些是引用类型(字符串,类),其他是值类型(int,bool,enums).
我的问题是我应该用关键字'ref'传递这些(除了我的类)吗?
我在这里考虑的是表现.
在C#中,我们可以in在struct方法参数上指定它们,以便它们作为只读引用传递:
public int TimesTwo(in int number)
{
return number * 2;
}
Run Code Online (Sandbox Code Playgroud)
这与使用几乎相同,ref但不允许修改参数:
public int TimesTwo(in int number)
{
number *= 2; // Compiler error
return number;
}
Run Code Online (Sandbox Code Playgroud)
此外,它不需要在调用时指定关键字,例如ref:
var x = 1;
var y = TimesTwo(x);
var z = TimesTwo(in x);
// y and z are both 2
Run Code Online (Sandbox Code Playgroud)
在某些情况下,这是不可能的,例如当您需要修改参数或使用不允许的异步或迭代器方法时in.但问题是,在99%的只读参数的情况下,为什么不指定in?
如果in是没有指定,传递的参数将被复制到一个局部变量.这种复制可能需要一段时间,可以是明显的在狭小的循环大结构,如微软在这里说.
使用in,传递参考,因此不会进行复制.在大多数情况下,节省时间而不是复制的时间可以忽略不计,但我想知道除了标准"它是否使代码混乱"或"它是一个你不应该担心的微优化"之外是否有任何其他原因.
据我所知,这种绕过结构复制的"微优化"正是为什么in要引入的.还有其他原因导致为什么只是将它扔到各处以获得性能关键代码都是不好的做法?