![]() |
1
12
是的,尽管我会用另一种方式陈述。您的意思是“is”是一个语法甜头,后面跟着空检查。我会用另一种方式说:“as”是“检查类型实现、如果成功则强制转换、如果失败则为空”的语法甜头。 也就是说,我更倾向于说
实际上相当于
你想用“is”来定义“as”,而不是用另一种方式。问题真的应该是“为什么要像现在这样实施?”:-)
因为那是 规范的正确实施 . 我想我不是按照你的思路来的。这个实现有什么问题吗?您希望如何实现它?您可以使用“isist”和“castclass”指令;描述您希望看到的程序的代码生成器。 |
![]() |
2
9
那么,可用的IL指令(isist)将返回适当类型的对象,或者如果不可能进行这种转换,则返回空值。如果无法进行转换,则不会引发异常。 考虑到这一点,“is”和“as”都很容易实现。在这种情况下,我不会声称“is”实现为“as”,只是基础IL指令允许两者同时发生。现在,为什么编译器不能将“is”和“a s”优化为单个is is t调用,这是另一回事。在这种情况下,它可能与变量作用域有关(即使到了IL的时候,作用域并不真正存在) 编辑 再想一想,在不知道讨论中的变量不受其他线程更新的影响的情况下,不能将“is”后跟“as”优化为单个is is t调用。 假设x是一个字符串:
这里,y应该为空。 |
![]() |
3
5
在您的示例中,使用
或者,使用转换
|
![]() |
4
5
首先,我不同意您的前提,即这是更典型的用例。它可能是您最喜欢的方法,但惯用的方法是“as+null check”样式:
正如您发现的那样,“is”方法需要额外的“as”或强制转换,这就是为什么在我的经验中,“as”带空检查是执行此操作的标准方法。 我认为这种“as”方法没有什么冒犯性,就我个人而言,我认为它在眼睛上没有比任何其他代码更令人不快的了。
至于你的实际问题,为什么
|
![]() |
5
2
你一秒钟也不做
|
![]() |
6
1
你现在可以把代码写成
我想说的更清楚一点,但如果没有编译器真正的魔力,速度就不会那么快。 |
![]() |
7
1
根据博客帖子 How Many Passes? 作者埃里克·利珀特,这是一个编译器的通行证。引述:
因此,也许这就是为什么您看到为两个片段生成的相同CIL的原因。 |
![]() |
8
0
如果将声明放在循环中,“y”的范围将减小。 写这篇文章的人可能更喜欢将“x”转换为“t”而不是“(t)x”,并希望限制“y”的范围。 |
![]() |
9
0
您忘记了值类型。如:
不会编译为无法这样转换值类型。 |
![]() |
10
-1
我强烈怀疑 是 比快 作为 不需要分配。因此,如果x很少是条形的,那么第一个片段是好的。如果x主要是bar,那么 作为 建议,因为不需要第二次铸造。这取决于代码的用法和环境。 |
![]() |
Emopusta · 从后端到前端的图像路径不工作 2 年前 |
![]() |
Asdrubal Hernandez · Linq查询特定数组索引出错 2 年前 |
![]() |
Niyazi Babayev · 如何在表达式中动态应用表达式? 2 年前 |
|
Dansih · .Net核心自定义身份验证方案 2 年前 |
![]() |
lolorekkk · 面板插入。NET WinForm 2 年前 |