c# - F# 区分联合与 C# 类层次结构

标签 c# f# class-hierarchy c#-to-f# discriminated-union

我有以下代码:

public abstract class A ...
public class B : A ...
public class C : A ...

void my_fct(A x) {
  if (x is B) { block_1 }
  else if (x is C) { block_2 }
  else { block_3 }
}

我想知道它是否是 F# 的一个很好的翻译

type a = B | C
let my_fct x =
  match x with
  | B -> ( block_1 )
  | C -> ( block_2 )
  | _ -> ( block_3 )

??

最佳答案

F# 区分联合非常接近于 OO 类层次结构,因此这可能是最佳选择。最显着的区别是您不能在不修改类型声明的情况下将新案例添加到可区分的联合中。另一方面,您可以轻松添加适用于该类型的新函数(这大致对应于在 C# 中添加新的虚拟方法)。

因此,如果您不希望添加新的继承类(案例),那么这是最佳选择。否则,您可以使用 F# 对象类型(或其他选项,具体取决于场景)。

还有一点关于您的代码 - 由于您无法添加新案例,F# 编译器知道您需要的唯一案例是 BC。因此,block_3 永远不会被执行,这意味着您可以只写:

let my_fct x = 
  match x with 
  | B -> ( block_1 ) 
  | C -> ( block_2 ) 

关于c# - F# 区分联合与 C# 类层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7334019/

相关文章:

c# - [C#、.NET] : Validating users via LDAP through IdentityServer3

c# - 倒计时器中的重置按钮

f# - 如何在 F# 模式匹配中隐式转换为常见的父类(super class)型?

F# 子类型可区分联合

inheritance - F# 添加多个调用基类构造函数的构造函数重载

ruby - ruby 中类的类型和类的父类(super class)有什么区别?

scala - 案例类层次结构的lift-json序列化

c# - 通用方法采用类型并返回该类型的实例?

c# - 使用 NuGet 包的本地源代码调试和编辑代码

scala - "value class space is flat"是什么意思?