第一:源代码保护。(如果你知道C++模板对泛型的实现机制,就会知道C++在编译的时候根据对泛型的调用,自动“内联”了一个实现,这样泛型的内容就暴露了,而DotNet的实现方式就不同了,泛型类和方法会被编译成IL,在执行的时候由JIT负责将IL变化为指定类型参数的本地代码,从而保护了源代码)
第二:类型安全。(这点是最显而易见的,抛弃了使用ArrayList时各种丑陋的强制类型转换)
第三:更清晰地代码。因为没有了强制类型转换,所以代码自然显得更清晰
第四:更好的性能。因为值类型可以避免装箱和拆箱所带来的损耗(垃圾回收的次数也会减少)
转载请保留原创地址:http://www.luofenming.com/show.aspx?id=ART2019050300001
以下是源码实例
第二:类型安全。(这点是最显而易见的,抛弃了使用ArrayList时各种丑陋的强制类型转换)
第三:更清晰地代码。因为没有了强制类型转换,所以代码自然显得更清晰
第四:更好的性能。因为值类型可以避免装箱和拆箱所带来的损耗(垃圾回收的次数也会减少)
转载请保留原创地址:http://www.luofenming.com/show.aspx?id=ART2019050300001
以下是源码实例
public class DocumentManger<T> where T : IDocument {//where T:IDocument对实例化这个类进行了约束 T没实现IDocument这个接口不能实例化这个类 //Queue<T> 先进先出的集合 private readonly Queue<T> _documentQueue = new Queue<T>(); private readonly object _lockQueue = new object(); public void AddDocumnet(T doc) { lock (_lockQueue) { //在对象尾部添加 T _documentQueue.Enqueue(doc); } } public bool IsDocumentAvailable => _documentQueue.Count > 0; public T GetDocument() { //default(T) 如果是值类型默认为0 引用类型为null T doc = default(T); lock (_lockQueue) { //称出并返回第一个 对象 doc = _documentQueue.Dequeue(); } return doc; } public void DisplayAllDocuments() { foreach (T doc in _documentQueue) { Console.WriteLine(doc.Title); //如果T没有实现IDocument这个接口 强制转换会出异常 // Console.WriteLine(((IDocument)doc).Title); } } } public interface IDocument { string Title { get; } string Content { get; } }