Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >泛型学习由浅入深

泛型学习由浅入深

作者头像
wfaceboss
发布于 2019-04-08 03:33:46
发布于 2019-04-08 03:33:46
28800
代码可运行
举报
文章被收录于专栏:wfacebosswfaceboss
运行总次数:0
代码可运行

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  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类型的参数   

代码为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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来作为一个占位符,等待在实例化时用一个实际的类型来代替

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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类型是所有类型的父类)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-02-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
认真CS☀️泛型
第一个类实现了int型的功能,第二个类通过剪切、改类名、将int改为float实现float型功能,通过这种方式的变换实现float型功能当然可行,但有以下缺点:
星河造梦坊官方
2024/08/14
1890
泛型的原理、应用
泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。
指尖改变世界
2019/06/02
6630
C#基础篇——泛型
在开发编程中,我们经常会遇到功能非常相似的功能模块,只是他们的处理的数据不一样,所以我们会分别采用多个方法来处理不同的数据类型。但是这个时候,我们就会想一个问题,有没有办法实现利用同一个方法来传递不同种类型的参数呢?
zls365
2021/04/23
1.5K0
C#基础篇——泛型
【c#】泛型
1.泛型:宽泛的——不确定的; 型:类型——不确定的类型 2.调用普通方法的时候,参数类型在声明时就确定了,调用按照类型传递参数即可 3.如果可以通过参数推导出来则可以省略尖括号
MaybeHC
2024/04/23
2040
【c#】泛型
看到他我一下子就悟了-- 泛型(1)
1.泛型概念:       本质上,术语”泛型”指的是”参数化类型(parameterized types)”.参数化类型非常重要,因为它们可以在创建类.结构.方法和委托的时候将要操作的数据类型作为参 数进行指定.使用参数化类型的类.结构.方法和委托都可以称为泛型,如”泛型类”或者”泛型方法”.        在具体声明一个变量或者实例化之前,类型参数T只是一个占位符。等到具体声明和实例化的时候,编译器要求代码指定类型参数。泛型类型声明了泛型参数占位符类型,由泛型类型的用户填写这些占位符,并作为泛型的参数提
hbbliyong
2018/03/05
8110
C#.net 泛型学习
            Test<string, int> t = new Test<string, int>('SHY520',22);
jack.yang
2025/04/05
1070
10分钟教你理解反射
反射反射,程序员的快乐,在.Net领域程序设计中,反射是无处不在的,MVC、ASP.Net、各种ORM、IOC、AOP几乎所有的框架都离不开反射。反编译工具使用的底层技术用的不是反射,是一种逆向工程。
指尖改变世界
2019/06/14
5550
编写高质量代码改善C#程序的157个建议[优先考虑泛型、避免在泛型中声明静态成员、为泛型参数设定约束]
  泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能。基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用。同时,它减少了泛型类及泛型方法中的转型,确保了类型安全。委托本身是一种引用类型,它保存的也是托管堆中对象的引用,只不过这个引用比较特殊,它是对方法的引用。事件本身也是委托,它是委托组,C#中提供了关键字event来对事件进行特别区分。一旦我们开始编写稍微复杂的C#代码,就肯定离不开泛型、委托和事件。本章将针对这三个方面进行说明。
aehyok
2018/08/31
7170
编写高质量代码改善C#程序的157个建议[优先考虑泛型、避免在泛型中声明静态成员、为泛型参数设定约束]
C#进阶学习--反射(Reflection)
(1)Assembly:定义和加载程序集,加载在程序集中的所有模块以及从此程序集中查找类型并创建该类型的实例。
腾云大使
2022/01/13
1.5K0
C#反射与特性(九):全网最全-解析反射
C# 中的访问修饰符:public、private、protected、internal、protected internal。
痴者工良
2021/04/26
2.3K0
泛型程序设计详解(一)
  泛型是C#和.Net的一个重要概念,泛型不仅是C#编程语言中的一部分,而且与程序集中的IL(Intermediate Language)代码紧密的集成。
小世界的野孩子
2019/07/30
6950
C# 学习笔记(9)—— 泛型
C# 2.0 提出的泛型特性使类型可以被参数化,从而不必再为不同的而类型提供特殊版本的方法实现。泛型提供了代码重用的另一种机制,它不同于面向对象中通过继承方式实现代码重用,更准确地说,泛型锁提供的代码重用是算法的重用,即某个方法实现不需要考虑所操作数据的类型
Karl Du
2023/10/20
3290
Java之泛型详解
实际上,也不需要这样做,因为一个 ArrayList 类可以聚集任何类型的对象。这是一个泛型程序设计的实例。
用户5224393
2019/08/20
6430
C#委托
在C#中的委托关键字是 Delegate,委托类似于C/C++中函数的指针。是存有对某个方法引用的引用类型变量,可在运行时被改变。一般用于实现事件和回调方法。
喵叔
2020/09/08
6210
C#委托
事件总线知多少(1)
源码路径:Github-EventBus 事件总线知多少(1) 事件总线知多少(2) 1. 引言 事件总线这个概念对你来说可能很陌生,但提到观察者(发布-订阅)模式,你也许就很熟悉。事件总线是对
圣杰
2018/01/11
1.6K0
事件总线知多少(1)
AutoMapper快速上手
AutoMapper是一个简单的对象映射框架(OOM),对象映射原理是把一种类型的输入对象转换为不同类型的输出对象,通俗讲就是通过一些约束讲一种类型中数据自动映射到另一数据类型中
莫问今朝
2019/02/25
4.5K0
C#三十二 泛型的理解和使用
日常生活中的事物都是有类型的,比如我们说“一个女人”,那么“女”就是这个人的类型。我们可以说“女人都是水做的”,那么听者都知道这是在说“女”这种类型的人。再比如你去肉店买肉,你可以对老板说“我要十斤猪肉”,那么老板一定知道你是在要“猪”这种类型的肉。日常生活中的这些语言都是带有类型的,但是在日常生活中还有一些语言是不带类型的。比如我们经常说“人是贪婪的”,这里的人就没有类型之分,听者都知道是指所有的人;我们也可以在肉店里指着猪肉说“给我来十斤肉”,肉店老板同样知道你要的是猪肉。
张哥编程
2024/12/13
2160
C#2.0新增功能02 泛型
  C# 语言和公共语言运行时 (CLR) 的 2.0 版本中添加了泛型。 泛型将类型参数的概念引入 .NET Framework,这样就可以设计具有以下特征的类和方法:在客户端代码声明并初始化这些类和方法之前,这些类和方法会延迟指定一个或多个类型。
张传宁IT讲堂
2019/09/17
7630
30分钟泛型教程
一、泛型入门: 我们先来看一个最为常见的泛型类型List<T>的定义 (真正的定义比这个要复杂的多,我这里删掉了很多东西) [Serializable] public class List<T> : IList<T>, ICollection<T>, IEnumerable<T> { public T this[int index] { get; set; } public void Add(T item); public void Clear(); public bool
liulun
2018/01/12
8270
[读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器
前言 C#1.0的委托特性使方法作为其他方法的参数来传递,而C#2.0 中提出的泛型特性则使类型可以被参数化,从而不必再为不同的类型提供特殊版本的实现方法。 另外C#2.0还提出了可空类型,匿名方法和迭代器3个优美的特性。 1,泛型 1.1 泛型是什么 泛型的英文表述是"generic", 这个单词意为通用的。从字面意思可知,泛型代表的就是"通用类型",它可以代替任意的数据类型,使类型参数化, 从而达到之实现一个方法就可以操作多种数据类型的目的。泛型是将方法实现行为与方法操作的数据类型分离,实现了代码重用。
一枝花算不算浪漫
2018/05/18
1.4K0
相关推荐
认真CS☀️泛型
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档