Два образца кода абсолютно идентичны на 100%; мы можем проверить это, посмотрев на IL, что можно сделать разными способами, но наиболее удобным для ad-ho c вещей является 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 вот так , и если вы посмотрите справа, 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