第一:源代码保护。(如果你知道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; }
}