扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。
扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。 仅当你使用 using 指令将命名空间显式导入到源代码中之后,扩展方法才位于范围中。
最常见的扩展方法是 LINQ 标准查询运算符,它将查询功能添加到现有的 System.Collections.IEnumerable
和 System.Collections.Generic.IEnumerable<T> 类型。
若要使用标准查询运算符,请先使用 using System.Linq 指令将它们置于范围中。
在 IEnumerable<T> 类型的实例后键入“.”时,可以在 IntelliSense 语句完成中看到这些附加方法。
int[] ints = { 1, 2, 4,3, 2, 2 }; var result = ints.OrderBy(x=> x);
public static class MyExtensions { public static void WordCount(this string str) { Console.Write(str); } }
索引器允许类或结构的实例就像数组一样进行索引。 索引器类似于属性,不同之处在于它们的取值函数采用参数。
索引器概述
使用索引器可以用类似于数组的方式为对象建立索引。
get 取值函数返回值。 set 取值函数分配值。
this 关键字用于定义索引器。
value 关键字用于定义由 set 索引器分配的值。
索引器不必根据整数值进行索引;由你决定如何定义特定的查找机制。
索引器可被重载。
索引器可以有多个形参,例如当访问二维数组时。
class SampleCollection<T> { private T[] arr = new T[100];
/** * 索引器在语法上方便您创建客户端应用程序可将其作为数组访问的类、结构或接口。 索引器经常是在主要用于封装内部集合或数组的类型中实现的。 * 索引器允许类或者结构的实例按照与数组相同的方式进行索引取值,索引器与属性类似,不同的是索引器的访问是带参的。 * 索引器和数组比较: * (1)索引器的索引值(Index)类型不受限制 * (2)索引器允许重载 * (3)索引器不是一个变量 * 索引器和属性的不同点 * (1)属性以名称来标识,索引器以函数形式标识 * (2)索引器可以被重载,属性不可以 * (3)索引器不能声明为static,属性可以 * 索引器值不属于变量;因此,不能将索引器值作为 ref 或 out 参数进行传递。 * **/
public T this[int i] { get { return arr[i]; } set { arr[i] = value; } }public string this[string s] { get { return "Test Return " + s; } }
} class Program { static void Main(string[] args) { SampleCollection<string> stringCollection = new SampleCollection<string>(); stringCollection[0] = "Hello, World"; System.Console.WriteLine(stringCollection[0]);
System.Console.WriteLine(stringCollection["Hello,World"]);
} }
// Output:
//Hello, World.
// Hello, World.