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对象进行操作了。
扩展方法可以用新方法扩展现有类型改变原始类型的定义。
扩展方法是静态类的静态方法,其中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# 运算符重载运算符可以为自定义类型重载。以下符号运算符可以重载:+(unary) -(unary) ! ~++--+ -*/%|^ == !== =以下运算符也...
C# 可空类型引用类型可以使用空引用表示不存在的值。值类型通常不能表示空值。例如:string s = null; // OK, Reference Typeint ...
C# 枚举枚举器是值的列表上的只读,只向前的光标。枚举器是实现以下任一接口的对象:System.Collections.IEnumeratorSystem.Colle...
C# for/foreach 循环C# 循环一个 for 循环是一个允许您编写一个执行特定次数的循环的重复控制结构。语法C# 中 for 循环的语法:f...