C# 泛型类

C#泛型类使用与继承详解 泛型类是在定义时使用一个或多个型参数来实现的。型参数可以在的任何地方使用,就如同它们已经被具体的数据型所替代一样。这使得开发者可以在创建实例时指定型,编译时就能确认型安全,同时保持代码的清晰和简洁。// C#中的泛型类示例} }在上述示例中,T是一个泛型类型参数,代表了Stack中元素的数据型。泛型类允许用户定义可以适用于不同数据型的。在C#中,型是通过在名后添加尖括号<T>的形式来声明的。T可以是任意标识符,代表了一个型参数。 阅读详情

泛型类实例化的理论
C#泛型类在编译时,先生成中间的代码IL,通常类型T只是一个占位符。在实例化类时,根据用户指定的数据类型代替T并由即时编译器(JIT)生成本地代码,这个本地代码中已经使用了实际的数据类型,等同于用实际类型写的类,所以不同的封闭类的本地代码是不一样的。按照这个原理,我们可以这样认为:
泛型类的不同的封闭类是分割不同的数据类型。
例:Stack和Stack是两个完全没有任何关系的类,你可以把他看成类A和类B,这个解释对泛型类的静态成员的理解有很大帮助。
泛型中的静态成员变量
在C#1.x中,我们知道类的静态成员变量在不同的类实例间是共享的,并且他是通过类名访问的。C#2.0中由于引进了泛型,导致静态成员变量的机制出现了一些变化:静态成员变量在相同封闭类间共享,不同的封闭类间不共享。
这也非常容易理解,因为不同的封闭类虽然有相同的类名称,但由于分别传入了不同的数据类型,他们是完全不同的类,比如:
Stack a = new Stack();
Stack b = new Stack();
Stack c = new Stack();
类实例a和b是同一类型,他们之间共享静态成员变量,但类实例c却是和a、b完全不同的类型,所以不能和a、b共享静态成员变量。
泛型中的静态构造函数
静态构造函数的规则:只能有一个,且不能有参数,他只能被.NET运行时自动调用,而不能人工调用。
泛型中的静态构造函数的原理和非泛型类是一样的,只需把泛型中的不同的封闭类理解为不同的类即可。以下两种情况可激发静态的构造函数:

  1.   特定的封闭类第一次被实例化。
    
  2.   特定封闭类中任一静态成员变量被调用。
    

泛型的优点
针对早期版本的通用语言运行时和C#语言的局限,泛型提供了一个解决方案。以前类型的泛化(generalization)是靠类型与全局基类System.Object的相互转换来实现。.NET框架基础类库的ArrayList容器类,就是这种局限的一个例子。ArrayList是一个很方便的容器类,使用中无需更改就可以存储任何引用类型或值类型。
//The .NET Framework 1.1 way of creating a list
ArrayList list1 = new ArrayList();
list1.Add(3);
list1.Add(105);
//…
ArrayList list2 = new ArrayList();
list2.Add(“It is raining in Redmond.”);
list2.Add(“It is snowing in the mountains.”);
但是这种便利是有代价的,这需要把任何一个加入ArrayList的引用类型或值类型都隐式地向上转换成System.Object。如果这些元素是值类型,那么当加入到列表中时,它们必须被装箱;当重新取回它们时,要拆箱。类型转换和装箱、拆箱的操作都降低了性能;在必须迭代(iterate)大容器的情况下,装箱和拆箱的影响可能十分显著。
泛型的使用范围
泛型类和泛型方法兼复用性、类型安全和高效率于一身,是与之对应的非泛型的类和方法所不及。泛型广泛用于容器(collections)和对容器操作的方法中。.NET框架2.0的类库提供一个新的命名空间System.Collections.Generic,其中包含了一些新的基于泛型的容器类。要查找新的泛型容器类(collection classes)的示例代码,请参见基础类库中的泛型。当然,你也可以创建自己的泛型类和方法,以提供你自己的泛化的方案和设计模式,这是类型安全且高效的。下面的示例代码以一个简单的泛型链表类作为示范。(多数情况下,推荐使用由.NET框架类库提供的List类,而不是创建自己的表。)类型参数T在多处使用,具体类型通常在这些地方来指明表中元素的类型。类型参数T有以下几种用法:
l 在AddHead方法中,作为方法参数的类型。
l 在公共方法GetNext中,以及嵌套类Node的 Data属性中作为返回值的类型。
l 在嵌套类中,作为私有成员data的类型。

注意一点,T对嵌套的类Node也是有效的。当用一个具体类来实现MyList时——如MyList——每个出现过的T都要用int代替。

using System;
using System.Collections.Generic;

public class MyList //type parameter T in angle brackets
{
private Node head;
// The nested type is also generic on T.
private class Node
{
private Node next;
//T as private member data type:
private T data;
//T used in non-generic constructor:
public Node(T t)
{
next = null;
data = t;
}
public Node Next
{
get { return next; }
set { next = value; }
}
//T as return type of property:
public T Data
{
get { return data; }
set { data = value; }
}
}
public MyList()
{
head = null;
}
//T as method parameter type:
public void AddHead(T t)
{
Node n = new Node(t);
n.Next = head;
head = n;
}

    public IEnumerator<T> GetEnumerator()
    {
        Node current = head;

        while (current != null)
        {
            yield return current.Data;
            current = current.Next;
        }
    }
}

实际上,泛型还可以用在类方法、接口、结构(struct)、委托等上面使用,使用方法大致相同,就不再讲述。

高能物理相关软件 国内高能物理实验背景     研究物质最深层次结构及相互作用的前沿基础科学。 现代高能物理实验的要素    实例源 、 探测器、   电子学、  触发 DAQ、  原始数据、 刻度、重建 、物理分析、  成果  。 离线软件的地位和作用。    是硬件设备和物理学家的桥梁,是从数据到物理成果转化中的关键和重要的环节。 高能物理实验及其特点 独一无二性,实验规模越来越大,努力省钱(使用 阅读详情

相关推荐

数字蓝牙功放

数字蓝牙功放(TPA3110+BK8000L),基于D数字功放芯片TPA3116蓝牙功放,HIFI级带滤波15Wx2蓝牙数字功放,支持有线和蓝牙两种音源输入

runweipa的博客 1387

C# 型详解(泛型类,方法,接口,委托,约束,反射 )

型(Generic),是将不确定的型预先定义下来的一种C#高级语法,我们在使用一个,接口或者方法前,不知道用户将来传什么型,或者我们写的,接口或方法相同的代码可以服务不同的型,就可以定义为型。这会大大简化我们的代码结构,同时让后期维护变得容易。...............

熊思雨的博客 2万+

SwiftUI 5 教程之 SwiftData使用入门(教程含源码)

对我来说,记住日期很难。是的,您可以设置该日期的提醒,但该提醒无法产生紧迫感。让我们创建一个应用程序,我们可以在其中添加将来发生的事件。如果我们可以在主应用程序上看到所有即将发生的活动,那就太好了。也许将它们添加到小部件上以营造紧迫感。对于任何事件,我们需要跟踪哪些事情?我们将在下一篇文章中添加更多属性,其中我们将讨论迁移。现在,这就是我们所需要的。开始吧。

iCloudEnd的博客 949

C#型的理解

型的概念 定义:型允许我们延迟编写或方法中的编程元素的数据型的规范,直到实际在程 序中使用它的时候。(也就是说型是可以与任何数据型一起工作的或方法)模块内高 内聚,模块间低耦合。 型的使用:当我们的/方法不需要关注调用者传递的实体是什么(公共基工具 ),这个时候就可以使用型。 注意: 集合中的项允许是 object 型的值,因此可以存放任意型的值,无法确保存入集合中 的值都是同一型,而导致在处理时发生异常。 可空型 对于引用型的变量来说,如果未对其赋值,在默认情况下

qq_57767445的博客 2443

C#中的

编写程序时,经常遇到两个模块的功能非常相似,区别只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据型,我们只能分别写多个方法处理每个数据型,因为方法的参数型不同。ArrayList不是型安全的,使用时很可能出现型不匹配的错误,就算都插入了同一型的数据,使用时我们也需要将它们转化为对应的原型来处理。泛型类的定义与型方法似,是在泛型类的名称后面加上<T>,当然,也可以定义多个型,即“<T1,T2,・・・>“ArrayList 存储在装箱和拆箱操作,导致其性能低下。

AuraroTeen的博客 5194

图解C#高级教程(三):

在使用泛型类创建变量时,可以使用关键字var,让编译器根据右边的型自动推断变量的型。set;set;// 让编译器推断型103.14Hellotrue需要注意的是,为具体分配的内存是存储在堆上的。

聚焦C++/Python编程语言、大模型应用开发 4688

C#泛型类

一、泛型类的简介 所谓的型就是不知道具体的型的一种通用表达。型和概念和C++中的模板,LabVIEW中的变体略有相似。用型定义的具有多态的作用。 型的出现目的在于解决能应用在不同数据型上的共有代码。 示例如下: class Program { public class Static<T> //定义的泛型类 { int p...

weixin_40786497的博客 2065

C#泛型类的定义及使用

C#语言中泛型类的定义与型方法似,是在泛型类的名称后面加上<T>,当然,也可以定义多个型,即“<T1,T2,・・・>”。 具体的定义形式如下。 class 名<T1,T2,…> { //的成员 } 这样,在的成员中即可使用 T1、T2 等型来定义。 下面通过实例来演示泛型类的使用。 【实例】定义泛型类,并在泛型类中定义数组,提供添...

csdnsunyf的专栏 2553

C#泛型类的扩展方法

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Threading; namespace HelloWorld { class Holder { T[] Vals = new T[3

坤的专栏 6532

C# 泛型类

泛型类public class TestClass<T, A> { public T t; public A a; public TestClass(T t) { this.t = t; } public TestClass(A ...

weixin_30892889的博客 84

php 泛型类,C#泛型类的定义及使用

C# 语言中泛型类的定义与型方法似,是在泛型类的名称后面加上,当然,也可以定义多个型,即“”。具体的定义形式如下。class 名{//的成员}这样,在的成员中即可使用 T1、T2 等型来定义。下面通过实例来演示泛型类的使用。【实例】定义泛型类,并在泛型类中定义数组,提供添加和显示数组中全部元素的 方法。根据题目要求,代码如下。class MyTest{private T[] item...

weixin_42298064的博客 276

C# 写的一个泛型类型方法示例

using System;using System.Collections.Generic;using System.Text;namespace Genericity{    class Program    {        //泛型类1:        public class GenericityHello        {            public void SayHell

张庆(网眼) 9494

php 泛型类,C#_深入解析C#中的泛型类型接口,泛型类 泛型类封装不是特定 - phpStudy...

深入解析C#中的泛型类型接口泛型类泛型类封装不是特定于具体数据型的操作。泛型类最常用于集合,如链接列表、哈希表、堆栈、队列、树等。像从集合中添加和移除项这样的操作都以大体上相同的方式执行,与所存储数据的型无关。对于大多数需要集合的方案,推荐的方法是使用 .NET Framework 库中所提供的。一般情况下,创建泛型类的过程为:从一个现有的具体开始,逐一将每个型更改为型参数,直...

weixin_39675215的博客 170

C#泛型类型方法总结

前言:本博文从C#型入手,依次介绍泛型类型方法,如果读者想对型有更多的了解,可访问本人另一篇博文:C#中List型用法,必知必会! 文章目录一、型是什么?二、泛型类的定义三、型方法定义 一、型是什么? 型可以理解为广型,或者不确定的型,也就是说允许我们编写一个可以与任何数据型同时运行,且不报错的方法或者型通过参数化型来实现在同一份代码上操作多种数据型。利用“参数化型”将型抽象化,从而实现灵活的复用。 二、泛型类的定义 定义一个泛型类就是指的是:定义一个,这个

路虽远,行则必至! 3669

Wrapture:让Python函数追踪与测试替换共用一条链路

在Python开发中,函数调用链的观测与依赖隔离是工程实践的核心难题。开发者通常依赖装饰器实现调用日志,或用unittest.mock替换外部依赖,但两者本质都在“包裹函数”——一个负责观察,一个负责篡改。然而,朴素装饰器难以应对签名失真、描述符协议、递归与并发开销;mock则常因路径错误或生命周期泄漏而污染测试。Wrapture作为一款专注函数追踪与测试替换的库,试图将观察与替换收敛为同一条可插拔链路:业务代码无需感知自身被记录或被替换,即可在开发调试、单元测试、线上诊断等场景间无缝切换。通过稳定的包裹层

weixin_33970449的博客 327

C# Dictionary 泛型类 记录

型的优点(C# 编程指南) 在公共语言运行库和 C# 语言的早期版本中,通用化是通过在型与通用基型 Object 之间进行强制转换来实现的,型提供了针对这种限制的解决方案。通过创建泛型类,您可以创建一个在编译时型安全的集合。使用非型集合的限制可以通过编写一小段程序来演示,该程序利用 .NET Framework 基库中的 ArrayList 集合。Arra

zhxhdean的专栏 2798

c# 泛型类

namespace console_泛型类 { class Program { public static void Main(string[] args) { //泛型类封装不特定于特定数据型的操作。 //第一次看到感觉很抽象,要理解这句话中的 封装 和 操作 两个关键词 ...

weixin_30715523的博客 86

泛型类 0104 c#

泛型类 0104 c# 定义 使用

pyhui的技术博客 223
上一篇: Java Io流学习总结
下一篇: Java运算符
伊依葶
博客等级 码龄7年 20粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值