gpt4 book ai didi

c# - 如何避免在 .NET 中为不同的数字类型编写重复代码

转载 作者:行者123 更新时间:2023-11-30 13:31:23 25 4
gpt4 key购买 nike

我正在尝试编写适用于 float、double 等类型并使用算术运算的通用 Vector2 类型。是否有机会使用 C#、F#、Nemerle 或任何其他或多或少成熟的 .NET 语言来实现?

我需要一个解决方案

  • (1) 良好的表现(就像我单独写一样Vector2Float、Vector2Double 等类),
  • (2) 这将允许代码看起来不错(我不想为每个类发出代码运行时)
  • (3) 并且会尽可能多地进行编译时检查。

出于第 1 和第 3 个原因,我不想使用动力学。现在我正在检查 F# 和 Nemerle。

UPD:我希望有很多这种类型的数学代码。但是,如果可能的话,我更愿意将代码放在扩展方法中。

UPD2:“等”类型包括 int(我实际上怀疑我会使用)和 decimal(我想我可能会使用,但不是现在)。使用扩展方法只是个人喜好问题 - 如果有充分的理由不这样做,请告知。

最佳答案

正如 Daniel 所提到的,F# 具有称为静态解析类型参数 的功能,它超出了您在 C# 中使用普通 .NET 泛型所能做的事情。诀窍在于,如果您将函数标记为 inline,F# 会自动生成专用代码(有点像 C++ 模板),然后您可以使用 F# 类型系统的更强大功能来编写通用数学。

例如,如果您编写一个简单的添加函数并使其内联:

let inline add x y = x + y;;    

类型推断打印出以下类型:

val inline add :
x: ^a -> y: ^b -> ^c
when ( ^a or ^b) : (static member ( + ) : ^a * ^b -> ^c)

您可以看到推断类型相当复杂 - 它指定了一个成员约束,该约束需要两个参数之一来定义一个 + 成员(标准 .NET 类型也支持这一点)好处是这可以完全推断出来,因此您很少需要编写丑陋的类型定义。

如评论中所述,我写了一篇文章Writing generic numeric code其中详细介绍了如何在 F# 中执行此操作。我不认为这可以在 C# 中轻松完成,并且您在 F# 中编写的内联函数只能从 F# 调用(从 C# 调用它们本质上将使用动态)。但是您绝对可以在 F# 中编写您的通用数值计算。

关于c# - 如何避免在 .NET 中为不同的数字类型编写重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22014644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com