C#入门级——泛型、泛型类、泛型接口、泛型方法和泛型委托

本文详细介绍了C#中的泛型概念,包括泛型类、泛型接口、泛型方法和泛型委托的定义与使用。通过具体的例子阐述了泛型在解决类型膨胀和提高代码复用性方面的作用,同时讲解了泛型接口的两种实现方式以及泛型方法与泛型委托在实际编程中的应用。文章最后提到了泛型委托与Lambda表达式的配合使用,增强了代码的简洁性和灵活性。
摘要由CSDN通过智能技术生成

目录

一、泛型(generic)

二、为什么需要泛型类

类型膨胀

成员膨胀

使用object类

三、泛型的定义

定义泛型类

使用泛型类

泛型接口​​​​​​​

两种泛型接口的实现方法

泛型方法

成员膨胀

使用泛型

泛型委托

Action委托——只能引用没有返回值的方法

Func泛型委托——要有返回值

泛型委托和Lambda表达式的配合使用


一、泛型(generic)

泛型类是以实例化过程中提供的类型或类为基础建立的,可对对象进行强类型化

尖括号语法是把类型参数传送给泛型类型的方式

泛型并不限于类,还可以创建泛型接口、泛型方法(可以在非泛型类上定义),甚至泛型委托

泛化和特化是相对的

System.Collections.Generics名称空间的两个类型

类型:List<T>               说明:T类型对象的集合

类型:Dictionary<K,V> 说明:与K类型的键值相关的V类型的项的集合

前文已提及到:

C#集合、定义集合、索引符、List<T>、Dictionary<K,V>、键控集合(键值)和IDictionary_dlwlrma_516的博客-CSDN博客https://blog.csdn.net/dlwlrma_516/article/details/127139139?spm=1001.2014.3001.5501

二、为什么需要泛型类

场景:新百货商店开业,两个类,Chair类,Desk类

不同的货物要用不同的纸箱去装

类型膨胀

现在百货商店新开张,卖Chair和Desk,Chair需要用ChairCarton装,Desk需要用DeskCarton装;但是如果以后百货商店有1000种商品呢?要准备1000种纸箱吗?而且程序不好维护…

创建控制台项目

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

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Chair chair = new Chair() { Color = "Red" };
            ChairCarton chairCarton = new ChairCarton() { Cargo = chair };
            Console.WriteLine(chairCarton.Cargo.Color);

            Desk desk = new Desk() { Weight = "20kg" };
            DeskCarton deskCarton = new DeskCarton() { Cargo = desk };
            Console.WriteLine(deskCarton.Cargo.Weight);
            Console.ReadKey();
        }
    }

    class Chair
    {
        public string Color { get; set; }
    }

    class Desk
    {
        public string Weight { get; set; }
    }

    class ChairCarton
    {
        public Chair Cargo { get; set; }
    }
    class DeskCarton
    {
        public Desk Cargo { get; set; }
    }
}

成员膨胀

只准备一种纸箱,填写不同的属性,carton1实例只用到了Chair属性,没有用到Desk属性,而carton2属性则相反

以后1000种商品呢?Carton类1000个对应属性,只有1个属性能用,每次增加或减少商品,都要修改Carton类

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

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Chair chair = new Chair() { Color = "Red" };
            Desk desk = new Desk() { Weight = "20kg" };
            Carton carton1 = new Carton() { ChairCargo = chair };
            Carton carton2 = new Carton() { DeskCargo = desk };
            Console.WriteLine(carton1.ChairCargo.Color);
            Console.WriteLine(carton2.DeskCargo.Weight);
            Console.ReadKey();
        }
    }

    class Chair
    {
        public string Color { get; set; }
    }

    class Desk
    {
        public string Weight { get; set; }
    }

    class Carton
    {
        public Chair ChairCargo { get; set; }
        public Desk DeskCargo { get; set; }
    }
}

使用object类

当把东西往盒子里装时是省事了,但是要把东西从盒子里拿出来时,访问盒子中装的东西就很麻烦

(chair实例赋值给Cargo属性,在Console.WriteLine(carton1.Cargo.时,系统在可选择下拉框中,就已经找不到chair实例下的有关属性Color,需要强制类型转换/as属性操作符)

使用?.的原因:若是个Chair类则打印Color属性,若是Desk类则不会打印Color属性


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

namespace ConsoleApp1
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Chair chair = new Chair() { Color = "Red" };
            Desk desk = new Desk() { Weight = "20kg" };
            Carton carton1 = new Carton() { Cargo = cha
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值