泛类型
1 用途
功能模块非常相似,只是处理的数据不同。
通过继承,子类拥有父类的一切行为和属性,任何出现父类的地方都可以使用子类替换。
使用继承object基类,可以解决类似泛型的问题,但存装箱与拆箱而影响性能的问题。
2 特点
延迟声明:调用时才指定参数类型;
泛型是语法结构,非语法糖;
效率高于继承,用stopwatch测量其性能;
3 c#新语法——将主构造函数定义为类声明的一部分
public class Container { private int _capacity; public Container(int capacity) => _capacity = capacity; }
public class Container(int capacity) { private int _capacity = capacity; }
4 【泛型类定义】、【将主构造函数定义为类声明的一部分】与【类继承】一起使用
有了下边的例子,这种新的语法结构应该可以理解了。
public class KType { } public class KBaseType { } public class KOption<KType> { } public class KBaseDBContext<KBaseType>(KOption<KType> option, string name) { KOption<KType> _option = option; string _name = name; public KBaseDBContext() : this(new KOption<KType>(),string.Empty) { } } public class KDBContext(KOption<KType> option, string name):KBaseDBContext<KBaseType>(option, name) { public KDBContext() :this(new KOption<KType>(), "Kerry") { } } public class KDBContextEx: KBaseDBContext<KBaseType> { public KDBContextEx() : base(new KOption<KType>(), "Kerry") { } }
5 泛型实例
delegate T NumberChanger<T>(T n); public class KGenericArray<T>(int size) { private T[] _array = new T[size]; public void Clear() { Array.Clear(_array, 0, _array.Length); } public T? GetItem(int index) { T? result = default(T); if (_array.Length > index) { result = _array[index]; } return result; } public void SetItem(int index, T item) { if (index < _array.Length) { _array[index] = item; } } public void Swamp(ref T par1, ref T par2) { T temp = par1; par1 = par2; par2 = temp; } public static void Display() { NumberChanger<int> counts = new NumberChanger<int>(AddNum); NumberChanger<double> scores = new NumberChanger<double>(AddScore); int counter = counts(25); double Score = scores(34.45); } static int num = 0; static double score = 0; public static int AddNum(int p) { num += p; return num; } public static double AddScore(double s) { score += s; return score; }
浙公网安备 33010602011771号