C# 泛型和泛型约束

C# 泛型和泛型约束

使用 C# 创建泛型类,泛型类是使用 C# 开发 OOP 应用程序时必须具备的结构。通过创建单个泛型类,您将能够 处理一个类中可能有 10 个不同类中的重复代码 .

如果我们试图以最简单的方式解释泛型类,我想举一个现有泛型结构的例子。您可以指定将这种类型的数据添加到列表中,通过将所需类型的对象替换为 List(一种常用的列表类型)而不是 T,您将在一定程度上摆脱可能的数据冲突。让我们举一个 List 类型的例子,在这个例子中,我们将创建一个存储 3 个人姓名的列表。

示例 1:

列表 名称=新列表();

names.Add(“奥斯曼”);

names.Add(“阿里”);

names.Add(“Yardim”);

不要忘记添加 System.Collections.Generic 命名空间才能使用 List 类。由于我们在上面的代码中将字符串类型赋予了 List 泛型类,因此我们可以在 Add 方法中将字符串作为参数传递,但不能传递其他类型的值。

现在让我们创建自己的泛型类并尝试了解它是如何完成的。让我们尝试基于 Result(Web 程序员最常用的术语之一)创建一个场景。现在,由于您在网络上的每个页面上发送的请求,都会返回不同的数据集。 无需为这些不同的数据集创建不同的类,我们可以使用通用结构设置相同的结果类型,但只能通过将参数传递给通用类。 您可以在下面的代码中更清楚地理解我的意思。

示例 2:

班级成绩

{

公共字符串消息 { 获取;放; }

公共字符串成功{获取;放; }

公共 T 数据 { 获取;放; }

}

从上面的代码中可以看到,Result 类中的 Success 和 Message 属性是固定类型,但 Data 属性是作为作为参数传递给类的类型返回的。在此示例中,让我们为 Result 属性赋予一个 int 类型的值。

var res = 新结果 ();

在这种情况下 资源数据 您只能将 int 类型的数据分配给属性。

如果您希望将类型作为参数传递给您创建的泛型类,您可以使用 where 关键字设置它,如果我们继续前面示例中的 Result 类,我们可以指定如下,您只能设置数据类类型的参数作为 Result 类的参数,因此您将无法将类类型(引用类型)以外的任何类型作为参数传递。

示例 3:

使用系统;

使用 System.Collections.Generic;

命名空间 ConsoleApplication1

{

课堂节目

{

静态无效主要(字符串 [] 参数)

{

var res = 新结果 ();

}

}

类人

{

公共字符串名称 { 获取;放; }

公共字符串姓{得到;放; }

}

班级成绩 其中 T :类

{

公共字符串消息 { 获取;放; }

公共字符串成功{获取;放; }

公共 T 数据 { 获取;放; }

}

}

通过在示例 2 的代码中添加 where 关键字,我们指定只能将类数据作为参数传递,并且我们将名为 Person 的类作为参数传递。

当你创建一个泛型类时,你可以给你想要的名字作为参数名。 T 在单参数泛型类中用作标准,但在将传递多个参数的情况下,指定传递的参数是很重要的,以便使用您创建的类的人知道它作为参数传递的目的是什么。在我们当前的示例中,让我们继续 Result 类来举例说明,就像上面的最后两个示例一样。在这里,让我们确保将 3 个属性创建为带有参数的泛型。

示例 4:

班级成绩 <TData, TSuccess, TMessage>

其中 TData :类

其中 TSuccess : 结构

其中 TMessage :类

{

公共 TMessage 消息 { 获取;放; }

公共 TSuccess 成功 { 获取;放; }

公共 TData 数据 { 获取;放; }

}

通用约束

其中 T : 结构 -> 类型参数必须是不可为空的值类型。

其中 T :类 -> 类型参数必须是引用类型。

其中T:新() -> 类型参数必须有一个公共的无参数构造函数。

其中 T : [基类名称] -> 类型参数必须是或派生自指定的基类。

其中 T : [接口名称] -> 类型参数必须是或实现指定的接口。可以指定多个接口约束。

注意:如果你还想用 nullables 覆盖你的代码,只需在它们的末尾添加 ?像“类 ? 或 [基类名称] ? ”。

资料来源:

[

使用 C# 创建泛型类和设置规则 - Murat ÖNER

用 C# 创建泛型类,当你用 C# 开发 OOP 应用程序时,泛型类是必须的……

www.muratoner.net

](https://www.muratoner.net/csharp/csharp-ile-generic-siniflar-olusturma-ve-kurallar-belirleme)

[

类型参数的约束 - C# 编程指南

约束通知编译器类型参数必须具有的功能。没有任何限制,类型…

学习.microsoft.com

](https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/38186/07172012

posted @ 2022-09-20 12:08  哈哈哈来了啊啊啊  阅读(58)  评论(0编辑  收藏  举报