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
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明
本文链接:https://www.qanswer.top/38186/07172012
标签:示例,C#,约束,参数传递,类型,参数,泛型 From: https://www.cnblogs.com/amboke/p/16710605.html