泛型
概述
概述
- 泛型(generic) 特性可以让多个类型共享一组代码。泛型允许我们声明类型参数化(type-parameterized)的代码,用不同的类型进行实例化.即我们可以用“类型占位符”来写代码, 然后在创建类的实例时指明真实的类型.
- C# 提供了 5 种泛型:类、结构、接口、委托和方法。类, 结构, 接口, 委托是类型, 而方法是成员.
泛型类
概述
泛型类示例
泛型类示例
using System;
// 声明泛型类
// T: 类型参数(类型占位符).
class MyStack<T>
{
T[] StackArray;
int StackPointer = 0;
public void Push(T x)
{
if (!IsStackFull)
{
StackArray[StackPointer++] = x;
}
}
public T pop()
{
return (!IsStackEmpty) ? StackArray[--StackPointer] : StackArray[0];
}
const int MaxStack = 10;
bool IsStackFull
{
get { return StackPointer >= MaxStack; }
}
bool IsStackEmpty
{
get { return StackPointer <= 0; }
}
public MyStack()
{
StackArray = new T[MaxStack];
}
public void Print()
{
for (int i = StackPointer - 1; i >= 0; i--)
{
Console.WriteLine($" Value: {StackArray[i]}");
}
}
}
class Program {
static void Main(string[] args) {
// 构造类
// int: 类型实参
MyStack<int> StackInt = new MyStack<int>();
StackInt.Push(3);
StackInt.Push(5);
StackInt.Push(7);
StackInt.Push(9);
StackInt.Print();
// 构造类
// string: 类型实参
MyStack<string> StackString = new MyStack<string>();
StackString.Push("This is fun");
StackString.Push("Hi there!");
StackString.Print();
}
}
泛型方法
概述
- 泛型方法可以在泛型和非泛型类以及结构和接口中声明.
- 泛型方法有两个参数列表,一个是类型参数列表(封闭在尖括号内),另一个是方法参数列表(封闭在圆括号内).
泛型方法示例
泛型方法示例
using System;
// 非泛型类
class Simple
{
// 泛型方法
// <T>: 类型参数列表
// (T[] arr): 方法参数列表
static public void ReverseAndPrint<T>(T[] arr) {
Array.Reverse(arr);
foreach (T item in arr)
Console.Write($"{item.ToString()} ");
Console.WriteLine("");
}
}
class Program
{
static void Main(string[] args)
{
var intArray = new int[] { 1, 2, 3, 4, 5 };
var stringArray = new string[] { "first", "second", "third"};
var doubleArray = new double[] { 1.1, 2.2, 3.3, 4.4, 5.5 };
Simple.ReverseAndPrint<int>(intArray);
// 推断类型, 编译器可以从方法参数中推断参数类型.此时可以省略类型参数列表.
Simple.ReverseAndPrint(intArray);
Simple.ReverseAndPrint<string>(stringArray);
Simple.ReverseAndPrint(stringArray);
Simple.ReverseAndPrint<double>(doubleArray);
Simple.ReverseAndPrint(doubleArray);
}
}
泛型接口
概述
泛型接口示例
csharp示例
约束(where子句)
概述
- 约束使用 where 子句.