iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >C#类型参数约束的应用方法有哪些
  • 278
分享到

C#类型参数约束的应用方法有哪些

2023-06-17 23:06:16 278人浏览 泡泡鱼
摘要

本篇内容主要讲解“C#类型参数约束的应用方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#类型参数约束的应用方法有哪些”吧!C# 类型参数约束使用的原因:如果要检查泛型列表中的某个项以

本篇内容主要讲解“C#类型参数约束的应用方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#类型参数约束的应用方法有哪些”吧!

C# 类型参数约束使用的原因:如果要检查泛型列表中的某个项以确定它是否有效,或者将它与其他某个项进行比较,则编译器必须在一定程度上保证它需要调用的运算符或方法将受到客户端代码可能指定的任何类型参数的支持。这种保证是通过对泛型类定义应用一个或多个约束获得的。例如,基类约束告诉编译器:仅此类型的对象或从此类型派生的对象才可用作类型参数。一旦编译器有了这个保证,它就能够允许在泛型类中调用该类型的方法。约束是使用上下文关键字 where 应用的。下面的代码示例演示可通过应用基类约束添加到 GenericList类的功能。

在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。这些限制称为约束。约束是使用 where 上下文关键字指定的。下面列出了六种类型的约束:

◆T:结构

类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。

◆T:类

类型参数必须是引用类型,包括任何类、接口、委托或数组类型。

◆T:new()

类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须***指定。

◆T:<基类名>

类型参数必须是指定的基类或派生自指定的基类。

◆T:<接口名称>

类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。

◆T:U

为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。

C# 类型参数约束代码

public class Employee  {      private string name;      private int id;       public Employee(string s, int i)      {          name = s;          id = i;      }       public string Name      {          get { return name; }          set { name = value; }      }       public int ID      {          get { return id; }          set { id = value; }      }  }   public class GenericList where T : Employee  {      private class node      {          private Node next;          private T data;           public Node(T t)          {              next = null;              data = t;          }           public Node Next          {              get { return next; }              set { next = value; }          }           public T Data          {              get { return data; }              set { data = value; }          }      }       private Node head;       public GenericList() //constructor      {          head = null;      }       public void AddHead(T t)      {          Node n = new Node(t);          n.Next = head;          head = n;      }       public IEnumerator GetEnumerator()      {          Node current = head;           while (current != null)          {              yield return current.Data;              current = current.Next;          }      }       public T FindFirstOccurrence(string s)      {          Node current = head;          T t = null;           while (current != null)          {              //The constraint enables access to the Name property.              if (current.Data.Name == s)              {                  t = current.Data;                  break;              }              else             {                  current = current.Next;              }          }          return t;      }  }

约束使得泛型类能够使用 Employee.Name 属性,因为类型为 T 的所有项都保证是 Employee 对象或从 Employee 继承的对象。

可以对同一类型参数应用多个约束,并且约束自身可以是泛型类型,如下所示:

C# 类型参数约束代码

class EmployeeList where T : Employee, IEmployee, System.IComparable, new()  {      // ...  }

通过约束类型参数,可以增加约束类型及其继承层次结构中的所有类型所支持的允许操作和方法调用的数量。因此,在设计泛型类或方法时,如果要对泛型成员执行除简单赋值之外的任何操作或调用 System.Object 不支持的任何方法,您将需要对该类型参数应用约束。

在应用 where T : class 约束时,建议不要对类型参数使用 == 和 != 运算符,因为这些运算符仅测试引用同一性而不测试值相等性。即使在用作参数的类型中重载这些运算符也是如此。下面的代码说明了这一点;即使 String 类重载 == 运算符,输出也为 false。

C# 类型参数约束代码

public static void OpTest(T s, T t) where T : class {      System.Console.WriteLine(s == t);  }  static void Main()  {      string s1 = "foo";      System.Text.StringBuilder sb = new System.Text.StringBuilder("foo");      string s2 = sb.ToString();      OpTest<string>(s1, s2);  }

这种情况的原因在于,编译器在编译时仅知道 T 是引用类型,因此必须使用对所有引用类型都有效的默认运算符。如果需要测试值相等性,建议的方法是同时应用 where T : IComparable约束,并在将用于构造泛型类的任何类中实现该接口。

C# 未绑定的类型参数

没有约束的类型参数(如公共类 SampleClass{} 中的 T)称为未绑定的类型参数。未绑定的类型参数具有以下规则:

不能使用 != 和 == 运算符,因为无法保证具体类型参数能支持这些运算符。

可以在它们与 System.Object 之间来回转换,或将它们显式转换为任何接口类型。

可以将它们与 null 进行比较。将未绑定的参数与 null 进行比较时,如果类型参数为值类型,则该比较将始终返回 false。

C# 裸类型约束

用作约束的泛型类型参数称为裸类型约束。当具有自己的类型参数的成员函数需要将该参数约束为包含类型的类型参数时,裸类型约束很有用,如下面的示例所示:

C# 类型参数约束代码

class List {      void Add(List items) where U : T {}  }

在上面的示例中,T 在 Add 方法的上下文中是一个裸类型约束,而在 List 类的上下文中是一个未绑定的类型参数。

裸类型约束还可以在泛型类定义中使用。注意,还必须已经和其他任何类型参数一起在尖括号中声明了裸类型约束:

C# 类型参数约束代码

//naked type constraint  public class SampleClass where T : V { }

泛型类的裸类型约束的作用非常有限,因为编译器除了假设某个裸类型约束派生自 System.Object 以外,不会做其他任何假设。在希望强制两个类型参数之间的继承关系的情况下,可对泛型类使用裸类型约束。

到此,相信大家对“C#类型参数约束的应用方法有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: C#类型参数约束的应用方法有哪些

本文链接: https://www.lsjlt.com/news/294305.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#类型参数约束的应用方法有哪些
    本篇内容主要讲解“C#类型参数约束的应用方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#类型参数约束的应用方法有哪些”吧!C# 类型参数约束使用的原因:如果要检查泛型列表中的某个项以...
    99+
    2023-06-17
  • 有没有办法约束(通用)类型参数?
    php小编柚子探讨了一个常见问题:有没有办法约束(通用)类型参数?在PHP中,我们经常需要对函数或方法的参数进行类型约束,以确保传入的参数满足特定的类型要求。然而,对于通用类型参数,如...
    99+
    2024-02-09
  • oracle的约束类型有哪些
    在Oracle数据库中,常见的约束类型包括: 主键约束(Primary Key Constraint):用于唯一标识表中的每一行...
    99+
    2024-03-04
    oracle
  • PHP方法参数类型约束是什么
    这篇文章主要介绍了PHP方法参数类型约束是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。关于PHP的方法参数类型约束在之前的文章PHP方法参数的那点事儿中,我们讲过关于P...
    99+
    2023-06-15
  • PostgreSQL中有哪些约束类型
    这期内容当中小编将会给大家带来有关PostgreSQL中有哪些约束类型,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、检查约束:保证列中的值符合指定的条件。设置某个字段里的数值必须满足约束表达式的条件。...
    99+
    2023-06-14
  • MySQL数据库约束类型有哪些
    这篇文章主要介绍了MySQL数据库约束类型有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL数据库约束类型有哪些文章都会有所收获,下面我们一起来看看吧。数据库中的约束,顾名思义即是对插入数据库中的数...
    99+
    2023-06-27
  • C#参数类型有哪些
    本篇内容主要讲解“C#参数类型有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#参数类型有哪些”吧!C#参数类型◆值参数:不含任何修饰符。方法中的形参是实参的一份拷贝,形参的改变不会影响到...
    99+
    2023-06-17
  • SQLite支持哪些类型的约束
    SQLite支持以下类型的约束: PRIMARY KEY约束:用于定义列作为表的主键。 UNIQUE约束:用于确保列中的所有...
    99+
    2024-04-09
    SQLite
  • 具有方法作为泛型函数的类型约束的接口
    问题内容 我试图在编写断言函数来测试事物时使用泛型,但是它给了我一个错误 some does not implement testutilt (wrong type for metho...
    99+
    2024-02-06
  • 进一步约束Golang中的类型参数(使用Contains方法实现泛型List)
    问题内容 假设我想编写一个通用的 list 类型,其中包含一些有用的方法,例如: type list[t any] []t func (l *list[t]) len() int f...
    99+
    2024-02-06
  • 为什么 Go 函数不能返回带有约束类型参数的类型?
    为什么Go函数不能返回带有约束类型参数的类型?这是一个经常引发疑惑的问题。在Go语言中,函数的返回类型不能是带有约束类型参数的类型,这主要是由于Go语言对泛型的支持较为有限所导致的。在...
    99+
    2024-02-09
    go语言
  • Go:如何指定类型约束,其中方法的参数类型与接收者的类型相同
    在Go语言中,我们可以使用类型约束来指定函数或方法的参数类型。当我们希望方法的参数类型与接收者的类型相同时,该如何指定呢?首先,需要明确的是,Go语言中并没有直接支持参数类型与接收者类...
    99+
    2024-02-09
    go语言
  • Oracle支持哪些不同类型的约束
    在Oracle数据库中,可以使用以下不同类型的约束来确保数据的完整性和一致性: 主键约束(Primary Key Constrai...
    99+
    2024-04-09
    Oracle
  • 将具有精确约束的类型参数传递给具有该参数的函数?
    问题内容 我开始使用 go 泛型,但很难理解为什么这段代码无法编译: func f(string) {} func xyz[T string](p T) { f(p) // ...
    99+
    2024-02-06
  • javascript中有哪些参数类型转换的方法
    javascript中有哪些参数类型转换的方法?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点击,给用户提供...
    99+
    2023-06-14
  • python参数类型有哪些
    python中参数的类型:1.必选参数;2.默认参数;3.可变参数;4.关键字参数;python中参数的类型有以下几种必选参数python中必选参数是指定义必选参数后,每次调用都需要对参数进行赋值,否则将报错。默认参数python中默认参数...
    99+
    2024-04-02
  • Linq参数类型有哪些
    这篇文章将为大家详细讲解有关Linq参数类型有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。反射问题:远离类型安全错误至少就我自己而言,使用C#这种类型安全语言时,每当按下Ctrl+Sh...
    99+
    2023-06-17
  • C#的类型转换方法有哪些
    这篇“C#的类型转换方法有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#的类型转换方法有哪些”文章吧。C# 类型转换...
    99+
    2023-06-17
  • Python中有哪些参数类型
    本篇文章为大家展示了Python中有哪些参数类型,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前端开发,众多大型网站均...
    99+
    2023-06-14
  • PHP 函数参数类型有哪些?
    php 函数参数类型包括标量类型(整数、浮点数、字符串、布尔值、空值)、复合类型(数组、对象)和特殊类型(回调函数、可变参数)。函数可自动转换不同类型参数,但也可通过类型声明强制特定类型...
    99+
    2024-04-10
    php 函数参数 隐式转换
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作