我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#泛型约束之派生约束怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#泛型约束之派生约束怎么用

这篇文章主要介绍C#泛型约束之派生约束怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

C# 泛型约束中的派生约束使用 C# 泛型,编译器会将一般代码编译为 IL,而不管客户端将使用什么样的类型实参。因此,一般代码可以尝试使用与客户端使用的特定类型实参不兼容的一般类型参数的方法、属性或成员。这是不可接受的,因为它相当于缺少类型安全。在 C# 中,您需要通知编译器客户端指定的类型必须遵守哪些约束,以便使它们能够取代一般类型参数而得到使用。存在三个类型的约束。派生约束指示编译器一般类型参数派生自诸如接口或特定基类之类的基类型。默认构造函数约束指示编译器一般类型参数公开了默认的公共构造函数(不带任何参数的公共构造函数)。引用/值类型约束将一般类型参数约束为引用类型或值类型。一般类型可以利用多个约束,您甚至可以在使用一般类型参数时使 IntelliSense 反射这些约束,例如,建议基类型中的方法或成员。

C# 泛型约束中派生约束实例演示及使用方法:

在 C# 2.0 中,可以使用 where 保留关键字来定义约束。在一般类型参数中使用 where 关键字,后面跟一个派生冒号,以指示编译器该一般类型参数实现了特定接口。例如,以下为实现 LinkedList 的 Find() 方法所必需的派生约束:

public class LinkedList where K : IComparable  {     T Find(K key)     {        Node current = m_Head;        while(current.NextNode != null)        {           if(current.Key.CompareTo(key) == 0)                            break;           else                                  current = current.NextNode;        }        return current.Item;      }     //Rest of the implementation   }

您还将在您约束的接口的方法上获得 IntelliSense 支持。

当客户端声明一个 LinkedList 类型的变量,以便为列表的键提供类型实参时,客户端编译器将坚持要求键类型派生自 IComparable,否则,将拒绝生成客户端代码。

请注意,即使该约束允许您使用 IComparable,它也不会在所使用的键是值类型(例如,整型)时,消除装箱所带来的性能损失。为了克服该问题,System.Collections.Generic 命名空间定义了一般接口 IComparable:

public interface IComparable   {     int CompareTo(T other);     bool Equals(T other);  }

您可以约束键类型参数以支持 IComparable,并且使用键的类型作为类型参数;这样,您不仅获得了类型安全,而且消除了在值类型用作键时的装箱操作:

public class LinkedList where K : IComparable  {...}

实际上,所有支持 .NET 1.1 中的 IComparable 的类型都支持 .NET 2.0 中的 IComparable。这使得可以使用常见类型(例如,int、string、GUID、DateTime 等等)的键。

在 C# 2.0 中,所有约束都必须出现在一般类的实际派生列表之后。例如,如果 LinkedList 派生自 IEnumerable 接口(以获得迭代器支持),则需要将 where 关键字放在紧跟它后面的位置:

public class LinkedList : IEnumerable where K : IComparable  {...}

通常,只须在需要的级别定义约束。在链表示例中,在节点级别定义 IComparable 派生约束是没有意义的,因为节点本身不会比较键。如果您这样做,则您还必须将该约束放在 LinkedList 级别,即使该列表不比较键。这是因为该列表包含一个节点作为成员变量,从而导致编译器坚持要求:在列表级别定义的键类型必须遵守该节点在一般键类型上放置的约束。

换句话说,如果您按如下方式定义该节点:

class Node where K : IComparable  {...}

则您必须在列表级别重复该约束,即使您不提供 Find() 方法或其他任何与此有关的方法:

public class LinkedList where KeyType : IComparable  {     Node﹤KeyType,DataType m_H﹥ead;  }

您可以在同一个一般类型参数上约束多个接口(彼此用逗号分隔)。例如:

public class LinkedList where K : IComparable,IConvertible  {...}

您可以为您的类使用的每个一般类型参数提供约束,例如:

public class LinkedList where K : IComparable         where T : ICloneable   {...}

您可以具有一个基类约束,这意味着规定一般类型参数派生自特定的基类:

public class MyBaseClass  {...}  public class LinkedList where K : MyBaseClass  {...}

但是,在一个约束中最多只能使用一个基类,这是因为 C# 不支持实现的多重继承。显然,您约束的基类不能是密封类或静态类,并且由编译器实施这一限制。此外,您不能将 System.Delegate 或 System.Array 约束为基类。

您可以同时约束一个基类以及一个或多个接口,但是该基类必须首先出现在派生约束列表中:

public class LinkedList where K : MyBaseClass, IComparable  {...}

C# 确实允许您将另一个一般类型参数指定为约束:

public class MyClass where T : U   {...}

在处理派生约束时,您可以通过使用基类型本身来满足该约束,而不必非要使用它的严格子类。例如:

public interface IMyInterface  {...}  public class MyClass where T : IMyInterface  {...}  MyClass obj = new MyClass();

或者,您甚至可以:

public class MyOtherClass  {...}   public class MyClass where T : MyOtherClass   {...}   MyClass obj = new MyClass();

C# 泛型约束中派生约束需要注意的:

在提供派生约束时,您约束的基类型(接口或基类)必须与您定义的一般类型参数具有一致的可见性。例如,以下约束是有效的,因为内部类型可以使用公共类型:

public class MyBaseClass  {}  internal class MySubClass where T : MyBaseClass  {}

但是,如果这两个类的可见性被颠倒,例如:

internal class MyBaseClass  {}  public class MySubClass where T : MyBaseClass  {}

则编译器会发出错误,因为程序集外部的任何客户端都无法使用一般类型 MySubClass,从而使得 MySubClass 实际上成为内部类型而不是公共类型。外部客户端无法使用 MySubClass 的原因是,要声明 MySubClass 类型的变量,它们需要使用派生自内部类型 MyBaseClass 的类型。

以上是“C#泛型约束之派生约束怎么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#泛型约束之派生约束怎么用

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

下载Word文档

猜你喜欢

C#泛型约束之派生约束怎么用

这篇文章主要介绍C#泛型约束之派生约束怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!C# 泛型约束中的派生约束使用 C# 泛型,编译器会将一般代码编译为 IL,而不管客户端将使用什么样的类型实参。因此,一般代码
2023-06-17

C#泛型约束中的引用详解

本篇内容介绍了“C#泛型约束中的引用详解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C# 泛型约束中的引用/值类型约束使用 C# 泛型,编
2023-06-17

C#泛型的一般约束是什么

本篇内容主要讲解“C#泛型的一般约束是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#泛型的一般约束是什么”吧!C# 泛型约束中的一般约束使用 C# 泛型,编译器会将一般代码编译为 IL,
2023-06-17

MySQL约束之默认约束default与零填充约束zerofill怎么实现

本篇内容主要讲解“MySQL约束之默认约束default与零填充约束zerofill怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL约束之默认约束default与零填充约束zer
2023-07-02

mysql约束怎么用

约束是 mysql 用于维护数据库完整性与一致性的数据库对象,支持主键、外键、唯一、非空、默认值与自增等约束类型。这些约束可确保数据完整性、提高性能、简化维护,可通过创建或修改表时指定约束语法应用。MySQL 约束的用法约束是 MySQL
mysql约束怎么用
2024-06-02

C#泛型的定义、继承、方法和约束怎么理解

这篇文章主要讲解了“C#泛型的定义、继承、方法和约束怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#泛型的定义、继承、方法和约束怎么理解”吧!C#泛型参数化了类型,把类型作为参数抽
2023-06-18

mysql约束怎么使用

mysql 约束是强制执行数据库表中数据完整性和一致性的规则。它们包括:非空约束:确保列不为空。唯一约束:确保列中的所有值都是唯一的。主键约束:标识表的唯一行,通常与非空和唯一约束结合使用。外键约束:将表中的列与另一表中的主键链接起来,以确
mysql约束怎么使用
2024-05-30

mysql中check约束怎么用

mysql 中的 check 约束用于限制表中数据值的范围,使用语法:alter table table_name add constraint constraint_name check (column_name expression)。
mysql中check约束怎么用
2024-04-26

PostgreSQL唯一约束怎么使用

这篇文章主要介绍PostgreSQL唯一约束怎么使用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!唯一约束作用保证在一列或一组列中保存的数据是唯一值唯一约束的多种写法1、添加唯一约束语法alter table goo
2023-06-14

mysql怎么禁用外键约束

在MySQL中,可以通过以下步骤来禁用外键约束:进入MySQL命令行工具或者MySQL管理工具,连接到要禁用外键约束的数据库。使用以下命令来查看当前数据库中的外键约束:SHOW CREATE TABLE 表名;找到要禁用的外键约束的名
mysql怎么禁用外键约束
2024-03-14

sql中check约束怎么使用

在SQL中,CHECK约束用于限制表中列的取值范围。它可以用于检查特定条件是否为真,并只允许满足条件的值插入到表中。使用CHECK约束,可以在创建表时或者在修改表结构时添加。下面是使用CHECK约束的一些示例:1. 创建表时添加CHECK约
2023-10-27

C# 中new()约束的作用是什么

C# 中new()约束的作用是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。对于C# new()约束,大家可能有一个误解,以为使用了C# new约束之后,在创建对象时与
2023-06-17

SQL语法中CONSTRAINT约束怎么用

小编给大家分享一下SQL语法中CONSTRAINT约束怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!CONSTRAINT约束,即对数据库表中的数据进行约束,
2023-06-26

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

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

怎么在SQLite中使用外键约束

在SQLite中使用外键约束需要在创建表的时候定义外键关系。以下是一个示例:首先,创建两个表,并定义一个外键约束将一个表的列作为另一个表的外键:CREATE TABLE table1 (id INTEGER PRIMARY KEY,na
怎么在SQLite中使用外键约束
2024-03-11

mysql中怎么使用check约束性别

在MySQL中,可以使用ENUM数据类型来定义性别字段,并通过CHECK约束来限制字段的取值范围,从而实现性别的约束。以下是一个示例:CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(
mysql中怎么使用check约束性别
2024-04-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录