gpt4 book ai didi

c# - 使用 'is' 关键字的局部变量声明 VS 'as' 关键字的性能差异

转载 作者:行者123 更新时间:2023-12-05 07:04:51 25 4
gpt4 key购买 nike

object obj = "Hello";

// is keyword
if (obj is string str1)
{
Console.WriteLine(str1);
}

// as keyword
string str2 = obj as string;
if (str2 != null)
{
Console.WriteLine(str2);
}

在上面的代码中,局部变量是用'is'关键字声明的,但是'as'关键字在性能上有什么区别吗?

我想知道是否存在与转换和空值检查相关的性能差异。 (除了 str1 和 str2 变量的局部作用域差异之外)

最佳答案

这两个代码示例绝对 100% 相同;我们可以通过查看 IL 来测试这一点,这可以通过多种方式完成,但对于临时事情最方便的是 https://sharplab.io/

考虑:

using System;
public class C {
object obj = "Hello";
public void ViaIsWithCapture()
{
// is keyword
if (obj is string str1)
{
Console.WriteLine(str1);
}
}
public void ViaAsThenNullTest()
{
// as keyword
string str2 = obj as string;
if (str2 != null)
{
Console.WriteLine(str2);
}
}
}

我们可以通过 sharplab.io 运行它 like this ,如果您向右看,两个版本的 IL 相同:

    .method public hidebysig 
instance void ViaIsWithCapture () cil managed
{
// Method begins at RVA 0x2050
// Code size 22 (0x16)
.maxstack 1
.locals init (
[0] string str1
)

IL_0000: ldarg.0
IL_0001: ldfld object C::obj
IL_0006: isinst [System.Private.CoreLib]System.String
IL_000b: stloc.0
IL_000c: ldloc.0
IL_000d: brfalse.s IL_0015

IL_000f: ldloc.0
IL_0010: call void [System.Console]System.Console::WriteLine(string)

IL_0015: ret
} // end of method C::ViaIsWithCapture

对比

    .method public hidebysig 
instance void ViaAsThenNullTest () cil managed
{
// Method begins at RVA 0x2074
// Code size 22 (0x16)
.maxstack 1
.locals init (
[0] string str2
)

IL_0000: ldarg.0
IL_0001: ldfld object C::obj
IL_0006: isinst [System.Private.CoreLib]System.String
IL_000b: stloc.0
IL_000c: ldloc.0
IL_000d: brfalse.s IL_0015

IL_000f: ldloc.0
IL_0010: call void [System.Console]System.Console::WriteLine(string)

IL_0015: ret
} // end of method C::ViaAsThenNullTest

关于c# - 使用 'is' 关键字的局部变量声明 VS 'as' 关键字的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62859750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com