【C#食谱】【面食】菜单6:泛型约束

问题:

你希望你的泛型类型在创建的时候必须有一个支持某个接口(比如IDisposable接口)成员的类型参数。

解决方法:

使用约束去强制泛型的类型参数实现某一个或多个特定的接口。

     public   class  DisposableList < T >  : IList < T >    
        
where  T : IDisposable
        
{
            
private List<T> _items = new List<T>();

            
// Private method that will dispose of items in the list
            private void Delete(T item)
            
{
                item.Dispose();
            }

        }

这个DisposableList类只允许实现了IDisposable接口的对象作为参数传递给它。那是因为,每次你从DisposableList对象中删除一个对象时,都要调用Dispose方法。这就使得你可以轻松管理DisposableList中的对象。

下面的代码就运用了DisposableList对象:

     public   static   void  TestDisposableListCls() 
    
{    
        DisposableList
<StreamReader> dl = new DisposableList<StreamReader>();

        
// Create a few test objects.
        StreamReader tr1 = new StreamReader("c:\\boot.ini");
        StreamReader tr2 
= new StreamReader("c:\\autoexec.bat");
        StreamReader tr3 
= new StreamReader("c:\\config.sys");

        
// Add the test object to the DisposableList.
        dl.Add(tr1);
        dl.Insert(
0, tr2);
        dl.Add(tr3);

        
foreach(StreamReader sr in dl)
        
{
            Console.WriteLine(
"sr.ReadLine() == " + sr.ReadLine());
        }


        
// Call Dispose before any of the disposable objects are
        
// removed from the DisposableList.
        dl.RemoveAt(0);
        dl.Remove(tr1);
        dl.Clear();
    }

讨论:

Where关键字被用来约束类型参数只能接受那些满足给定约束的参数。比如,DisposableList有一个约束就是任何类型参数T必须实现IDisposable接口:

     public   class  DisposableList < T >  : IList < T >
        
where  T : IDisposable

这意味着,下面的代码将编译成功:

    DisposableList < StreamReader >  dl  =   new  DisposableList < StreamReader > ();

但这个就不行了:

    DisposableList < string >  dl  =   new  DisposableList < string > ();

这是因为string并没有实现IDisposable接口,而StreamReader实现了。

除了要求一个或多个接口被实现,其他对于类型参数的约束也是被允许的。你可以要求一个类型参数必须继承自一个特定的基类,比如Textreader类:

     public   class  DisposableList < T >  : IList < T >
        
where  T : System.IO.TextReader, IDisposable

你也可以约束这个类型参数只能是值类型或者只能是引用类型。下面声明的类的约束是其只能使用值类型:

     public   class  DisposableList < T >  : IList < T >
        
where  T :  struct

而这个是只能使用引用类型:

     public   class  DisposableList < T >  : IList < T >
        
where  T :  class

除此之外,你也可以要求任何类型参数去实现一个公共的默认构造函数:

     public   class  DisposableList < T >  : IList < T >
        
where  T : IDisposable,  new ()

使用约束使得你可以编写的泛型只能接受那些更具体的有用的参数类型。如果在这个示例中,IDsiposable约束被省略,那么一个编译时错误将会发生。这是因为,不是所有的类型它都可以被用作是实现了IDisposable接口的DisposableList类的参数的。如果你忽略这个编译时检查,一个DisposableList对象也许会包含那些并没有一个公共的无参数的Dispose方法的对象。在这种情况下,一个运行时异常将会发生。泛型和约束在一定程度上要求严格的参数类型检查,这使你在编译时就可以发现这些问题,而不是运行时。

转载于:https://www.cnblogs.com/adaiye/archive/2008/03/11/constraints.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值