C#中的扩展方法 – 这是正确的吗?

我最近一直在研究C#,我不知道有没有人会介意把它写在上面,以确保它是正确的?

示例:使用扩展方法计算阶乘。

例如,如果你想扩展inttypes,你可以创build一个类,例如NumberFactorial并创build一个方法,例如Static Void Main,调用例如int x = 3然后打印NumberFactorial (一旦它从扩展方法返回)

创build一个包含关键字“this”的公共静态方法,例如这个int x执行逻辑,然后将这个参数反馈给初始方法进行输出。

代码如下:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int x = 3; Console.WriteLine(x.factorial()); Console.ReadLine(); } } public static class MyMathExtension { public static int factorial(this int x) { if (x <= 1) return 1; if (x == 2) return 2; else return x * factorial(x - 1); } } } 

对,那是正确的。

扩展方法被定义为静态方法,但通过使用实例方法语法来调用。 他们的第一个参数指定了该方法操作的类型,参数之前是该修饰符。 只有在使用using伪指令将名称空间显式导入源代码时,扩展方法才在范围内。

你可以在这里和这里找到更多关于扩展方法的信息

这当然看起来准确。 然而,我想知道为什么你只要真的需要两个退出条件。 另外,如果你编写了代码,你应该很容易地进行单元测试,以确保它的准确性。

对我看起来很好。 顺便说一下,你也可以做到

 public static class MyMathExtension { public static int factorial(this int x) { if (x <= 1) return 1; else return x * (x - 1).factorial(); } } 

我认为扩展方法的方式是在可发现性和通用性方面。

为了定位.NET内置类型,我对应用程序的意图进行了认真的考虑。 用你的因子的例子,我会问自己

多久我需要myint.Factorial()?

对于大多数领域的这个问题的答案将不是很多。 考虑到这一点,如果我真的需要实现myint.Factorial()在这一点上,我将采取你有MyMathExtension的类,并使该类内的私人类,将实际使用Factorial方法。 在这一点上,它变成了另一个内部的,私有的帮助器方法(我希望.NET允许我们在类中声明这个内联,而不是被迫无缘无故地创建一个shell类)

现在,如果你的域是一个数学应用程序,无论出于何种原因,广泛地使用阶乘的计算, 以至于希望 int类型本身实现阶乘。

在这一点上,我将创建该方法

 namespace System { public class IntExtension { public int Factorial(this int....) } } 

这特别违反了Microsoft扩展方法使用的准则。 微软建议你不要使用this Owner obj的命名空间,因为这个命名空间在你的域之外。 如果我没有记错,他们主要的理由是这个原因,因为这个命名空间是在你的域之外的,所以它会受到变异的影响。 我完全不同意微软的这个解决方案,就是为了避免这个问题。 我的结论是,如果程序集有重大变化受到命名空间使用情况的影响,那么将会涉及重大更改,并且无论是否需要进行迁移,现在都是适当的时候在内部修复命名空间的消耗。

我觉得最好的做法是将您的公共扩展方法的范围扩展到拥有类型的名称空间。 对于所有密集的目的而言,这使得您的扩展方法类在行中更像一个相同类型的部分类。 这回顾了我关于不可能发现延伸方法的观点。 使用相同的命名空间使得你的扩展更公平, 尤其是如果你不用像Resharper这样的工具进行编程的时候。

如果有效,那么我会说这是正确的。 您提供的代码看起来很干净,适合我,但是您应该添加一些防止负数的错误。