当前位置:  编程技术>.net/c#/asp.net

c# 泛型类型参数与约束的深入分析

    来源: 互联网  发布时间:2014-10-21

    本文导语:  泛型类型参数简介在定义泛型类型和泛型方法时,常用到泛型类型参数,泛型类型参数是在实例化泛型时指定类型的占位符。泛型类型参数放在“”内。泛型类型参数命名建议:(1)当泛型类型参数为单个字母时,建议用T表...

泛型类型参数简介
在定义泛型类型和泛型方法时,常用到泛型类型参数,泛型类型参数是在实例化泛型时指定类型的占位符。泛型类型参数放在“”内。
泛型类型参数命名建议:
(1)当泛型类型参数为单个字母时,建议用T表示。
(2)当泛型类型参数用单词定义时,建议在单词前加T。
代码如下:

private void PromptName(T t) {}
private void PromptName(Tuser user){}

泛型类型参数约束
在定义泛型类时,可以对在实例化泛型类时用于类型参数的类型种类施加限制。如果实例化泛型类时使用某个约束所不允许的类型来实例化类,则会产生编译时错误。
泛型约束分类: 

约束

说明

T:结构

类型参数必须是值类型。 可以指定除 Nullable 以外的任何值类型。

T:类

类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。

T:new()

类型参数必须具有无参数的公共构造函数。 当与其他约束一起使用时,new() 约束必须最后指定。

T:

类型参数必须是指定的基类或派生自指定的基类。

T:

类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。

T:U

为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。


(1)类型参数约束为结构(struct)。
代码如下:

public class ShowObjectType where T : struct
    {
        public void ShowValue(T t)
        {
            Console.WriteLine(t.GetType());
        }
    }
    class GenericConstraint
    {
        static void Main()
        {

            ShowObjectType showInt = new ShowObjectType();
            showInt.ShowValue(5);
            showInt.ShowValue(5);//从参数可以推导出类型参数类型,则可以省略类型参数类型

            //因为约束为值类型,下面代码不能通过编译
            ShowObjectType showString = new ShowObjectType();
            showString.ShowValue("5");
            Console.Read();
        }
    }

(2)类型参数约束为类(class)。
在应用 where T : class 约束时,避免对类型参数使用 == 和 != 运算符,因为这些运算符仅测试类型为引用类型,而不测试值相等性。
代码如下:

class GenericConstraint
    {
        static void Main()
        {
              List list = new List();
            AddClass(list, "hello generic");
            Console.Read();
        }
        private static void AddClass(List list, T t) where T : class
        {
            list.Add(t);
        }
    }

(3)类型参数约束为具体类。
约束为具体类时,可利用类型参数调用具体类的属性和方法。
代码如下:

class GenericConstraint
    {
        static void Main()
        {
            Person person = new Person { ID = 1, Name = "David" };
            PromptName(person);
            Console.Read();
        }
        //此约束T为Person对象或者继承Person对象
        private static void PromptName(T t) where T : Person
        {
            //此处可使用Person的Name属性
            if (t.Name == "David")
            {
                Console.WriteLine("Person name is David");
            }
            string name = t.GetName();
            Console.WriteLine("Person name is {0}", name);
        }
    }
    public class Person
    {
        private int id;
        public int ID
        {
            get { return id; }
            set { id = value; }
        }
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public string GetName()
        {
            return Name;
        }
    }

(4)约束多个参数。
代码如下:

class Base { }
class Test
    where U : struct
    where T : Base, new() { }

(5)未绑定类型参数。
 没有约束的类型参数,称为未绑定的类型参数。
代码如下:

class  List{}


    
 
 

您可能感兴趣的文章:

  • C#难点逐个击破(6):C#数据类型与.net framework数据类型
  • C#枚举类型与结构类型实例解析
  • c# 所有类型都从Object类型派生
  • c# 引用类型和值类型
  • C#引用类型和值类型的介绍与实例
  • C#中值类型与引用类型作为参数传递时的区别
  • c#值类型和引用类型使用示例
  • c#可空类型的作用说明
  • c# 类型转换
  • C# char类型字符转换大小写的实现代码
  • C#判断数据类型的简单示例代码
  • c# 值类型实例构造器
  • c#值类型与引用类型的区别
  • C#随机生成Unicode类型字符串
  • c#字符串值类型与引用类型比较示例
  • C# 遍历枚举类型的所有元素
  • c# 引用类型构造器
  • c# 类型构造器学习
  • c#判断磁盘驱动器类型的两种方法介绍
  • 深入C#中使用SqlDbType.Xml类型参数的使用详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 深入理解:Java是类型安全的语言,而C++是非类型安全的语言
  • 深入C++四种强制类型转换的总结
  • 深入解析C语言中常数的数据类型
  • 用C++实现strcpy(),返回一个char*类型的深入分析
  • 深入Java不可变类型的详解
  • 深入Unix时间戳与C# DateTime时间类型互换的详解
  • 深入了解mysql的4种常用、重要的数据类型
  • 深入解析c#中枚举类型的定义与使用
  • 从汇编看c++中变量类型的深入分析
  • 深入理解MySQL的数据库引擎的类型
  • mysql整数数据类型深入解析
  • 深入理解Java中的字符串类型
  • 深入C#判断操作系统类型的总结详解
  • C#不可变类型深入解析
  • C语言指针的长度和类型深入分析
  • 深入解析C++中的引用类型
  • C#值类型和引用类型的深入理解
  • java命名空间javax.xml.ws注释类型webserviceref成员方法: type定义参考
  • java 基本类型或可序列化类型,这里说的可序列化类型是什么意思???具体都有哪些类型??谢谢
  • java命名空间javax.annotation注释类型resource的类成员方法: authenticationtype定义及介绍
  • 求救:关于将类型名称字符串转变成类型相应类型的问题
  • java命名空间javax.annotation注释类型resource的类成员方法: type定义及介绍
  • 请问能否把任何类型数据转换为一种类型,然后从这种类型又转换回去?例如:int>>Object Object>>int
  • java命名空间javax.xml.ws注释类型webserviceref成员方法: value定义参考
  • ado的rs.field("字段名")可以访问任何类型的数据,那吗java里面这种问题如何处理。是不是要先判断类型然后再根据类型来使用相应的getint or getString阿!谢谢了!在线等待!
  • java命名空间javax.annotation注释类型resource的类成员方法: shareable定义及介绍
  • oracle中的空类型与c语言的空类型相匹配吗?
  • java命名空间javax.jws注释类型webparam的类成员方法: mode定义及介绍
  • 如何将String类型转换成Blob类型
  • java命名空间javax.xml.ws注释类型webserviceref成员方法: wsdllocation定义参考
  • 怎样将字符串类型转换成double类型?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3