我经常得到有关C # 中的扩展方法的问题。扩展方法是在C #3.0版中引入的。并允许我们在现有类中添加功能,而无需修改,扩展或重新编译它。
本质上,扩展方法允许我们向现有类添加一个新方法:
- 无需修改或添加代码
- 而不扩展它或创建新的派生类型
- 无需重新编译类
扩展方法是一种特殊的静态方法,但可以像实例方法一样在对象上调用。因此,扩展方法可以以与普通实例方法相同的方式使用。
步骤创建一个扩展方法
步骤1: 包含扩展方法或扩展方法定义一个静态可见类。通过应用适当的访问修饰符,确保类对客户端代码可见。
步骤2: 至少创建一个与包含类具有相同可见性级别的静态方法。
步骤3: 扩展方法的第一个参数始终指定该方法所操作的类型。确保类型名称前面带有 “this” 修饰符。
步骤4: 在调用代码中,添加包含扩展方法类的命名空间。
步骤5: 在同一实例中使用扩展方法的类型可以使用方法。请记住,我们不需要传递第一个参数,因为它表示类型,但是我们应该传递第二个参数来调用扩展方法。
让我们创建一个扩展方法!
让我们继续为String类创建一个扩展方法。string类没有任何WordCount方法。让我们从创建控制台应用程序项目开始,然后向控制台应用程序项目添加一个类。我们将类命名为StringExtension。
创建类后,我们必须执行前面讨论的步骤:
- 使类静态和公共在这种情况下
- 添加静态方法
- 由于类是公共的,使方法公共太
- 传递第一个参数的静态方法作为名称的类前面有关键字 “这个”
- 编写代码内部方法来实现功能
命名空间ExtensionMethodDemo{ StringExtension公共静态类{ WordCount (此字符串 =) public static int{ int count = 0; 对于 (int i = 0; i < s.Length; i){ 如果 (s[i] != “ ”){ 如果 ((i 1) = = s.Length){计数;} 其他{ 如果 (s[i 1] = = “ ”){计数;}}}} 返回计数;}}}
在上面的代码清单中,我们创建了一个扩展方法来计算给定字符串中的单词数。您可能会注意到:
- StringExtension类是一个公共静态类;
- WordCount方法是一个公共静态方法;
- 第一个参数在WordCount方法是一个字符串,因为我们正在创建WordCount作为扩展方法的字符串类;
- 第一个参数类型字符串前面带有关键字 “这个”。
在使用扩展方法之前,让我们编译项目。为此,我们需要执行以下步骤:
- 如果我们在不同的库中创建了扩展方法,则将DLL添加到客户端项目。
- 使用using指令添加扩展方法类的命名空间。
- 使用扩展方法作为普通实例方法。
我们可以使用新创建的扩展方法,如下面的清单所示:
使用系统;命名空间: ExtensionMethodDemo{ 类程序{ 静态void Main (string [] args){Console.WriteLine( "Enter a senetence" ); 字符串inputstr = Console.ReadLine(); int numberofword = inputstr.WordCount();Console.WriteLine(numberofword);Console.ReadKey( true );}}}
正如我们在上面的清单中注意到的,扩展方法WordCount用于计算句子中的单词数。Visual Studio还通过在方法名称旁边附加word Extension来显示intellisense中的扩展方法,如下图所示:
正如我们所看到的,我们可以以与任何实例方法相同的方式使用扩展方法。可能有一个场景,我们有一个实例方法和一个具有相同名称和签名的扩展方法。在这种情况下,always实例方法比扩展方法具有更高的优先级。关于扩展方法,我们应该记住几个要点:
- 它的优先级低于实例方法,因此,如果类具有扩展方法和具有相同名称和签名的实例方法,则实例方法具有优先级。
- 如果扩展方法与目标类型的成员方法冲突,则始终调用成员方法而不是扩展方法。
- 扩展方法只能访问目标类型的私有成员。
扩展方法对于在现有类中添加功能非常有用。许多LINQ函数都是作为扩展方法实现的。希望这里提供的信息对您的项目有所帮助,并感谢您的阅读!</p