当前位置: 首页 > 编程语言 > C#

关于C#generics的最重要的事情……经验教训分享

时间:2023-04-10 18:54:44 C#

C#学习教程:关于C#泛型的最重要的事情...分享的经验教训、最佳和最有用的实践、技巧...我开始使用泛型实现我的大部分库/API,并希望收集最常见的模式,实践中发现的技巧等。让我来回答这个问题:关于泛型,您学到的最重要的事情是什么?请尝试提供示例-它比简单且过于枯燥的描述更容易理解谢谢这个问题与Jon的问题有些相似,但主题不同。我学到的最重要的事情之一是您可以约束泛型类型参数。这可能非常强大,允许您仅为特定类型的对象自定义类,并允许您在泛型类中使用该类型的成员。我意识到这是非常基础的,但这是使泛型非常有用的原因之一。当涉及到静态成员之类的东西时,泛型类型的每个特化都被认为是唯一类型。例如,对于这种类型:classGenericType{publicstaticintSomeValue;如果我们这样做,断言就会成功:GenericType.SomeValue=3;Debug.Assert(GenericType.SomeValue==0);这是因为:typeof(GenericType)!=typeof(GenericType)Eveniftypeof(GenericType.GetGenericTypeDefinition()==typeof(GenericType).GetGenericTypeDefinition()了解C#中泛型类型推断的能力和局限性。编译可以基于(例如)中的参数类型深入理解方法编译器可以和不能推断什么,以便使API的常见用例更具可读性。我从泛型中学到的最重要的一课是:使用它们越多越好。没有协变或逆变(至少在3.5).在设计包含通用类型参数的类层次结构时要注意这一点。两个有趣的教训。第一的;列表;试着用T来思考;有关详细信息,请参见此处,但简而言之,您需要使用:publicvoidFoo(IListdata)whereT:SomeBaseClassOrInterface{}not:publicvoidFoo(IListdata){}其次:注意边缘情况;-p你能看到吗这里的陷阱?staticvoidFoo()whereT:new(){Tt=newT();Console.WriteLine(t.ToString());//工作正常Console.WriteLine(t.GetHashCode());//工作正常Console.WriteLine(t.Equals(t));//工作正常//所以它看起来像一个对象,闻起来也像一个对象...//但这会抛出NullReferenceException...Console.WriteLine(t.GetType());//砰!!!不确定它们是否最重要,但我了解到以下内容:如果您不知道frikkin类型,泛型只能通过反射实例化。在某些情况下,当类型未知时,您可能需要一个非泛型接口来使用泛型类。在我厌倦了publicclassFoo之前,我几乎崩溃了,其中T:Foo{publicTCloneMe()...}是完全有效的代码,并允许您的基类公开与私有类和属性相关的方法...最后定义状态机的状态:publicabstractclassMachinewhereS:StatewhereM:Machine{protectedSstate;}publicabstractclassStatewhereS:StatewhereM:Machine{protectedMmachine;泛型可能有点笨拙。前几天我有这个:List>,Expression>>>Hoo...MyGeneric其中T:IComparable没有MyGeneric作为其基类。我了解到泛型是非常强大的工具,但滥用会导致代码难以理解。通用委托类型始终是类型不变的。我遇到了一个类似于前几天链接中概述的问题,这引起了一些混乱,因为我不明白为什么我必须投放我的收藏。http://www.theserverside.net/blogs/thread.tss?thread_id=47323首先,了解泛型在C#中的工作原理非常重要。本文很好地概述了AndersHejlsberg(c#之父)的泛型。我认为尽可能多地使用它们并不是一件好事。在真正有意义的时候使用泛型。永远记住极限编程中的KISS和YAGNI(保持简单愚蠢;你不需要它)。以上就是C#学习教程:C#泛型最重要的...经验教训分享的所有内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多采纳多多关注——本文来自网络合集,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: