解释泛型在 C# 中的工作原理

解释泛型在 c# 中的工作原理

泛型是在 C# 2.0 版本中添加的,是该语言中最重要的概念之一。它们使您能够编写在编译时类型安全的可重用、高性能代码。使用泛型,您可以在代码中使用某种类型,而无需事先了解该类型。

泛型在 .NET 中的许多地方使用,包括集合、委托和异步代码。使用泛型,您不需要事先知道集合的大小,并且可以将泛型与任何元素类型一起使用,甚至是特定于您的代码的自定义数据类型。 C# 提供对泛型类型(类、接口等)和泛型方法的支持。

在泛型中,您有类型参数和类型参数。这类似于具有参数的方法,您可以将参数传递给该方法。

泛型类型

声明泛型类型的语法由位于尖括号中的类型参数组成。类型的名称。例如,Locator 是下面示例中的泛型类。

public class Locator{}

要创建 Locator 的实例,请使用 new 关键字,后跟类的名称。但是,您可以指定要作为参数传递的实际类型,而不是 T。以下示例将字符串类型作为参数传递。

var stringLocator = new Locator();

您可以在类方法上使用类型参数 (T),如下例所示。

public class Locator{   public IList Items { get; set; }      public T Locate(int index){      return Items[index];   }}var stringLocator = new Locator();string item = stringLocator.Locate(2);

泛型的另一个好处是编辑器提供的 IntelliSense。当您在 Visual Studio 或 VS Code 中键入 stringLocator.Locate(4) 并将鼠标悬停在方法名称上时;它会显示它返回一个字符串而不是 T。如果您尝试将结果分配给字符串以外的任何类型,编译器将引发错误。例如,

// Error: Cannot implicitly convert type 'string' to 'int' [c-sharp]csharp(CS0029)int item = stringLocator.Locate(2);

从泛型基类型或泛型接口继承时,泛型类型可以使用类型形参作为类型实参。通用 LinkedList 类型实现通用 IEnumerable 接口以及其他接口。

public class LinkedList : IEnumerable

泛型方法

泛型方法只是声明类型参数的方法,您可以在方法内部使用该类型参数并将其用作参数和返回类型。在下面的示例中,Swap 是一个泛型方法,它采用两个 T 类型的参数并返回 T 的实例。

public class Swapper{   public T Swap(T first, T second){      T temp = first;      first = second;      second = temp;      return temp;   }}

与泛型类型一样,当您调用泛型方法时,它将返回一个强类型变量。

var swapper = new Swapper();int result = swapper.Swap(5, 3);

可以有多个通用参数。 System.Collections.Generic 命名空间中的 Dictionary 类有两个类型参数,即键和值。

public class Dictionary

最后,了解什么是通用的很重要。对于类型来说,除了枚举之外,一切都可以是泛型的。其中包括 –

类结构接口委托

对于类型成员,只有方法和嵌套类型可以是泛型的。以下成员不能是通用的 –

字段属性索引器构造函数 li>事件终结器

示例

 现场演示

using System;using System.Collections.Generic;class Program{   static void Main(){      var stringLocator = new Locator(){         Items = new string[] { "JavaScript", "CSharp", "Golang" }      };      string item = stringLocator.Locate(1);      Console.WriteLine(item); // CSharp      var swapper = new Swapper();      int a = 5, b = 3;      int result = swapper.Swap(ref a, ref b);      Console.WriteLine($"a = {a}, b = {b}");   }}public class Locator{   public IList Items { get; set; }   public T Locate(int index){      return Items[index];   }}public class Swapper{   public T Swap(ref T first, ref T second){      T temp = first;      first = second;      second = temp;      return temp;   }}

输出

CSharpa = 3, b = 5

以上就是解释泛型在 C# 中的工作原理的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1435011.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 10:31:22
下一篇 2025年12月8日 04:25:20

相关推荐

  • C#中快速将Decimal转换为其他基数

    要快速将十进制转换为其他基数,请使用堆栈。让我们看一个例子。 首先,我将变量“baseNum”设置为2 int baseNum = 2; 同样,如果你想要另一个基地,那么 – // base 8int baseNum = 8;// base 10int baseNum = 10; 获取到…

    2025年12月17日
    000
  • ASP .Net MVC C# 中的 ViewData 是什么?

    ViewData 是使用字符串作为键来存储和检索的对象的字典。它用于将数据从控制器传输到视图。由于 ViewData 是一个字典,所以它包含键值对,其中每个键必须是字符串。仅查看数据传输数据从控制器到视图,反之亦然。仅在当前请求期间有效。 在 viewdata 中存储数据 – ViewD…

    2025年12月17日
    000
  • 如何验证 C# 单元测试中抛出的异常?

    我们可以通过两种方法在单元测试中验证异常。 使用 Assert.ThrowsException使用 ExpectedException 属性。 示例 让我们考虑一个需要测试抛出异常的 StringAppend 方法。 using System;namespace DemoApplication { …

    2025年12月17日
    000
  • 如何在 C# 中运行多个异步任务并等待它们全部完成?

    Task.WaitAll 会阻塞当前线程,直到所有其他任务完成执行。 Task.WhenAll 方法用于创建一个当且仅当所有其他任务都完成时,该任务才会完成。在第一个示例中,我们可以看到,使用 Task.WhenAll 时,任务完成会在其他任务完成之前执行。这意味着 Task.WhenAll 不会阻…

    2025年12月17日
    000
  • C#中如何检查字符串数组中是否包含字符串数组中的特定工作?

    In C#, String.Contains() is a string method. This method is used to check whether the substring occurs within a given string or not. It returns the bo…

    2025年12月17日
    000
  • C# 程序读取字符串并计算所有数字的总和

    C# 是一种流行的面向对象的编程语言,用于开发 Windows 应用程序、Web 应用程序和游戏。在本文中,我们将讨论如何编写一个 C# 程序来读取一个字符串,并找出字符串中所有数字的总和。 第 1 步:读取输入字符串 该程序的第一步是读取用户输入的字符串。我们可以使用 Console.ReadLi…

    2025年12月17日
    000
  • C# 泛型与 C++ 模板

    C# 泛型和 C++ 模板提供对参数化类型的支持。以下是差异 – 灵活性 C++ 模板比 C# 泛型更灵活 显式专业化 不支持显式专业化by C# 类型参数 类型参数不能作为C#中泛型类型的基类 立即学习“C++免费学习笔记(深入)”; C#不允许类型参数有默认值 运行时 C++ 模板具…

    2025年12月17日
    000
  • C# 中的检查异常与非检查异常

    您可以在检查或未检查上下文中执行 C# 中的语句。 在检查中,算术溢出会引发异常,而在未检查上下文中,算术溢出将被忽略。 检查异常 使用checked关键字显式启用整型算术运算和转换的溢出检查。为此,只需设置checked关键字即可。 可以通过编译器选项、环境配置或使用checked关键字来启用溢出…

    2025年12月17日
    000
  • 如何在 C# 中使用委托调用数学运算?

    为了了解如何使用委托在C#中调用数学运算,让我们看一个例子,我们将在其中除以一个数字。 我们有一个类和一个函数: public class Demo { public static double DivideFunc(double value) { return value / 5; }} 现在,我…

    2025年12月17日
    000
  • 使用 C# 在一行中交换两个变量

    To swap two variables in a single line using the Bitwise XOR Operator. val1 = val1 ^ val2 ^ (val2 = val1); Above, we have set the values − int val1 = …

    2025年12月17日
    000
  • 如何将指针作为参数传递给 C# 中的方法?

    要将指针作为参数传递给方法,请参阅以下步骤 – 首先,使用 unsafe 修饰符创建一个函数交换。 public unsafe void swap(int* p, int *q) { int temp = *p; *p = *q; *q = temp;} 现在在 static void …

    2025年12月17日
    000
  • C# 和 Java 之间的主要区别

    C# 和 Java 是广泛使用的面向对象编程语言。以下是C#和Java之间的区别: 运算符重载 C#支持运算符重载,但Java没有运算符重载的概念。 委托 C# 有委托,而 Java 不支持该概念。 运行程序 Java 有 JVM(Java 虚拟机),而 C# 有 CLR(公共语言) 立即学习“Ja…

    2025年12月17日
    000
  • C# 中的对象和类有什么区别?

    与 Java 一样,C# 也有对象和类。对象是现实世界的实体和类的实例。使用对象访问类的成员。 要访问类成员,需要在对象名称后面使用点 (.) 运算符。点运算符将对象的名称与成员的名称链接起来,例如, Box Box1 = new Box(); 在上面你可以看到 Box1 是我们的对象。我们将使用它…

    2025年12月17日
    000
  • C# 中的 SortedSet 类

    The SortedSet class in C# represents a collection of objects that is maintained in sorted order. Following are the properties of the SortedSet class −…

    2025年12月17日
    000
  • C# 程序找出 Sin(x) 的值

    简介 在本文中,我们将了解 C# 程序来找出 Sin(x) 的值。正弦是 Sin(x) 的另一个名称。这是一个三角角公式。角度的正弦是直角梯形中斜边长度与垂线长度的比例。强大的计算机语言 C# 可用于解决具有挑战性的数学问题。找出 sin(x) 的值(其中 x 是任意以弧度表示的角度)就是这些问题之…

    2025年12月17日
    000
  • 如何在 C# 中比较两个元组?

    元组比较是在 C# 7.3 之后出现的。 使用 C# 中的相等运算符轻松比较两个元组。 假设我们有两个元组 – var one = (x: 1, y: 2);var two = (p: 1, 2: 3, r: 3, s:4); 要比较它们,只需使用 == 运算符 – if (…

    2025年12月17日
    000
  • C# 相当于 Java 函数式接口

    Java 的函数式接口在 C# 中相当于 Delegate。 让我们看看 Java 中函数式接口的实现 – 示例 @FunctionalInterfacepublic interface MyInterface { void invoke();}public class Demo { v…

    2025年12月17日
    000
  • C# 中的反射

    反射对象用于在运行时获取类型信息。允许访问正在运行的程序的元数据的类位于 System.Reflection 命名空间中。 以下是 Reflections 的应用 – 它允许在运行时查看属性信息。 它允许检查程序集中的各种类型并实例化这些类型。 它允许后期绑定到方法和属性 它允许在运行时…

    2025年12月17日
    000
  • C# 中的泛型委托是什么?

    使用通用委托,您不需要定义委托语句。它们在系统命名空间中定义。 您可以使用类型参数定义通用委托。例如 – delegate T myDelegete(T n); 示例 以下示例展示了如何在 C# 中创建通用委托 – using System;using System.Coll…

    2025年12月17日
    000
  • C#中有哪些类?

    定义类时,您就定义了数据类型的蓝图。对象是类的实例。构成类的方法和变量称为类的成员。 类定义以关键字 class 开头,后跟类名;以及由一对花括号括起来的类主体。以下是类定义的一般形式 – class class_name { // member variables variable1;…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信