关于范型介绍的最后一部分是范型方法。
有时候我们并不是整个类都需要参数类型,而只是一个特定的方法需要。
比如我们有这样一样方法:
void PushMultiple(Stack<int> stack, params int[] values) {
foreach (int value in values) stack.Push(value);
}
foreach (int value in values) stack.Push(value);
}
容易知道,这个方法的作用就是把多个int值放入一个堆栈里,但是目前我们只能放入int值,就像这样:
Stack<int> stack = new Stack<int>();
PushMultiple(stack, 1, 2, 3, 4);
PushMultiple(stack, 1, 2, 3, 4);
当然现在我们只能放入整型,根据前面对范型的介绍,我们容易想到把Stack<int>写成Stack<T>就可以接受参数类型了,所以我们就把方法改为范型方法:
void PushMultiple<T>(Stack<T> stack, params T[] values) {
foreach (T value in values) stack.Push(value);
}
foreach (T value in values) stack.Push(value);
}
如果我们想用这个范型方法达成前面的方法的效果,就这样用:
Stack<int> stack = new Stack<int>();
PushMultiple<int>(stack, 1, 2, 3, 4);
PushMultiple<int>(stack, 1, 2, 3, 4);
当然,现在我们已经不局限于放入int值到堆栈里了,你可以指定自己需要的类型,可重用性就更高了。
其实我们的编译器还可以更聪明一点,它使用了一种叫type inferencing的操作,根据我们提供的方法的参数的类型来推演出方法的参数类型,也就是说,我们上面的例子可以写成这样:
Stack<int> stack = new Stack<int>();
PushMultiple(stack, 1, 2, 3, 4);
PushMultiple(stack, 1, 2, 3, 4);