千家信息网

如何理解.NET基础的自定义泛型

发表于:2024-12-12 作者:千家信息网编辑
千家信息网最后更新 2024年12月12日,这篇文章主要介绍"如何理解.NET基础的自定义泛型",在日常操作中,相信很多人在如何理解.NET基础的自定义泛型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何理解.
千家信息网最后更新 2024年12月12日如何理解.NET基础的自定义泛型

这篇文章主要介绍"如何理解.NET基础的自定义泛型",在日常操作中,相信很多人在如何理解.NET基础的自定义泛型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何理解.NET基础的自定义泛型"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

具体分析如下:

在.NET中泛型使用非常频繁,在控制台应用程序中,默认的引入了System.Collection.Generics名称空间,其中就提供了我们经常使用的泛型:List和Dictionary,相信用过它们的都知道它们的强大。还有一种我们经常使用的简单的泛型:System.Nullable,即可空类型。我们可以:

System.Nullable nullableInt;
声明一个可空的int类型,由于C#语法对这个做了简化通常我们都不这样写,而是这样写:

int? nullableInt
下面重点介绍一下如何自定义泛型。

定义泛型类

创建泛型类是需要在类定义中用尖括号语法:

复制代码 代码如下:

class MyGenericClass
{
...
}


T可以是任意的标示符,只要遵守命名规则即可。

可以把类型用在类成员的返回类型,方法参数类型等,例如:

复制代码 代码如下:

class MyGenericClass
{
private T1 t1Object;

public MyGenericClass(T1 item)
{
t1Object = item;
}

public T1 T1Object
{
get
{
return t1Object;
}
}
}

注意如果不能假定提供了什么类型。下面的代码不能执行:

复制代码 代码如下:

class MyGenericClass
{
private T1 t1Object;

public MyGenericClass()
{
t1Object = new T1();
}
}

因为我们不知道T1是否有公有的默认构造函数。

default关键字

如果我们定义了一个泛型的字段,我们想在构造函数中初始化它,但是我们不知道它的引用类型还是值类型,那么default就派上用处了:

复制代码 代码如下:

public MyGenericClass()
{
t1Object = default(T1);
}


如果是值类型就赋值0,引用类型就赋值null。

约束类型

在定义泛型的时候我们可以对类型进行约束,通过where关键字实现:

复制代码 代码如下:

class MyGenericClass where T : constraint1,constraint
{
...
}


constraint定义了约束,多个约束用逗号隔开,如果有多个类型:

复制代码 代码如下:

class MyGenericClass where T1 : constraint1 where T2 : constraint
{
...
}


下面给出一些可用的约束

约束 说明

where T:struct 使用结构约束,类型T必须是值类型

where T:calss 类约束指定,类型T必须是引用类型

where T:interface 指定类型T必须实现是接口或者实现了接口

where T:base-class 指定类型T必须是基类或者派生于基类

where T:new() 指定类型T必须有一个默认构造函数



下面结合以上知识给个实例:(PS不要看到代码多 其实很简单的 耐心看下去)

先定义四个类Animal、Cow 、Chicken和SuperCow

复制代码 代码如下:

#region Animal 虚基类 有一个name属性 Feed方法和一个虚方法MakeANoise
//虚基类 有一个name属性 Feed方法和一个虚方法MakeANoise
public abstract class Animal
{
protected string name;

public string Name
{
get
{
return name;
}
set
{
name = value;
}
}

public Animal()
{
name = "The animal with no name";
}

public Animal(string newName)
{
name = newName;
}

public void Feed()
{
Console.WriteLine("{0} has been fed.", name);
}

public abstract void MakeANoise();
}
#endregion

//Cow Animal的子类,实现虚方法
public class Cow:Animal
{
public Cow(string name) :
base(name)
{
}
public override void MakeANoise()
{
Console.WriteLine("{0} says 'moo!'", name);
}
}

//Chicken类,Animal子类
public class Chicken:Animal
{
public Chicken(string name)
: base(name)
{ }
public override void MakeANoise()
{
Console.WriteLine("{0} says 'cluck'", name);
}
}

//Cow的子类,有一个自己的方法Fly
class SuperCow : Cow
{
public SuperCow(string name) : base(name)
{
}

public void Fly()
{
Console.WriteLine("{0} is flying!", name);
}

public override void MakeANoise()
{
Console.WriteLine("{0} says 'I am supercow!'", name);
}
}

类准备好了之后,我们可以开始定义我们的泛型了:

复制代码 代码如下:

//继承了迭代器接口,这样方便使用Foreach 约束它的类型为Animal及其子类
public class Farm:IEnumerable where T : Animal
{
private List animals = new List();

public List Animals
{
get
{
return animals;
}
}
//迭代器
public IEnumerator GetEnumerator()
{
return animals.GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
return animals.GetEnumerator();
}

//执行所有animal的MakeANoise()
public void MakeNoises()
{
foreach (T animal in animals)
{
animal.MakeANoise();
}
}
//执行所有animal的Feed()
public void FeedTheAnimals()
{
foreach (T animal in animals)
{
animal.Feed();
}
}
//获得animals中的cow
public Farm GetCows()
{
Farm cowFarm = new Farm();
foreach (T animal in animals)
{
if (animal is Cow)
{
cowFarm.Animals.Add(animal as Cow);
}
}
return cowFarm;
}
}

泛型定义好了,我们用写代码来调用它:

复制代码 代码如下:

class Program
{
static void Main(string[] args)
{
Farm farm = new Farm();
farm.Animals.Add(new Cow("Jack"));
farm.Animals.Add(new Chicken("Vera"));
farm.Animals.Add(new Chicken("Sally"));
farm.Animals.Add(new SuperCow("Kevin"));
farm.MakeNoises();

Farm dairyFarm = farm.GetCows();
dairyFarm.FeedTheAnimals();

foreach (Cow cow in dairyFarm)
{
if (cow is SuperCow)
{
(cow as SuperCow).Fly();
}
}
Console.ReadKey();
}
}

到此,关于"如何理解.NET基础的自定义泛型"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

代码 类型 方法 基础 学习 函数 子类 接口 关键 关键字 多个 属性 更多 知识 语法 帮助 迭代 实用 强大 频繁 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 东软软件开发工程师工资 美国互联网高科技类公司排名 spring数据库连接超时设置 冬季网络安全宣传活动礼品 土壤数据库软件 csgo成都服务器新疆 网络安全学院信大成绩多少优秀 oracle数据库映射端口 研究服务器安全的背景及意义 软件开发人员外包项目投标 儿童网络安全人内容包括 如何查看服务器上的源代码 金华哪个软件开发公司好 存放在服务器的各部门文件要求 河南千互云网络技术有限公司 服务器设置没有文件管理 全国网络安全员竞赛答题 虎眼科技软件开发制作 闪网络安全手抄报 南京莱斯软件开发能力 公众号软件开发多少钱 北京消费统计年鉴数据库 网络安全工程师面试的基本常识 以太网口链接服务器 融合互联网科技赋能 广州商城软件开发外包 河南省联通服务器云主机 怎么配置服务器管理器 人工智能关于网络安全的ppt 服务器管理网口接线
0