- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
提前致歉:这个问题来自一位试图学习高级 C# 的顽固的、未经改革的 C++ 开发人员。请考虑以下事项:
if (myUserDefinedObject != null)
{
myUserDefinedObject.ToString();
}
这显然不是线程安全的。另一方面,我看过两个教程说 ?。 (空条件运算符或“猫王运算符”)例如,
myUserDefinedObject?.ToString();
是线程安全的。除非编译器将 [mutex?] 锁包裹起来(颤抖),否则我不明白这怎么可能是真的。如果这个习语是线程安全的,有人可以指出我如何实现的技术描述吗?如果它不是线程安全的,有没有人有实际说明它不是线程安全的引用资料?
最佳答案
我想澄清 BJ Myers 的(正确)答案。
在 C# 中,可以将事件视为委托(delegate)类型的字段——就像可以将属性视为属性类型的字段一样——并且该“字段”的值可以为空。如果您遇到一个不幸的情况,在一个线程上修改了事件处理程序,而另一个线程正在尝试调用它,您可能会遇到以下情况:
if (this.SomeEvent != null)
this.SomeEvent( ... );
不是线程安全的。该值可能会发生变化,以便在检查前为非空,在检查后为空,然后程序崩溃。
使此“线程安全”的常用方法(我建议使用该术语)是将值复制到本地,然后测试本地是否为空。这样做的好处是不会因 null 取消引用而崩溃。然而,聪明的开发者会注意到仍然存在竞争!顺序可以是
所以从这个意义上说,这种模式不是“线程安全的”。如果您处于这种不幸的境地,您有责任确保实现适当的线程逻辑,以免发生这种情况。你可以随心所欲地这样做。如果您想要能够在一个线程上调用事件处理程序同时在另一个线程上改变事件的(可疑的)好处,那么您必须付出代价以使其安全或处理竞争条件错误。
我个人会像避免瘟疫一样避免这种情况,但我不够聪明,无法编写正确的多线程代码。
现在,至于实际问题:
some_expression ?. ToString();
与
相同temp = some_expression
temp == null ? null : temp.ToString()
您认为后一种代码是“线程安全的”吗?
关于c# - 是 C# 6 吗? (Elvis op)线程安全吗?如果是这样,如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35784874/
谁能解释ternary operator shorthand 之间的区别? (?:) 和 null coalescing operator (??) 在 PHP 中? 他们什么时候表现不同,什么时候表
下面的代码将打印B null?.let { println("A") } ?: println("B") 但是下面的代码没有渲染B null?.let { Text(text = "A
在 Elvis Operator 时遇到了一个有趣的案例?:不当行为。 想象一下有这样的东西 base64ToBmp(str)?.let { } ?: run { } 并在一些旧手机和模拟器上看到
让我们编写这样的代码(App.xaml.xs 的片段): public class MethodClass { public async Task Job() { De
我在 Angular 2 中的网站进展得越多,Elvis Operator 似乎就越多。是使这一切成为可能的神奇力量。我采取的每一步都涉及弄清楚如何将它正确地应用于对数据完成的所有事情的每个实例。我觉
elvis 运算符,又名 null 条件运算符,非常酷。 在 LINQ 查询中,它与 null 合并“??”一起工作得很好运营商。 Somedata.Where(dt=>(dt?.Inner?.Inn
所以我可以替换旧的三元运算: def something = mainThing != null ? mainThing : "gone!" 使用 Elvis 运算符: def something =
如果 nextbitmap() 的结果为 null,则 Kotlin 中的以下代码从父函数返回 val bitmap = nextbitmap() ?: return // something t
遇到 Kotlin elvis 运算符的一些奇怪行为,当尝试从映射中通过键获取某个值时,没有一个 block 不被执行。 map["Key"]?.let { println("Run bloc
我想知道 ?:如果以下函数调用之一返回 null,则调用 elvis 运算符. private fun extractProductAttributes(productEntity: JSONOb
我真的不知道如何命名标题,因此我将尽我所能解释它: val a = b ?: ({ val temp = c.evaluate() store(temp) temp // re
在我的代码中,我发现我的方法可能返回 null 的情况。在这种情况下,我宁愿抛出异常也不愿返回 null。但是我不想使用常规 if 因为在我看来它看起来很糟糕。参见代码: class Type{} @
问题:Elvis 运算符 是否计划在未来的 Java 版本中实现?或者是否有任何库将其引入 Java? 我读过 it was proposed for Java SE 7 but didn't mak
这个问题在这里已经有了答案: Is there a null-coalescing (Elvis) operator or safe navigation operator in javascrip
所以我有一个来自服务器的复杂日期模型来提供我的 Angular2 组件。下面显示了该组件模板的一小部分: {{Person.Address.City}} Address 可能是
许多语言中的三元运算符是这样工作的: x = f() ? f() : g() 如果 f()那么是真的x被赋值为 f() , 否则赋值为 g() .然而,有些语言有更简洁的 elvis operator
所以,假设我们有一个简单的对象,它包含两种不同语言的字符串,例如 welcomeText = {"de": "Willkommen zurück!", "en": "欢迎回来!"。 welcomeTe
我正在将 Firebase DataSnapshot (json) 对象解析为数据类。除了以下内容,我可以组合它们并在其中任何一个为空时返回吗?类似于 Swift 的 guard let ..., l
我遇到了解析问题,这已通过 Elvis 运算符解决,但如果我的 key 包含正斜杠,我就不能使用 Elvis 运算符,因为我必须将该 key 放入方括号中。 如果键像这样简单(“firstname”)
我会举例说明: 猫王运算符 (?: ) The "Elvis operator" is a shortening of Java's ternary operator. One instance of
我是一名优秀的程序员,十分优秀!