新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论.NET,C#,ASP,VB技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Dot NET,C#,ASP,VB 』 → GetStartWith C# 泛型(2) 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 2604 个阅读者  浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: GetStartWith C# 泛型(2) 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     admin 帅哥哟,离线,有人找我吗?
      
      
      
      威望:9
      头衔:W3China站长
      等级:计算机硕士学位(管理员)
      文章:5255
      积分:18407
      门派:W3CHINA.ORG
      注册:2003/10/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给admin发送一个短消息 把admin加入好友 查看admin的个人资料 搜索admin在『 Dot NET,C#,ASP,VB 』的所有贴子 点击这里发送电邮给admin  访问admin的主页 引用回复这个贴子 回复这个贴子 查看admin的博客楼主
    发贴心情 GetStartWith C# 泛型(2)

    发信人: Nineteen (-_-#!), 信区: DotNET
    标  题: GetStartWith C# 泛型(2)
    发信站: BBS 水木清华站 (Mon Jul 12 21:46:37 2004), 站内

                                            GetStartWith C# 泛型(2)
    如果你打算比较两个个"泛型化的list"中item对象,或者调用它们的一个方法,
    那么编译器就必须得保证这个方法可以调用.这种保证,是建立在对你的泛
    型类(generic class)的一些约束(constraints)上的.(唉,偶表达能力比较菜,
    e文好的哥们还是去看e文比较好).例如,我们可以约束用于初始化该泛型类的
    class必须是某种特定的class或者是从该class派生出来的,这叫做"base class constrain"
    .
    该功能是用上下文关键字(contextual keyword -_-v)where来实现的.请看下面的代码

    (我考,汗~~~~)

    例如:
    public class Employee
    {
        private string name;
        private int id;
        public Employee(string s, int i)
        {
            name = s;
            id = i;
        }

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public int ID
        {
            get { return id; }
            set { id = value; }
        }

    }
    //代码没有贴全,大家看那些变量也知道是什么意思,就不多说了.
    class MyList<T> where T: Employee
    {
    //Rest of class as before.
      public T FindFirstOccurrence(string s)
      {
       T t = null;
       Reset();
       while (HasItems())
       {
          if (current != null)
          {
             //The constraint enables this:
             if (current.Data.Name == s)
             {              ~~~~~~~这里,不约束是不成的
                t = current.Data;
                break;
             }
             else
             {
                current = current.Next;
             }
          } //end if
       } // end while
      return t;
      }
    }

    当然,还有一些其他的约束类型,这些约束类型是可以用在同一个泛型类上的,如:
    class MyList<T> where T: Employee, IEmployee,  IComparable<T>,  new()
    {…}

    类型说明:
          约束                                     描述
    where T: struct                           必须是值类型
    where T : class                          必须是引用类型

    where T : new()          必须得有一个public的没有参数的构造函数.当指定一堆约束
                             的时候,这个约束必须指定在最后.

    where T : <base class name> 这就不用说了.

    where T : <interface name>  必须是接口或者实现了该接口.可以指定多个接口,这些接口

                                可以是泛型

    ok,就像大家猜想的一样,where T :...后面的那一坨必须得统统实现,就像上面的例子,T类

    必须是Employee的派生类,必须实现IEmployee,IComparable<T>接口,必须具有一个没有参数
    构造函数.

    你不得不进行类型限制(type constraining)只是因为你在设计泛型类是用到了System.Obje
    ct
    不提供的方法,这个也狠明显,不多说了.

    msdn中,谆谆教导说,如果你使用没有类型限制(type constraining)的泛型,那么你得遵守以

    三条规则(rules)
    1,!=和==是不能用地,因为具体类型可能不提供它们的实现.
    2,它们可以和System.Object互相转换,或者他们实现了某一个接口.
    3,他们可以和null进行比较.但是比较的时候有一点得注意:就是如果该类型是一个值类型(v
    alue type)
    那么比较的结果总是false.

    若一个泛型类型参数(generic type parameter)被作为约束的话,则它被成为"裸类型约束"(
    naked type constraint)
    它的用法如下:
    class List<T>
    {
          //...
        void Add<U>(List<U> items) where U:T {…}
    }
    public class MyClass<T,U,V> where T : V  //这种方式一般不会被用到,偶就不多说了


    为什么这么用,狠明显,也就不多嘴了.





    --
    长夜漫漫,无心睡眠……饿!非常的饿...饿死我了 ~~~><~~~                           


    ※ 来源:·BBS 水木清华站 http://smth.org·[FROM: 211.157.101.*]


       收藏   分享  
    顶(0)
      




    ----------------------------------------------

    -----------------------------------------------

    第十二章第一节《用ROR创建面向资源的服务》
    第十二章第二节《用Restlet创建面向资源的服务》
    第三章《REST式服务有什么不同》
    InfoQ SOA首席编辑胡键评《RESTful Web Services中文版》
    [InfoQ文章]解答有关REST的十点疑惑

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/11/9 2:26:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Dot NET,C#,ASP,VB 』的所有贴子 点击这里发送电邮给Google AdSense  访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/6/21 20:25:28

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    54.688ms