在 C# 中正确实现 F# Unit
Properly implement F# Unit in C#
此问题与 this one 中的 C#/F# 兼容性无关。
我想知道实现像 F# Unit 这样的类型而不是使用 void
的正确方法。
显然我会放弃这个结果,我不会把这个类型暴露给外界。
想知道一个空 class 是否可以模拟这个角色。
internal class Unit
{
}
例如在language-ext库中,作者使用了struct
.
这个选择有什么好处吗?
我不确定从 C# 中定义 Unit
的最佳方式是什么。它可能与 F# 中的完成方式不同(因为在 F# 中,编译器以某种方式隐藏了用法)。
不过,其实可以在核心库中找到F#的实现unit
:
以下是有关 F# unit
实现的要点
- 它以与 Rx 版本相同的方式实现
GetHashCode
和 Equals
- 它是
IComparable
并且unit
类型的所有值都相等
- 最重要的是,它有一个私有构造函数,因此您不能创建新的
unit
值。它也没有 默认实例 (与 Rx 单元不同),因此在 F# 中,所有单元值实际上都表示为 null
。然而,language/compiler通常隐藏了这个事实。
所以,听起来 F# 中的唯一区别是它使用 null
值。如果您想显式使用 unit
,这可能不是最佳选择。但是,如果你有 Unit.Default
那么你最终定义了一个具有两个可能值的类型,因为它可以是 Unit.Default
或 null
(所以它不是一个真正的单位!)
System.ValueTuple
(没有通用参数)在 C# 中非常 unit。 The source code 已开放。
我参考了这个Unit类型:
https://github.com/louthy/language-ext/blob/main/LanguageExt.Core/DataTypes/Unit/Unit.cs
来自功能扩展库。
此问题与 this one 中的 C#/F# 兼容性无关。
我想知道实现像 F# Unit 这样的类型而不是使用 void
的正确方法。
显然我会放弃这个结果,我不会把这个类型暴露给外界。
想知道一个空 class 是否可以模拟这个角色。
internal class Unit
{
}
例如在language-ext库中,作者使用了struct
.
这个选择有什么好处吗?
我不确定从 C# 中定义 Unit
的最佳方式是什么。它可能与 F# 中的完成方式不同(因为在 F# 中,编译器以某种方式隐藏了用法)。
不过,其实可以在核心库中找到F#的实现unit
:
以下是有关 F# unit
实现的要点
- 它以与 Rx 版本相同的方式实现
GetHashCode
和Equals
- 它是
IComparable
并且unit
类型的所有值都相等 - 最重要的是,它有一个私有构造函数,因此您不能创建新的
unit
值。它也没有 默认实例 (与 Rx 单元不同),因此在 F# 中,所有单元值实际上都表示为null
。然而,language/compiler通常隐藏了这个事实。
所以,听起来 F# 中的唯一区别是它使用 null
值。如果您想显式使用 unit
,这可能不是最佳选择。但是,如果你有 Unit.Default
那么你最终定义了一个具有两个可能值的类型,因为它可以是 Unit.Default
或 null
(所以它不是一个真正的单位!)
System.ValueTuple
(没有通用参数)在 C# 中非常 unit。 The source code 已开放。
我参考了这个Unit类型: https://github.com/louthy/language-ext/blob/main/LanguageExt.Core/DataTypes/Unit/Unit.cs
来自功能扩展库。