泛型基础----------泛型方法二

本文详细介绍了C#中的泛型方法,包括如何通过泛型方法约束参数类型,如引用类型、值类型及自定义类型,并展示了如何返回不同类型参数的具体实现。
上篇博客写了泛型方法的介绍,本篇主要讲解泛型方法的返回,约束。
先上代码:
这是公共类的代码,我又新建了一个类:
namespace Generic0521.Common
{
    public static class GenericBase02
    {

        public static void ShowTC<T>(T t) where T : class
        {
            MessageBox.Show(t.ToString());
        }
        public static void ShowTS<T>(T t) where T : struct
        {
            MessageBox.Show(t.ToString());
        }


        public static void ShowTP<T>(T t) where T : People
        {
            MessageBox.Show(t.ID.ToString() + "------" + t.Name);
        }
        public static int ShowTPRE<T>(T t) where T : People
        {
            MessageBox.Show(t.ID.ToString() + "------" + t.Name);
            return 10;
        }


        public static K ShowTPRE<T, K>(T t)
            where T : People
            where K : People,new ()
        {
            MessageBox.Show(t.ID.ToString() + "------" + t.Name);

            K p = new K();
            p.ID = 1111;
            p.Name = "qhhh2";
            return p;
        }

    }

这是调用的代码:

 private void button2_Click(object sender, EventArgs e)
        {
            People p1 = new People();
            p1.ID = 1;
            p1.Name = "qhh";
            //GenericBase02.ShowTS<int>(1);
            //GenericBase02.ShowTC<string>("qhhh");
            //GenericBase02.ShowTC<People>(p1);
            //GenericBase02.ShowTPRE<People>(p1);

            People pppp = GenericBase02.ShowTPRE<People, People>(p1);
        }

先从这个约束说吧,可以看到,咱们这次写的方法,比上一篇最大的不同之处就是参数那个半个括号后面增加了where然后就是巴拉巴拉的,这就是泛型方法的约束。
T:class可不是T继承自class,是指T是引用类型的意思,也就是说,咱们这边传过来的参数是引用类型的,方法定义好之后去调用,不是引用类型的参数编译不过去,这就证明了这点。
除了class引用类型外,还有struct值类型,参数类型比如int 时间等等,咱们实际开发中啊,还是跟数据库和定义的实体关系最大,这就是自定义类型的约束,比如第三个方法,这样不仅可以约束传来的参数是People类型的,还可以在这个方法内部使用传来的自定义类型的方法和属性,而且根据里氏代换的原则,我们不仅可以传递People类型,也可以传递他的子类。

    说完了这个基本的约束,咱们来看看返回类型吧。
1、返回已定的基本类型,就比如第四个方法   public static int ShowTPRE<T>(T t) where T : People,传入自定义类型的参数,返回int  就直接写就行,跟平常方法一样,没什么说的。
2、返回自定义的类型参数。
返回自定义类型的参数,那就是咱们做的实体啦什么的了,但是咱们传进来的实体是A,根据各种具体业务计算后咱们要返回B,那就是方法五这样写了。
 public static K ShowTPRE<T, K>(T t)
            where T : People
            where K : People,new ()
        {
            MessageBox.Show(t.ID.ToString() + "------" + t.Name);

            K p = new K();
            p.ID = 1111;
            p.Name = "qhhh2";
            return p;
        }

首先,尖括号里有两个字母了,因为什么呢?因为你不管返回什么参数出去,你得定义他的类型吧,咱们上篇也说了,这个尖括号中的字母什么的就是占位符,你调用时候传的类型的占位符。后边的where是咱们上面的讲的约束,怎么多加了一个new()?这个new是约定这个K是可以实例化 有无参构造函数的约束。
咱们这里的例子传来的返回的都是People类型的,可能看不出来什么作用,甚至把自己绕晕了,建议在测试学习时候返回类型换个其他的自己定义的实体类型。
在方法五中,方法体中咱们new了一个K类型的实例,为什么能new,就是上边new()约束的作用啦,不然你K new不出来,new个People返回不出去,因为方法不接收 0.0, 而且,这个p变量就代表了People,使用属性,方法等。

暂时到这里了,看着代码相对容易理解,我写的文字就做一下代码的解释,相当于注释啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不老的老头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值