使用 C# 创建泛型类,泛型类是使用 C# 开发 OOP 应用程序时必须具备的结构。 通过创建单个泛型类,您将能够处理来自单个类的可能 10 个不同类中的重复代码。
如果我们试图以最简单的方式解释泛型类,我想举一个现有泛型结构的例子。 您可以指定将这种类型的数据添加到列表中,通过将所需类型的对象替换为 List(一种常用的列表类型)而不是 T,您将在一定程度上摆脱可能的数据冲突。 让我们举一个 List 类型的例子,在这个例子中,我们将创建一个存储 3 个人姓名的列表。
示例 1:
List<string> names = new List<string>();
names.Add(“Osman”);
names.Add(“Ali”);
names.Add(“Yardim”);
不要忘记添加 System.Collections.Generic 命名空间才能使用 List 类。 由于我们在上面的代码中将字符串类型赋予了 List 泛型类,因此我们可以在 Add 方法中将字符串作为参数传递,但不能传递其他类型的值。
现在让我们创建自己的泛型类并尝试了解它是如何完成的。 让我们尝试基于 Result(Web 程序员最常用的术语之一)创建一个场景。 现在,由于您在网络上的每个页面上发送的请求,都会返回不同的数据集。 我们可以使用通用结构设置相同的结果类型,而不是为这些不同的数据集创建不同的类,但只能通过将参数传递给通用类。 您可以在下面的代码中更清楚地理解我的意思。
示例 2:
class Result<T>
{
public string Message { get; set; }
public string Success { get; set; }
public T Data { get; set; }
}
从上面的代码中可以看到,Result 类中的 Success 和 Message 属性是固定类型,但 Data 属性是作为作为参数传递给类的类型返回的。 在这个例子中,让我们给 Result 属性一个 int 类型的值。
var res = new Result<int>();
在这种情况下,您只能将 int 类型的数据分配给 theres.Data 属性。
如果您希望将类型作为参数传递给您创建的泛型类,您可以使用 where 关键字设置它,如果我们继续前面示例中的 Result 类,我们可以指定如下,您只能设置数据 类类型的参数作为 Result 类的参数,因此您将无法将类类型(引用类型)以外的任何类型作为参数传递。
示例 3:
using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var res = new Result<Person>();
}
class Person
{
public string Name { get; set; }
public string Surname{ get; set;
}
class Result<T> where T : class
{
public string Message { get; set; }
public string Success{ get; set; }
public T Data { get; set; }
}
}
}
当你创建一个泛型类时,你可以给你想要的名字作为参数名。 T 在单参数泛型类中用作标准,但在将传递多个参数的情况下,指定传递的参数是很重要的,以便使用您创建的类的人知道 它作为参数传递的目的是什么。 在我们当前的示例中,让我们继续 Result 类来举例说明,就像上面的最后两个示例一样。 在这里,让我们确保将 3 个属性创建为带有参数的泛型。
示例 4:
class Result<TData, TSuccess, TMessage>
where TData : class
where TSuccess : struct
where TMessage : class
{
public TMessage Message { get; set; }
public TSuccess Success { get; set; }
public TData Data { get; set; }
}
通用约束
其中 T : struct -> 类型参数必须是不可为空的值类型。
其中 T : class -> 类型参数必须是引用类型。
其中 T : new() -> 类型参数必须有一个公共的无参数构造函数。
其中 T : [基类名称] -> 类型参数必须是指定的基类或派生自指定的基类。
其中 T : [接口名称] -> 类型参数必须是或实现指定的接口。可以指定多个接口约束。
注意:如果你还想用 nullables 覆盖你的代码,只需在它们的末尾添加 ?比如“上课?还是[基类名称]?”。
奖励:泛型中的协变和逆变
协变和逆变是指使用比最初指定的更多派生类型(更具体)或更少派生类型(更具体)的能力的术语。泛型类型参数支持协变和逆变,以便在分配和使用泛型类型时提供更大的灵活性。
当您提到类型系统时,协变、逆变和不变性具有以下定义。这些示例假定一个名为 Base 的基类和一个名为 Derived 的派生类。
协方差
- 使您能够使用比最初指定更多的派生类型。
- 您可以将 IEnumerable<Derived> 的实例分配给 IEnumerable<Base> 类型的变量。
逆变
- 使您能够使用比最初指定的更通用(较少派生)的类型。
- 您可以将 Action<Base> 的实例分配给 Action<Derived> 类型的变量。
不变性
- 意味着您只能使用最初指定的类型。不变的泛型类型参数既不是协变的也不是逆变的。
- 您不能将 List<Base> 的实例分配给 List<Derived> 类型的变量,反之亦然。
关注七爪网,获取更多APP/小程序/网站源码资源!
本文暂时没有评论,来添加一个吧(●'◡'●)