举报投诉联系我们 手机版 热门标签 编程学
您的位置:编程学 > c#扩展方法必须在非泛型静态类中定义 C# 扩展方法

c#扩展方法必须在非泛型静态类中定义 C# 扩展方法

2023-02-28 14:18 C#教程

c#扩展方法必须在非泛型静态类中定义 C# 扩展方法

c#扩展方法必须在非泛型静态类中定义

C#扩展方法是一种特殊的静态方法,它可以让我们在不修改原有类型的情况下,为其添加新的方法。它们必须在非泛型静态类中定义,并且必须使用this关键字作为第一个参数。

C#扩展方法是一种特殊的语法,它可以让我们在不修改原有类型的情况下,为其添加新的方法。这些扩展方法必须在非泛型静态类中定义,而不能在普通的实例类中定义。

要使用C#扩展方法,我们必须创建一个名为“Extensions”的静态类,然后将扩展方法作为该类的成员函数来声明。这些扩展函数必须使用this关键字作为第一个参数,并将要扩展的对象作为该参数传递。

public static class Extensions 
{ 
    public static void MyExtensionMethod(this string str) 
    { 
        Console.WriteLine("This is my extension method."); 
    } 
}

上述代码中,MyExtensionMethod()函数就是一个C#扩展方法。当我们调用该函数时,就会将string对象作为参数传递到MyExtensionMethod()函数中。因此,MyExtensionMethod()函数就能够对string对象进行操作了。

C# 扩展方法

C# 扩展方法

扩展方法可以用新方法扩展现有类型改变原始类型的定义。

扩展方法是静态类的静态方法,其中this修饰符应用于第一个参数。

第一个参数的类型将是扩展的类型。

例如:


public static class StringExtension {
   public static bool IsCapitalized (this string s) {
      if (string.IsNullOrEmpty(s))
         return false;
      return char.IsUpper (s[0]);
   }
}

IsCapitalized扩展方法可以被调用,就像它是一个字符串上的实例方法,如下所示:


Console.WriteLine ("Javascript".IsCapitalized());

一个扩展方法调用被转换回一个普通的静态方法调用:


Console.WriteLine (StringExtension.IsCapitalized ("Javascript"));

接口也可以扩展:


public static T First<T> (this IEnumerable<T> sequence){
    foreach (T element in sequence)
        return element;
    throw new InvalidOperationException ("No elements!");
}
...
Console.WriteLine ("Javascript".First()); // J


扩展方法与实例方法

任何兼容的实例方法优先于扩展方法。

在以下示例中,Main的MyMethod方法将始终优先 - 即使在使用int类型的参数x调用时:


class Main {
   public void MyMethod (object x) { } 
}

static class Extensions {
   public static void MyMethod (this Main t, int x) { }
}

在这种情况下调用扩展方法的唯一方法是通过正常的静态语法:


Extensions.MyMethod(...)

扩展方法与扩展方法

如果两个扩展方法具有相同的签名,则扩展方法必须作为普通静态方法调用,以消除调用方法的歧义。

如果一个扩展方法具有更多特定的参数,则更具体的方法优先。

以下代码显示了如何使用它:


static class StringExtension {
    public static bool IsCapitalized (this string s) {...}
}
static class ObjectHelper {
    public static bool IsCapitalized (this object s) {...}
}

以下代码调用StringExtension的IsCapitalized方法:


bool test1 = "Javascript".IsCapitalized();

要调用ObjectHelper的IsCapitalized方法,我们必须明确指定:


bool test2 = (ObjectHelper.IsCapitalized ("Javascript"));

类和结构被认为比接口更具体。

阅读全文
以上是编程学为你收集整理的c#扩展方法必须在非泛型静态类中定义 C# 扩展方法全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
  • c运算符重载实例 C# 运算符重载

    c运算符重载实例 C# 运算符重载

    2023-02-24 C#教程

    C# 运算符重载运算符可以为自定义类型重载。以下符号运算符可以重载:+(unary) -(unary) ! ~++--+ -*/%|^ == !== =以下运算符也...

  • c#可空类型的作用 C# 可空类型

    c#可空类型的作用 C# 可空类型

    2023-02-28 C#教程

    C# 可空类型引用类型可以使用空引用表示不存在的值。值类型通常不能表示空值。例如:string s = null; // OK, Reference Typeint ...

  • c#枚举类型enum用法 C# 枚举

    c#枚举类型enum用法 C# 枚举

    2023-02-27 C#教程

    C# 枚举枚举器是值的列表上的只读,只向前的光标。枚举器是实现以下任一接口的对象:System.Collections.IEnumeratorSystem.Colle...

  • c#for循环用法 C# for 循环

    c#for循环用法 C# for 循环

    2023-02-25 C#教程

    C# for/foreach 循环C# 循环一个 for 循环是一个允许您编写一个执行特定次数的循环的重复控制结构。语法C# 中 for 循环的语法:f...

  • c#泛型方法 C# 泛型

    c#泛型方法 C# 泛型

    2023-02-24 C#教程

    C#泛型泛型类型定义包含占位符类型的模板。泛型可以提高类型安全性,减少铸件和拳击。泛型类型声明可以由泛型类型的消费者填充...

© 2024 编程学 bianchengxue.com 版权所有 联系我们
桂ICP备19012293号-7 返回底部