gpt4 book ai didi

c# - 在 C# 中使用 "is"后跟 "as"而不是 "as"后跟 null 检查有什么意义?

转载 作者:IT王子 更新时间:2023-10-29 04:30:54 26 4
gpt4 key购买 nike

在阅读 C# 代码时,我发现了一个相当奇怪的片段:

if( whatever is IDisposable) {
(whatever as IDisposable).Dispose();
}

我宁愿希望这样做是这样的:

if( whatever is IDisposable) { //check
((IDisposable)whatever).Dispose(); //cast - won't fail
}

或者像这样:

IDisposable whateverDisposable = whatever as IDisposable;
if( whateverDisposable != null ) {
whateverDisposable.Dispose();
}

我的意思是 as 就像一个转换,但在失败时返回 null。在第二个片段中,它不会失败(因为之前有一个 is 检查)。

像第一个片段而不是第二个或第三个片段那样编写代码有什么意义?

最佳答案

你是对的。第一个片段没有意义。

从备选方案来看,我会推荐第三个,因为它是线程安全的,因为在检查和方法调用之间,对象不能被另一个不实现接口(interface)的对象替换。考虑第二个片段的以下场景:

if (whatever is IDisposable) { //check 
// <-- here, some other thread changes the value of whatever
((IDisposable)whatever).Dispose(); // could fail
}

第三个片段不会发生这种情况。

注:有some subtle differences关于用户定义的转换,在强制转换和 as 之间,但它们不适用于这种情况。

关于c# - 在 C# 中使用 "is"后跟 "as"而不是 "as"后跟 null 检查有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7146902/

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