泛型
我们仔细观察类中的代码看那些类型需要修改,每次需要新类型(long,double,string),我们都需要重复这个过程。在这些过程之后,我们有了很多几乎相同代码的类,占据了额外的空间。调试和维护这些代码不但复杂而且容易出错。
定义:泛型(generic)可以软糖多个类型共享一组代码,泛型允许我们声明类型参数化。可以用不同的类型进行实例化,说白了,就是可以用类型占位符,创建具体类型致命的真实概念。C#中提供了五种泛型,类,结构,接口,委托和方法。
class MyStack<T> { T[] statkArray; int stackPointer = 0; const int MaxStack = 10; bool IsStackFull { get { return stackPointer < MaxStack; } } bool IsStackEmpty { get { return stackPointer <= 0; } } public void Push(T x) { if (!IsStackFull) { statkArray[stackPointer++] = x; } } public T Pop() { return(!IsStackEmpty)?statkArray[--stackPointer]:statkArray[0]; } //int[] arr={1,2,3,4}; public void Print() { for (int i = stackPointer-1; i>=0 ; i--) { Console.WriteLine("value;{0}",statkArray[i]); } } }
static void Main(string[] args) { MyStack<int> stackint = new MyStack<int>(); MyStack<string> stackstring = new MyStack<string>(); stackint.Push(3); stackint.Push(5); stackint.Push(7); stackint.Push(9); stackint.Print(); stackstring.Push("Hava a good day"); stackstring.Push("Hi there!"); stackstring.Print(); Console.ReadKey(); }
泛型委托:
class simple { static public void PrintString(string s) { Console.WriteLine(s); } static public void PrintUpperString(string s) { Console.WriteLine("{0}",s.ToUpper()); } } delegate void MyDelegate<T>(T value); class Program { static void Main(string[] args) { var mydel = new MyDelegate<string>(simple.PrintString); mydel += simple.PrintUpperString; mydel("rocky"); Console.ReadKey(); } }
泛型接口:
interface IMyfc<T> { T returnIt(T inValue); } class Simple<S>:IMyfc<S> { public S returnIt(S inValue) { return inValue; } } class Program { static void Main(string[] args) { var trivInt = new Simple<int>(); var trivString = new Simple<string>(); Console.WriteLine(trivInt.returnIt(5)); Console.WriteLine(trivString.returnIt("张三")); Console.ReadKey(); } }
linq:
class Program { static void Main(string[] args) { int[] array = { 11, 12, 13, 14 }; Func<int, int> func = new Func<int, int>(Method); var arr = array.Select(func); foreach (var item in arr) { Console.WriteLine(item); } Console.ReadKey(); } static int Method(int x) { if (x == 12) { return x; } else { return 0; } } }