专栏首页wfaceboss泛型学习由浅入深

泛型学习由浅入深

第一章:根据具体的需求得出结果:

需求为:通过编写单独的方法在控制台同时输出    int iValue=123,long lValue=123123 的类型。

第一种方法:单独调用方法并输出 (明确类型前提下)

  class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("开始学习!!!");
            int iValue = 123;
            long lValue = 123123;

            MethodShow.ShowInt(iValue);

            MethodShow.ShowLong(lValue);

            Console.Read();
        }

    }

    public class MethodShow
    {
        /// <summary>
        /// int参数
        /// </summary>
        /// <param name="iParameter"></param>
        public static void ShowInt(int iParameter)
        {
            Console.WriteLine("这里是MethodShow下的ShowInt{0}类型为{1}", iParameter,iParameter.GetType());
        }
        /// <summary>
        /// long参数
        /// </summary>
        /// <param name="lParameter"></param>
        public static void ShowLong(long lParameter)
        {
            Console.WriteLine("这里是MethodShow下的ShowLong{0}类型为{1}", lParameter, lParameter.GetType());
        }
    }

从上可以看出为了实现int 类型  和long 类型 各自单独写了各自的方法,这样容易造成代码冗余,代码质量低下。希望能将两者的方法进行一个合并,故考虑使用某种类型能够同时容纳这两种类型,

因此想到object类型和泛型方法

第二种方法,通过object类型的参数   

代码为:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Study
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("开始学习!!!");
            int iValue = 123;

            long lValue = 123123;
            MethodShow.ShowObject(iValue);
            MethodShow.ShowObject(lValue);
            Console.Read();
        }

    }
    public class MethodShow
    {
        /// <summary>
        /// object 参数
        /// </summary>
        /// <param name="oParameter"></param>
        public static void ShowObject(object oParameter)
        {
            Console.WriteLine("这里是MethodShow下的ShowObject{0}类型为{1}", oParameter, oParameter.GetType());
        }
    }
}

第三种方法,泛型方法         ,用一个通用的数据类型T来作为一个占位符,等待在实例化时用一个实际的类型来代替

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("开始学习!!!");
            //int iValue = 123;
            //long lValue = 123123;
            //MethodShow.ShowGeneric(iValue);//调用泛型方法
            //MethodShow.ShowGeneric(lValue);//调用泛型方法
                       等价于:
////////////////////////////////在调用时才指明参数类型
              //int iValue = 123; 
              //long lValue = 123123;
             MethodShow.ShowGeneric<int>(iValue);
             MethodShow.ShowGeneric<long>(lValue);
//注意:传参时所传递的参数类型必须与参数类型(T被指定的类型)一致否则立即报错
            
            Console.Read();
        }

    }

    public class MethodShow
    {
      
        /// <summary>
        /// 泛型 参数
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="tParameter"></param>
        public static void ShowGeneric<T>(T tParameter)//声明泛型
        {
            Console.WriteLine("这里是MethodShow下的ShowGeneric{0}类型为{1}", tParameter, tParameter.GetType());
        }
    }

通过以上的方法可以看出使用object类型的参数和使用泛型参数后可以减少代码的书写,但也有区别。

1.使用object类型的原理:

(1)object类型是任何类型的父类

(2)任何父类出现的地方,都可以用子类代替(里氏转换原则)

  缺点:

(1)使用object类型参数的方法需要经过装箱和拆箱的过程,影响了性能

(2)使用object类型参数的方法,无法知道在运行的时候的准确类型(因为object类型是任何类型的父类)可能传入错误的参数导致出错

2.泛型方法(有类型 参数)在调用的时候才指明参数类型

使用格式:

首先,声明泛型方法: T是类型参数 在使用时才指定具体类型

访问修饰符 返回值类型  方法名称<T>(T 形参)

{

方法体

}

然后,调用泛型方法

方法名称<具体的参数类型>(对应的实参t);//对应的实参t:有具体的参数类型

注意:具体的参数类型与对应的实参t必须要是相同的类型

相对于object类型参数方法使用泛型的优点有:

(1)性能优于object类型,与普通方法一样(使用效率高)

(2)传参时所传递的参数类型(t)必须与参数类型(T被指定的类型)一致,否则立即报错,也就是能够立即知道所传的参数是否准确。

第二章:泛型约束

泛型可以进行类型的约束,但object不可以进行类型的约束(因为object类型是所有类型的父类)

class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("开始学习!!!");

            Chinese chinese = new Chinese()
            {
                CN = "中文",
                Wall = "万里长城",
                Id=12123,
                Name= "张三",
                Age=19
            };//对象初始化器
            MethodShow.SayHiShow(chinese); //调用泛型方法         
            Console.Read();
        }

    }

    public class MethodShow
    {
        /// <summary>
        /// 泛型约束
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="t"></param>
        public static void SayHiShow<T>(T t) where T :People    //对类型参数T进行约束
        {
            t.SayHi();
            Console.WriteLine("{0},{1},{2}", t.Id, t.Name, t.Age);
        }
        //public static void SayHiObject(object o) //  无法约束
       // {
            
        //}

    }
    public class People
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public int Age { get; set; }
        public void SayHi()
        {
            Console.WriteLine("{0}说,早上好", this.Name);
        }
    }

    public class Chinese:People
    {
        /// <summary>
        /// 中文
        /// </summary>
        public string CN { get; set; }
        /// <summary>
        /// 长城
        /// </summary>
        public string Wall { get; set; }
    }

 注意:使用泛型时参数必须是约束的参数类型和可以(类型参数T和参数类型t)匹配的参数。

更多泛型知识请访问:http://blog.csdn.net/haukwong/article/details/7840158

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 链表应用--基于链表实现队列--尾指针

    在开始栈的实现之前,我们再来看看关于链表的只在头部进行的增加、删除、查找操作,时间复杂度均为O(1)。

    wfaceboss
  • JavaScript责任链模式

    责任链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将对象连成一条链,并沿着这...

    wfaceboss
  • JavaScript组合设模式--改进上述引入的例子

    (5)客户端调用API,只需要简单的安排去上课即可,也就是客户端只需要写去上课的代码即可

    wfaceboss
  • 函数参数python

    函数中的默认参数,调用的时候可以给参数 赋值,也可以使用默认值 修改add函数如下

    py3study
  • 泛型类、泛型方法、类型通配符的使用

           你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型,编译器适当地处理每一个方法调用。

    泰斗贤若如
  • Java入门 - 高级教程 - 03.泛型

    原文地址:http://www.work100.net/training/java-generic.html

    光束云
  • WPF自学入门(十一)WPF MVVM模式Command命令

    在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新。但是这并不是我们使用MVVM的正确方式。正如上一...

    黄昏前黎明后
  • Web-第十五天 Ajax学习【悟空教程】

    在实际开发中,完成注册功能前,如果用户填写用户信息,准备填写其他信息时,将提示当前用户的用户名是否可用。效果图如下:

    奋斗蒙
  • swift 3.0 基础练习 面向对象 类

    gwk_iOS
  • 《SpringMVC从入门到放肆》十、SpringMVC注解式开发(复杂参数接收)

    注意:整体接收需要表单的name属性值与实体的属性名一致。比如input的name为age,那么与之对应的实体类中,必须有一个age属性,并且该age属性需要有...

    I Tech You_我教你

扫码关注云+社区

领取腾讯云代金券