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

时间:2011-05-17 17:03:12

标签: c# .net windows

我最近一直在钻研C#,我想知道是否有人会介意检查我的写作,以确保它是准确的?

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

例如,如果你想扩展int类型,你可以创建一个类,例如 NumberFactorial并创建一个方法,例如静态虚空主要,例如, int x = 3 然后打印出该行(一旦从扩展方法返回)

创建一个公共静态方法,其中包含关键字" 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);
        }
    }
}

5 个答案:

答案 0 :(得分:9)

是的,这是正确的。

  

扩展方法被定义为静态方法,但是通过使用实例方法语法来调用。它们的第一个参数指定方法操作的类型,参数前面有this修饰符。当您使用using指令将命名空间显式导入源代码时,扩展方法仅在范围内。

您可以详细了解扩展方法herehere

答案 1 :(得分:2)

它看起来确实准确。但是,我想知道为什么在只需要一个退出条件时你会有两个退出条件。此外,如果您制作了代码,您应该能够轻松地对其进行单元测试,以确保其准确性。

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

我查看扩展方法的方式是可发现性和普遍性。

对于.NET内置类型的定位,我会严肃考虑应用程序意图。使用你的阶乘的例子,我会问自己

  

我多久需要一次myint.Factorial()?

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

现在,如果您的域名是一个数学应用程序,无论出于何种原因广泛使用因子计算,那么多,以便您希望 int类型本身实现的factorial。< / p>

此时我将在

中创建方法
namespace System {
    public class IntExtension {
        public int Factorial(this int....) 
    }
}

这明确违反了Microsoft有关扩展方法使用的准则。 Microsoft建议您不要使用this Owner obj的命名空间,因为该命名空间不在您的域中。如果我没记错的话,他们对这个原因的主要理由是因为该命名空间不在你的域中,所以它会受到变异。我强烈反对微软认为解决方法是避免它。我的结论是,如果程序集有突破性的更改会受到命名空间使用的影响,那么您可能需要进行相关的更改,并且无论如何都需要转发迁移,现在也是在内部修复其命名空间消耗的适当时间。

我认为最佳做法是将公共扩展方法的范围限定为所拥有类型的命名空间。这适用于所有密集目的,使您的扩展方法类更符合相同类型的部分类。这可以追溯到我关于可发现方面查看扩展方法的原始声明。如果您不使用Resharper等工具进行编程,则使用相同的命名空间会使您的扩展程序更容易被发现,尤其是

答案 4 :(得分:1)

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