Generic 基本知识

泛型的定义与使用

1.         泛型的定义

2.         泛型类型参数的使用

定义:只有当方法具有它自己的类型参数列表时,才能称其为泛型方法。

1.1   代码

    /// <summary>

    /// T 作为myGeneric类型参数

    /// </summary>

    /// <typeparam name="T"></typeparam>

    public class myGeneric<T>

    {

        /// <summary>

        /// 类型T参数作为字段的类型

        /// </summary>

        public T PropertyA

        {

            get;

            set;

        }

 

        /// <summary>

        /// 类型参数T作为方法的参数类型与返回值类型

        /// </summary>

        /// <param name="a"></param>

        /// <returns></returns>

        public T GetA(T a)

        {

            return a;

        }

 

        /// <summary>

        /// 类型参数T作为方法的类型参数列表

        /// </summary>

        /// <typeparam name="T"></typeparam>

        /// <param name="a"></param>

        /// <returns></returns>

        public T GetB<T>(T a)

        {

            return a;

        }

}

1.2   类型参数的属性说明

类型参数可以作为属性的类型

类型参数可以作为方法的返回类型

类型参数可以作为方法的参数类型

类型参数可以作为方法的类型参数列表

其中GetB<T>(T a) 是泛型方法,因为具有方法的类型参数<T>.

GetAT a)不是泛型方法,方法没有类型参数,只有参数的类型。

 

泛型术语

泛型类型定义

泛型类型参数

Node<T>

构造泛型类型

泛型类型参数

约束

泛型方法定义

      public class myGeneric<T>

    {

 

        public T GetB<T>(T a)

        {

            return a;

        }

}

开放类型与封闭类型

 

Node<int> 封闭类型;

Node<T> 开放类型;

 

 

约束

约束定义

在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用 where 上下文关键字指定的。

 

约束的分类示例

分类:

 

 

 

 

 

 

 

名称

约束

说明

1

T:class X

类型参数必须是引用类型

2

T: struct X

类型参数必须是非null的值类型。

此约束并不是T必须继承结构体的类型

3

T:基类名X

类型参数必须是继承基类的类型

4

TInterface IX

类型参数必须是实现IX的类型

5

TU

类型参数必须是给出的类型或派生自U的类型

6

Tnew ()

类型参数必须是具有构造参数的类型

7

组合上面几种约束

约束本身也可以是泛型

 

 

    

 

 

 

 

 

 

 

                                      

示例:

约束1

定义:

public class myA<T> where T :class

    {

 

    }

调用:

static void TestGenericRestrict()

        {

            //myA<int> myInt = new myA<int>();

            //类型int必须是引用类型才能用作泛型类型或方法GenericApp.myA<T>中的参数T

 

            myA<string> myString = new myA<string>();

        }

 

约束2

定义:

public class myB<T> where T : struct

    {

    }

调用:

   static void TestGenericRestrict2()

        {

            myB<int> myInt = new myB<int>();

           

            //myB<string> myString = new myB<string>();

 

            //类型string必须是不可以为 null 值的类型才能用作泛型类型或方法GenericApp.myB<T>中的参数T 

 

        }

约束3

定义:

public class myStudent

    {

        public string Name

        {

            get;

            set;

        }

    }

 

 

    public class myC<T> where T : myStudent

    {

        public T FormatName(T a)

        {

            a.Name = string.Format("Name:{0}",a.Name );

            return a;

        }

    }

调用:

 static void TestGenericRestrict3()

        {

            myC<myStudent> myCStudent = new myC<myStudent>();

            Console .WriteLine ( myCStudent.FormatName(new myStudent (){Name="AAAa"}).Name );

 

       

        }

约束4

定义:

public class myD<T> where T : IComparable

    {

    }

调用:

static void TestGenericRestrict4()

        {

            myD<string> myD = new myD<string>();

 

            //myD<myStudent> myDStudent = new myD<myStudent>();

            //不能将类型GenericApp.myStudent用作泛型类型或方法GenericApp.myD<T>中的类型形参T。没有从GenericApp.myStudentSystem.IComparable的隐式引用转换。 E

 

        }

 

约束5

定义:

public class myE1

    {

    }

 

    public class myE2:myE1

    {

 

    }

 

    public class myE<T,U> where T : U

    {

 

    }

调用:

static void TestGenericRestrict5()

        {

            // myE<myF1, myF2> myTest= new myE<myF1, myF2>();

 

            //不能将类型GenericApp.myF1用作泛型类型或方法GenericApp.myE<T,U>中的类型形参T。没有从GenericApp.myF1GenericApp.myF2的隐式引用转换。    

 

 

            myE<myE2, myE1> myTest2 = new myE<myE2, myE1>();

 

        }

约束6

public class myF1

    {

        public myF1()

        {

         

        }

    }

 

    public class myF2

    {

 

    }

    public class myF<T> where T : new()

    {

        public T GetNewItem()

        {

            return new T();

        }

    }

定义:

 

public class myF1

    {

        public myF1()

        {

         

        }

    }

 

    public class myF2

    {

 

    }

    public class myF<T> where T : new()

    {

        public T GetNewItem()

        {

            return new T();

        }

}

 

调用:

static void TestGenericRestrict6()

        {

            myF<myF1> myFF1 = new myF<myF1>();

 

            myFF1.GetNewItem();

 

 

            myF<myF2> myFF2 = new myF<myF2>();

 

            myFF2.GetNewItem();

 

            myF2 g = new myF2();

 

            //由于编译器自动添加无参构造函数,所以myFF2 也能编译通过

        }

 

约束7

定义:

public class myG<T> where T:myA<T> ,IComparable<T>,new()

    {

 

    }

调用:

 

转载于:https://www.cnblogs.com/hbb0b0/archive/2009/09/19/1569845.html

weixin073智慧旅游平台开发微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
python017基于Python贫困生资助管理系统带vue前后端分离毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值