|
|
1
52
一种可行的方法是编写这两种方法:
编译和使用
|
|
|
2
36
根据Aakash的回答,这是IL:(谢谢) LINQPad )
|
|
3
32
为什么这么多人被那些愚蠢的老板诅咒?革命,兄弟们!
你的老板需要阅读文件。
更新 在对这个问题的评论中,汉斯·帕桑特问道
一个自我包含的表达式的例子是:
但这与:
换句话说,这与
|
|
|
4
32
这根本不是真的。
它使代码变短,一些人发现它更可读(其他人发现它不可读),但没有任何性能损失。 |
|
|
5
10
也许你的老板是一个习惯于
有时人们会感到困惑。询问你的老板关于他的视觉基础战争故事。同时倾听、学习和获得一些同情!当你离开办公室时,你可以指出C编译器在编译时计算出这些东西,而“装箱”不再是问题了。 不要指望你的老板必须跟上语言/API的最新变化。这不是为了装傻。这是关于有其他事情要做。例如,他的工作。
编辑:
但是,正如下面的评论所指出的,告诉你不要使用
|
|
|
6
3
实际上,在一些非常具体的实例中,var也可以避免装箱。
导致以下IL:
注意,第二个(var赋值)知道这个返回值是来自内部列表的valuetype(struct),并且可以更有效地使用它——即使来自list.getEnumerator的约定返回一个IEnumerator。这将删除该结构上的装箱操作,并产生更高效的代码。 这就是为什么,例如,在以下代码中,foreach循环和第一个using/while对不会导致垃圾(由于缺少装箱),但第二个using/while循环会导致垃圾(因为它装箱返回的结构):
还要注意,将其从“list”更改为“ilist”将破坏此优化,因为ilist只能推断IEnumerator类型的接口正在返回。使用list变量,编译器可以更智能,并且可以看到唯一有效的返回值是[mscorlib]system.collections.generic.list`1/枚举器,因此可以优化调用以处理此问题。 虽然我了解这是一个非常有限的情况,但它可能是一个重要的情况,尤其是在不进行完全增量垃圾收集和暂停线程以进行标记/扫描的设备上。 |