- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 C# 中,我们可以在结构体方法参数上指定 in
,以便它们作为只读引用传递:
public int TimesTwo(in int number)
{
return number * 2;
}
这与使用 ref
几乎相同,但不允许修改参数:
public int TimesTwo(in int number)
{
number *= 2; // Compiler error
return number;
}
此外,它不需要像 ref
那样在调用时指定关键字:
var x = 1;
var y = TimesTwo(x);
var z = TimesTwo(in x);
// y and z are both 2
在某些情况下这是不可能的,例如当您需要修改参数或使用不允许 in
的异步或迭代器方法时。但问题是,在 99% 的情况下,参数只是读取,那么为什么不指定in
?
当未指定in
时,传递的参数将复制到局部变量。这种复制可能会花费一些时间,这对于紧密循环中的大型结构体来说是显而易见的,如 Microsoft says here 。
使用in
,引用被传递,因此不会发生复制。也许在大多数情况下,不复制节省的时间可以忽略不计,但我想知道除了标准的“它使代码困惑”或“这是一个你不应该担心的微优化”之外,是否还有其他原因。
据我所知,这种绕过结构复制的“微优化”正是引入 in
的原因。是否还有其他原因表明,对于性能关键型代码来说,将其扔到各处是一种不好的做法?
最佳答案
它也有利于紧密耦合。例如,MSDN 中的以下方法 ( https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/in-parameter-modifier ):
static void Method(in int argument)
{
// implementation removed
}
Method(5); // ok
Method(5L); // CS1503: no implicit conversion from long to int
这是一个有趣的优化链接(我复制了他们的结果)其中讨论了 readonly struct
、readonly ref
和 in
: https://faithlife.codes/blog/2017/12/in-will-make-your-code-slower/
Method Mean
PointByValue 25.09 ns
PointByRef 21.77 ns
PointByIn 34.59 ns // our guy
ReadOnlyPointByValue 25.29 ns
ReadOnlyPointByRef 21.78 ns
ReadOnlyPointByIn 21.79 ns
一些进一步的阅读(来源:Jon Skeet):
微优化:只读字段令人惊讶的低效
关于c# - 为什么不尽可能使用 "in"作为方法参数呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54472817/
我知道在 KDB 中,如果您有一个列表,例如... l:`apples`oranges`pears` 您可以像下面这样进行 N 次随机选择: 9?l 但是如何尽可能均匀地选择列表中的每个项目? 最佳答
我真的厌倦了它。我有一个高级 Web 应用程序依赖于大量 Javascript 库(jQuery、jQueryUI、OpenLayers、highcharts、EJSChart 等等)。不用说,Int
我是一名优秀的程序员,十分优秀!