类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。
where T:new()
类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。
where T:<基类名>
类型参数必须是指定的基类或派生自指定的基类。
where T:<接口名称>
类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
where T:U
为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。
in/out 泛型类型参数修饰符
in/out关键字均可以在泛型接口和委托中使用。
用in修饰的泛型类型参数,表示该类型参数是逆变的。
用out修饰的泛型类型参数,表示该类型参数是协变的。
关于泛型的逆变和协变需要大篇幅来讲解,且与本文的侧重点有所偏离,故不作深入探讨。
本文回顾与总结
本文先是对形参/实参、命名实参、可选参数、params数目可变参数等基础知识概念作了一翻讲解,顺便蜻蜓点水了值类型与引用类型,然后以此为铺垫,开始循序渐进、由浅入深的揭秘参数传递的神秘面纱。
参数传递才是本文的重难点,比较绕,而且拗口,理解起来需要静下心细细品味与琢磨。为了更好的理解参数传递的本质,本文也引入了IL代码和指针来加以辅助。
然而不甘寂寞的泛型类型参数也作为特邀嘉宾到场助兴,为本文增色不少。
本篇文章主要是对C#.NET里面与参数有关的知识进行盘点,但是却牵连其他知识点:
指针、内存分布、地址指向、堆栈、托管堆、泛型类型参数等...
那么问题来了:
1、引用类型加上ref、out修饰符的意义和应用场景?
2、指针和引用是什么关系,或者二者之间有何异同之处?
3、值类型的引用传递,其传的地址是堆栈地址还是托管堆地址?
4、值类型一定存储在堆栈上面吗?
5、C#的指针传递是怎样的内幕?
6、....C#的语法点滴还有哪些醉美可赏?CLR又究竟还存在多少奇幻魅惑?
这些问题还是先留给大家自己去思考一下吧,待博主后续博文继续揭晓。
对于问题或者迷惑,我们必须深入探讨,揪出其本质,才能在技术的道路上越发沉淀和累积。
您的支持是我写文的强劲动力,希望本文能够给您带来帮助和益处,非常感谢您的阅读!
看完文章,来一首好听的音乐: