首页 > 系统相关 >windows C#-泛型类型参数的约束详解(一)

windows C#-泛型类型参数的约束详解(一)

时间:2025-01-08 23:31:09浏览次数:3  
标签:Node windows class 约束 current C# 泛型 where public

使用约束的原因

约束指定类型参数的功能和预期。 声明这些约束意味着你可以使用约束类型的操作和方法调用。 如果泛型类或方法对泛型成员使用除简单赋值之外的任何操作,包括调用 System.Object 不支持的任何方法,则对类型参数应用约束。 例如,基类约束告诉编译器,只有此类型的对象或派生自此类型的对象可替换该类型参数。 编译器有了此保证后,就能够允许在泛型类中调用该类型的方法。 以下代码示例演示可通过应用基类约束添加到(泛型介绍中的)GenericList<T> 类的功能。

public class Employee
{
    public Employee(string name, int id) => (Name, ID) = (name, id);
    public string Name { get; set; }
    public int ID { get; set; }
}

public class GenericList<T> where T : Employee
{
    private class Node
    {
        public Node(T t) => (Next, Data) = (null, t);

        public Node? Next { get; set; }
        public T Data { get; set; }
    }

    private Node? head;

    public void AddHead(T t)
    {
        Node n = new Node(t) { Next = head };
        head = n;
    }

    public IEnumerator<T> 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 继承的对象。

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

class EmployeeList<T> where T : notnull, Employee, IComparable<T>, new()
{
    // ...
    public void AddDefault()
    {
        T t = new T();
        // ...
    }
}

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

public static void OpEqualsTest<T>(T s, T t) where T : class
{
    System.Console.WriteLine(s == t);
}

private static void TestStringEquality()
{
    string s1 = "target";
    System.Text.StringBuilder sb = new System.Text.StringBuilder("target");
    string s2 = sb.ToString();
    OpEqualsTest<string>(s1, s2);
}

 

编译器只知道 T 在编译时是引用类型,并且必须使用对所有引用类型都有效的默认运算符。 如果必须测试值相等性,请应用 where T : IEquatable<T> 或 where T : IComparable<T> 约束,并在用于构造泛型类的任何类中实现该接口。

约束多个参数

可以对多个参数应用多个约束,对一个参数应用多个约束,如下例所示:

class Base { }
class Test<T, U>
    where U : struct
    where T : Base, new()
{ }

 

标签:Node,windows,class,约束,current,C#,泛型,where,public
From: https://blog.csdn.net/m0_72813396/article/details/144797978

相关文章

  • C++ 复习总结记录六
    C++复习总结记录六模板初阶主要内容1、泛型编程2、函数模板3、类模板4、STL简介一泛型编程如何实现一个通用的交换函数voidSwap(int&left,int&right){inttemp=left;left=right;right=temp;}voidSwap(double&left,double&right)......
  • 有限元分析学习——Anasys Workbanch第一阶段笔记(8)水杯案例的对称与轴对称处理
    目录1序言2对称处理2.1模型处理 2.2网格划分、约束载荷及接触设置2.3计算结果3轴对称处理3.1对称与轴对称概念3.2轴对称问题的应用 3.2.1 创建分析案例3.2.2导入并处理模型3.2.3网格划分、约束载荷及接触设置3.2.4后处理计算结果1序言本章主要介......
  • 【云渗透】各大云 AccessKey 特征整理
    免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。以下文章来源于骨哥说事,作者骨哥说事前言对于云场景的渗透,获得AK和SK泄露,也是渗透中重要的一环。通常,我们会......
  • cuda profiler
    cudaapi的采样主要cudart提供了profiler的接口,定义在cuda_profiler_api.h文件中,下面的代码是一个例子。参考https://blog.csdn.net/weixin_43603658/article/details/130441136,可以看到使用cudaProfilerStart和cudaProfilerEnd可以查看程序中指定段的性能数据。nsys在这个基础......
  • 1.7 DCDC_LDO模块中设计常见问题的分析解答
    DCDC/LDO模块中设计常见问题的分析解答在DC-DC转换器和LDO(线性稳压器)模块设计中,常见的问题通常涉及性能、稳定性和效率等方面。以下是一些常见的问题及其分析解答:一、DC-DC模块常见问题1.输出电压不稳定问题:DC-DC转换器输出电压波动,无法维持稳定。原因分析:负载变化:快......
  • 深度学习基础框架通用模板 (Pytorch Template) - cifar10 图片分类为例,深度学习模板
    文章目录项目简介运行结果展示文件和目录结构说明功能模块详解1.数据相关2.模型相关3.工具函数4.可视化5.训练和日志6.主程序使用方法1.克隆项目2.创建并激活Python3.9虚拟环境3.安装依赖4.安装Jupyter及相关依赖2.数据准备3.开始训练4.可视化结果快......
  • C# 使用心跳机制实现 TCP 客户端自动重连
    C#使用心跳机制实现TCP客户端自动重连简介一、心跳机制二、实现步骤1.创建TCP客户端2.实现心跳检测3.自动重连机制4.启动客户端和心跳检测三、注意事项简介在网络编程中,维持客户端与服务器之间的稳定连接是一项挑战,尤其是在不稳定的网络环境下。TCP连接......
  • 【开源免费】基于Vue和SpringBoot的贸易行业crm系统(附论文)
    本文项目编号T153,文末自助获取源码\color{red}{T153,文末自助获取源码}......
  • 《CPython Internals》阅读笔记:p43-p60
    《CPythonInternals》学习第3天,p43-p60总结,总计18页。一、技术总结1.编译所需要的packagesudoaptinstall-ybuild-essentiallibssl-devzlib1g-devlibncurses5-dev\libncursesw5-devlibreadline-devlibsqlite3-devlibgdbm-dev\libdb5.3-devlibbz2-devlib......
  • Android A/B system - bootctrl
    Achitecture在AndroidA/BSystem概述中有讲到A升B的一个例子。下面这张图是想说明两个问题:启动的时候是如何知道要从A启动还是B启动?升级的时候是如何要更新A还是B?图中有两个流程,和涉及的一些模块:模块:bootloader:启动的早期阶段,叫preloader/lk都行misc:单独的一块分区,存放......