理解C#泛型运作原理 (3)

理解C#泛型运作原理

用更直观的柱形图来呈现:

理解C#泛型运作原理

 我们能看到在这里List的性能在引用类型和值类型中都是所以当中是最好的,不管是执行时间、GC次数,分配的内存空间大小,都是最优的,同时.NET5在几乎所有的方法中性能都是优于.NETCore3.1,这里还提一句,我实现的ArrayExpandable和ArrayExpandable<T>性能都差于ArrayList和List,我还没实现IList和各种方法,只能说句dotnet基金会牛逼

三.泛型的多态性 多态的声明

类、结构、接口、方法、和委托可以声明一个或者多个类型参数,我们直接看代码:

interface IFoo<InterfaceT> { void InterfaceMenthod(InterfaceT interfaceT); } class Foo<ClassT, ClassT1>: IFoo<StringBuilder> { public ClassT1 Field; public delegate void MyDelegate<DelegateT>(DelegateT delegateT); public void DelegateMenthod<DelegateT>(DelegateT delegateT, MyDelegate<DelegateT> myDelegate) { myDelegate(delegateT); } public static string operator +(Foo<ClassT, ClassT1> foo,string s) { return $"{s}:{foo.GetType().Name}"; } public List<ClassT> Property{ get; set; } public ClassT1 Property1 { get; set; } public ClassT this[int index] => Property[index];//没判断越界 public Foo(List<ClassT> classT, ClassT1 classT1) { Property = classT; Property1 = classT1; Field = classT1; Console.WriteLine($"构造函数:parameter1 type:{Property.GetType().Name},parameter2 type:{Property1.GetType().Name}"); } //方法声明了多个新的类型参数 public void Method<MenthodT, MenthodT1>(MenthodT menthodT, MenthodT1 menthodT1) { Console.WriteLine($"Method<MenthodT, MenthodT1>:{(menthodT.GetType().Name)}:{menthodT.ToString()}," + $"{menthodT1.GetType().Name}:{menthodT1.ToString()}"); } public void Method(ClassT classT) { Console.WriteLine($"{nameof(Method)}:{classT.GetType().Name}:classT?.ToString()"); } public void InterfaceMenthod(StringBuilder interfaceT) { Console.WriteLine(interfaceT.ToString()); } }

控制台测试代码:

static void Main(string[] args) { Test(); Console.ReadLine(); } static void Test() { var list = new List<int>() { 1, 2, 3, 4 }; var foo = new Foo<int, string>(list, "ryzen"); var index = 0; Console.WriteLine($"索引:索引{index}的值:{foo[index]}"); Console.WriteLine($"Filed:{foo.Field}"); foo.Method(2333); foo.Method<DateTime, long>(DateTime.Now, 2021); foo.DelegateMenthod<string>("this is a delegate", DelegateMenthod); foo.InterfaceMenthod(new StringBuilder().Append("InterfaceMenthod:this is a interfaceMthod")); Console.WriteLine(foo+"重载+运算符"); } static void DelegateMenthod(string str) { Console.WriteLine($"{nameof(DelegateMenthod)}:{str}"); }

输出如下:

构造函数:parameter1 type:List`1,parameter2 type:String 索引:索引0的值:1 Filed:ryzen Method:Int32:classT?.ToString() Method<MenthodT, MenthodT1>:DateTime:2021/03/02 11:45:40,Int64:2021 DelegateMenthod:this is a delegate InterfaceMenthod:this is a interfaceMthod 重载+运算符:Foo`2

我们通过例子可以看到的是:

类(结构也可以),接口,委托,方法都可以声明一个或多个类型参数,体现了声明的多态性

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygfds.html