同时使用构建器 class 的相同实例会导致任何副作用吗?
Does using the same instance of a builder class concurrently cause any side effects?
我想在用于 C# 消费的 F# class 实现中使用计算表达式。互操作 class 本身是一个单例(一个实例连接在容器中)并且跨线程使用(网络请求)。
构建器本身仅包含方法,没有支持字段或状态。
鉴于以下是 F# 中的惯例:
module A =
let private build = new SomeBuilder()
这是否意味着可以毫无问题地同时计算与一个构建器相关联的多个表达式?
在幕后,构建器根本没有 "work"。编译器只是将计算表达式转换为对构建器的一系列方法调用,然后对其进行编译。
因此,构建器的线程安全性完全取决于其方法的线程安全性 - 即您编写的方法。
例如下面的代码:
myBuilder {
let! x = f()
let! y = g(x)
return x + y
}
将转换为以下内容:
myBuilder.Bind( f(), fun x ->
myBuilder.Bind( g(x), fun y ->
myBuilder.Return( x + y ) ) )
(注意:以上代码可能不准确,但传达了要点)
一个纯粹的、无状态的构建器对于并发使用是安全的。
计算表达式基本上是语法糖。使用构建器的计算表达式或直接调用其方法之间没有有效区别。
我想在用于 C# 消费的 F# class 实现中使用计算表达式。互操作 class 本身是一个单例(一个实例连接在容器中)并且跨线程使用(网络请求)。
构建器本身仅包含方法,没有支持字段或状态。
鉴于以下是 F# 中的惯例:
module A =
let private build = new SomeBuilder()
这是否意味着可以毫无问题地同时计算与一个构建器相关联的多个表达式?
在幕后,构建器根本没有 "work"。编译器只是将计算表达式转换为对构建器的一系列方法调用,然后对其进行编译。
因此,构建器的线程安全性完全取决于其方法的线程安全性 - 即您编写的方法。
例如下面的代码:
myBuilder {
let! x = f()
let! y = g(x)
return x + y
}
将转换为以下内容:
myBuilder.Bind( f(), fun x ->
myBuilder.Bind( g(x), fun y ->
myBuilder.Return( x + y ) ) )
(注意:以上代码可能不准确,但传达了要点)
一个纯粹的、无状态的构建器对于并发使用是安全的。
计算表达式基本上是语法糖。使用构建器的计算表达式或直接调用其方法之间没有有效区别。