C#中的'Is'运算符是线程安全/原子的吗?

C#中的'Is'运算符是线程安全/原子的吗?,c#,multithreading,atomicity,C#,Multithreading,Atomicity,以下代码是线程安全的吗 public object DemoObject {get;set;} public void DemoMethod() { if (DemoObject is IDemoInterface demo) { demo.DoSomething(); } } 如果其他线程在处理DemoMethod时修改DemoObject(例如设置为null),是否保证在If块中,局部变量demo始终被正确分配(分配给IDemoInterface类

以下代码是线程安全的吗

public object DemoObject {get;set;}

public void DemoMethod()
{
    if (DemoObject is IDemoInterface demo)
    {
        demo.DoSomething();
    }
}

如果其他线程在处理
DemoMethod
时修改
DemoObject
(例如设置为null),是否保证在
If
块中,局部变量
demo
始终被正确分配(分配给
IDemoInterface
类型的实例)?

它是安全的,对象引用在.NET内存模型中是原子的,这是垃圾收集器工作所必需的。您不会得到NullReferenceException。这仍然是一场竞赛,您无法预测DoSomething()是否会执行。这本身就足以称之为“臭虫!”@汉斯:你能详细说明一下吗?为什么会有竞争?为什么我不能预测DoSomething()是否会执行?当然,公共
DemoObject
可能会在评估
if
和调用
demo.DoSomething
之间发生变化,但访问本地
demo
是安全的。为什么你会认为这是一个错误?