【问题标题】:Is wrapping System.Math a bad idea? [closed]包装 System.Math 是个坏主意吗? [关闭]
【发布时间】:2014-12-23 23:42:52
【问题描述】:

我有自己的数学库,我希望它被称为“数学”(我一直称它为“数学”)。它在自己的命名空间中,但“Math”的类名仍然与 System.Math 冲突。我为解决这个问题所做的是将 System.Math 中所有内容的包装器添加到我的库中,该库只显式调用 System.Math 函数,然后我必须添加

using Math = Yushatak.Libraries.Math;

到每个使用 Math.* 功能的文件。我觉得这不是最好的方法,而且我也担心包装会导致额外的开销,而这也不是你想要开销的地方..

建议?有没有更好的方法来“扩展” System.Math?这只是一个坏主意,我应该回到“数学”吗?有什么建议吗? :P

包装方法示例:

    public static decimal Abs(decimal value)
    {
        return System.Math.Abs(value);
    }

【问题讨论】:

  • 也许更适合代码审查 SE?很难在没有看到代码的情况下评论开销。如果它主要是静态方法,那么你可能没问题。上面的using 声明也没有错;解决命名空间冲突正是该语法存在的原因。
  • 这个问题似乎是题外话,因为它部分基于意见和部分代码审查。
  • 根据您的 Math/Maths 类的用途,最好只扩展 System.Math 类
  • 添加了一个例子——它们只是静态方法。 @Nunners:我怎么能“扩展” System.Math 类?这听起来像是我想要做的,但我认为我只能在一个类首先被声明为部分时才能从字面上扩展它?
  • 至于你的性能问题:using directives are resolved at compile-time.

标签: c# math


【解决方案1】:

这个答案现在包含三个不同的部分。

虽然using 语句方法除了源代码中的额外一行之外没有任何开销,但包装器方法会在许多方面产生开销。

  1. System.Math 中有非常多的方法。准确地复制包装器充其量是乏味的。
  2. 运行时的性能开销可能很小,也可能很严重,具体取决于 JIT 如何在内部处理对数学函数的调用。这可能因实施和平台而异。
  3. 为您的类编译的代码会更大。
  4. 很难理解数学课中的哪些功能是新功能,哪些只是已经存在的东西的包装。

以上所有情况都可以通过使用不同的策略来预防。


故意避免名称冲突是相当普遍的做法,我将新类命名为NameEx,其中Name 是原始名称。例如,您可能有兴趣创建 MathEx 类。


您还可以使用类似以下的方法来处理冲突的名称。

using Math = Yushatak.Libraries.Math;
using SystemMath = System.Math;

这在 Visual Studio 扩展开发中经常发生,特别是对于名为 Constants 和 IServiceProvider 的类。

【讨论】:

  • 好的,这排除了包装器的想法,原因与我怀疑应该排除它的原因相同。不过,我已经写过了,所以#1 已经被淘汰了,哈哈。除非有人想出一个比我原来的“不要使用名称”(你的 MathEx)更好的解决方案,我在其中使用的是“数学” "(未采用的功能的最短但仍然正确的名称),我将其标记为答案..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
  • 2012-04-19
  • 2010-09-28
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2011-05-17
相关资源
最近更新 更多