当前位置: 首页 > news >正文

c#中的约束、TimeSpan、defult、operator

c#中的约束

在C#中,约束(Constraints)用于限制泛型类型参数的类型,以确保泛型类型或方法在编译时能够满足特定的要求。约束允许开发者指定泛型类型参数必须满足的条件,比如实现特定的接口或继承自特定的类。以下是一些常见的约束类型:

  1. 类类型约束 (classstruct):

    • class 约束指定类型参数必须是引用类型。

    • struct 约束指定类型参数必须是值类型。

    public class MyClass<T> where T : class
    {// T 必须是引用类型
    }

  2. 接口约束 (interface):

    • 接口约束指定类型参数必须实现一个或多个特定的接口。

    public interface IInterfaceA { }
    public interface IInterfaceB { }
    ​
    public class MyGenericClass<T> where T : IInterfaceA, IInterfaceB
    {// T 必须同时实现 IInterfaceA 和 IInterfaceB
    }

  3. 构造函数约束 (new()):

    • 构造函数约束指定类型参数必须有一个无参数的公共构造函数。

    public class MyGenericClass<T> where T : new()
    {public T CreateInstance() => new T();// T 必须有一个无参数的公共构造函数
    }

  4. 基类约束 (: BaseType):

    • 基类约束指定类型参数必须是指定基类的子类。

    public class MyBaseClass { }
    ​
    public class MyGenericClass<T> where T : MyBaseClass
    {// T 必须是 MyBaseClass 的子类
    }

  5. 多个约束:

    • 可以对类型参数应用多个约束,它们可以组合使用。

    public class MyGenericClass<T> where T : class, IInterfaceA, new()
    {// T 必须是引用类型,实现 IInterfaceA 接口,并有一个无参数的公共构造函数
    }

  6. 类型参数默认值约束 (default):

    • 从C# 8.0开始,可以使用 default 约束来指定类型参数必须有一个可用的默认实现。

    public class MyGenericClass<T> where T : IInterfaceA = default(T)
    {// T 必须实现 IInterfaceA 接口,并且有一个可用的默认实现
    }

TimeSpan

在C#中,TimeSpan 是一个结构体(struct),用于表示两个 DateTime 对象之间的时间差,或者表示一个持续时间。TimeSpan 结构体包含了时间的天、小时、分钟、秒和毫秒部分。

TimeSpan 提供了多种方法来创建和操作时间间隔,例如:

  • TimeSpan.FromSeconds(double):根据秒数创建 TimeSpan

  • TimeSpan.FromMinutes(double):根据分钟数创建 TimeSpan

  • TimeSpan.FromHours(double):根据小时数创建 TimeSpan

  • TimeSpan.FromDays(double):根据天数创建 TimeSpan

此外,TimeSpan 也支持算术运算,如加法和减法,以及与其他 TimeSpan 结构体的比较。

这里是一个简单的使用 TimeSpan 的示例:

// 创建一个表示2小时30分钟的时间间隔
TimeSpan interval = new TimeSpan(2, 30, 0);
​
// 创建一个表示15秒的时间间隔
TimeSpan shortInterval = TimeSpan.FromSeconds(15);
​
// 计算两个DateTime之间的时间差
DateTime start = new DateTime(2024, 1, 1);
DateTime end = new DateTime(2024, 1, 2);
TimeSpan duration = end - start;

TimeSpan 结构体是不可变的,这意味着一旦创建了一个 TimeSpan 实例,它的值就不能被修改。任何修改操作都会返回一个新的 TimeSpan 实例。

c#中的defult

在C#中,default 关键字用于获取一个类型的默认值。每种类型的默认值定义如下:

  • 对于值类型(例如 int, double, struct),默认值是将所有位都设置为0。例如,int 的默认值是 0double 的默认值是 0.0

  • 对于引用类型(例如 class, string),默认值是 null

  • 对于 bool 类型,没有默认值,因为 bool 是一个值类型,并且它只有两个可能的值:truefalse

  • 对于 Nullable<T> 类型(可以为 null 的类型),默认值是 null

使用 default 关键字可以提高代码的可读性和可维护性,特别是当你需要初始化一个变量到其类型的默认值时。例如:

int number = default(int); // 初始化为 0
string text = default(string); // 初始化为 null
double value = default(double); // 初始化为 0.0

此外,default 也可以用于泛型类型参数,编译器会根据类型参数推断出正确的默认值:

List<T> list = new List<T>();
T item = default(T); // 根据 T 的类型,编译器推断出默认值

default 关键字是一个表达式,它在编译时确定类型,并在运行时返回该类型的默认值。

c#中operator

在C#中,operator 关键字用于定义和重载运算符,使得自定义类型可以像内置类型一样使用标准的运算符,如 +, -, ==, != 等。这提高了代码的可读性和一致性。

以下是一些常见的运算符重载示例:

  1. 一元运算符:如 +, -, !, ++, --

    public struct Point
    {public int X { get; set; }public int Y { get; set; }
    ​public static Point operator +(Point p1, Point p2){return new Point { X = p1.X + p2.X, Y = p1.Y + p2.Y };}
    ​public static Point operator -(Point p){return new Point { X = -p.X, Y = -p.Y };}
    }

  2. 二元运算符:如 +, -, *, /, %, ==, !=

    public static bool operator ==(Point p1, Point p2)
    {return p1.X == p2.X && p1.Y == p2.Y;
    }
    ​
    public static bool operator !=(Point p1, Point p2)
    {return !(p1 == p2);
    }

  3. 递增和递减运算符++--

    public class Counter
    {private int _value;
    ​public int Value{get { return _value; }set { _value = value; }}
    ​public static Counter operator ++(Counter c){c._value++;return c;}
    ​public static Counter operator --(Counter c){c._value--;return c;}
    }

  4. 关系运算符<, >, <=, >=

    public class Fraction
    {private int _numerator;private int _denominator;
    ​public static bool operator <(Fraction f1, Fraction f2){// 实现比较逻辑}
    ​public static bool operator >(Fraction f1, Fraction f2){// 实现比较逻辑}
    }

  5. 赋值运算符=

    public class MyClass
    {public int Value { get; set; }
    ​public static MyClass operator =(MyClass a, int value){a.Value = value;return a;}
    }

  6. 逻辑运算符&&, ||

    public class BooleanWrapper
    {private bool _value;
    ​public static BooleanWrapper operator &&(BooleanWrapper b1, BooleanWrapper b2){return new BooleanWrapper { _value = b1._value && b2._value };}
    ​public static BooleanWrapper operator ||(BooleanWrapper b1, BooleanWrapper b2){return new BooleanWrapper { _value = b1._value || b2._value };}
    }

重载运算符时,需要遵循一些规则和最佳实践:

  • 运算符重载应该是直观的,并且与内置类型的行为一致。

  • 重载的运算符应该保持对称性,例如,如果重载了 ==,也应该重载 !=

  • 重载 ==!= 时,也应该重载 GetHashCodeEquals 方法。

  • 重载 + 时,也应该考虑重载 - 以及可能的 +=-=

  • 避免重载 &, |, &=, |= 等位运算符,除非你的类型是位字段。

相关文章:

c#中的约束、TimeSpan、defult、operator

c#中的约束 在C#中&#xff0c;约束&#xff08;Constraints&#xff09;用于限制泛型类型参数的类型&#xff0c;以确保泛型类型或方法在编译时能够满足特定的要求。约束允许开发者指定泛型类型参数必须满足的条件&#xff0c;比如实现特定的接口或继承自特定的类。以下是一些…...

挖矿木马攻破了服务器

最近被国外的挖矿木马攻破了服务器 根据非法登录&#xff0c;用 #last指令查看登录ip 首先删掉登录主机 #kill -9 pts/0 第二步 #top 看看什么占用cpu高 第三步杀死狂刷CPU的服务 过一分钟后&#xff0c;服务又开始狂刷cpu。 第四步根据pid查到服务地址 #systemctl status…...

从容应对技术面试:策略、技巧与成功案例

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 工💗重💗hao💗:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。 ⭐…...

Spring Boot 整合 RestTemplate:详解与实战

Spring Boot 整合 RestTemplate&#xff1a;详解与实战指南 一、引言二、依赖添加Maven 示例&#xff1a;Gradle 示例&#xff1a; 三、创建 RestTemplate 实例四、使用 RestTemplate 发起请求五、处理响应六、高级用法1. 自定义 RestTemplate 实例2. 文件上传、下载以及常见的…...

【利用模板模式和责任链模式实现数据校验】

利用模板模式和责任链模式实现数据校验 一、业务背景二、模板模式和责任链模式代码实现1、数据校验抽象处理器ValidateHandler2、数据校验责任链工具类ValidateChainUtil3、网元调整数据校验抽象类AbstractNodeCheckHandler4、依次定义3个责任链handler&#xff0c;通过Order注…...

学习笔记第十九天

1.标准I/O的基本概念 标准输入&#xff08;stdin&#xff09;&#xff1a;默认是指键盘输入。 标准输出&#xff08;stdout&#xff09;&#xff1a;默认是指显示器输出。 标准错误&#xff08;stderr&#xff09;&#xff1a;用于输出错误信息&#xff0c;也是指向显示器&…...

设计模式 - 单例模式

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、单例模…...

fastapi之WebSockets

文章目录 WebSockets基本概念FastAPI 中的 WebSocket 支持WebSocket 应用示例示例 1: 简单的 WebSocket 连接解释 示例 2: 广播消息的 WebSocket 实现解释 客户端代码示例 完整示例项目结构服务器端代码 (main.py)解释 简单的前端客户端 (static/index.html)解释 测试 相关代码…...

Kotlin 和 Java区别

Kotlin 和 Java 是两种主要用于 Android 开发的编程语言&#xff0c;它们之间有一些关键的区别&#xff1a; 1. 语法简洁性&#xff1a; Kotlin&#xff1a;具有更简洁的语法&#xff0c;减少了冗余代码。例如&#xff0c;Kotlin 支持类型推断&#xff0c;避免了大量的样板…...

windows 达梦到ORACLE dblink

达梦通过DBLINK访问Oracle数据库有两种: 方式一&#xff1a;通过Oracle oci接口; 方式二&#xff1a;一种是通过ODBC数据源的方式。 本案例选择使用Oralce OCI的方式去访问Oracle数据库。 配置Oracle OCI客户端 下载地址&#xff1a;https://www.oracle.com/database/techno…...

大数据应用组件

1、数据存储1.1、hive->hdfs、mapredus1.2、ClickHouse1.3、Elasticsearch1.4、PostgreSQL1.5、HBase 2、数据抽取2.1、Kettle2.2、DataX2.3、Canal2.4、Flink CDC2.5、Sqoop2.6、Filebeat&Logstash(日志) 3、任务编排3.1、Apache DolphinScheduler 4、数据处理4.1、spa…...

Docker Remote API未授权访问漏洞

9.Docker Remote API未授权访问漏洞 步骤一:使用以下Fofa语句对Docker产品进行搜索. port"2375" 步骤二:直接使用浏览器访问以下路径 /version#查看版本信息 /info#查看容器信息 漏洞修复 1.端口访问控制 对2375端口做网络访问控制&#xff0c;如设置iptables…...

算法训练.

一.扩散 题解&#xff1a; 计算点之间的距离&#xff0c;然后对图进行处理即可&#xff0c;这个数据规模较小&#xff0c;因此我使用了floyd,还有最小生成树和二份答案加并查集的写法&#xff1b; 代码&#xff1a; #include <iostream> #include <cstring> #in…...

08、MySQL-事务

目录 1、事务简介 2、事务操作 2.1 方式一 2.2 方式二 3、事务四大特性 4、并发事务问题 5、事务隔离级别 1、事务简介 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c…...

2024 年的 Node.js 生态系统

数据来源于 Node.js Toolbox&#xff0c;网站展示了 Node.js 生态系统中积极维护且流行的库。...

LVS(Linux Virtual Server)

简介 LVS&#xff08;Linux Virtual Server&#xff09;是一个高性能的开源负载均衡解决方案&#xff0c;它通过在Linux内核中实现IPVS&#xff08;IP Virtual Server&#xff09;模块来提供负载均衡功能。LVS能够将外部请求根据特定的算法分发到后端的多个服务器上&#xff0c…...

回顾Python

一、python基础 1、环境python2、python3 [rootpython ~]# yum list installed | grep python #检查是否有python包 [rootpython ~]# yum list installed | grep epel #检查是否有epel包 [rootpython ~]# yum -y install epel-release [rootpython ~]# yum -y install …...

【数据结构】队列,你必须知道的内部原理!!!

&#x1f31e;&#x1f31e;&#x1f31e;生活本就沉闷&#xff0c;但跑起来就会有风 ~~~ 前言&#xff1a; &#x1f31f;&#x1f31f;Hello家人们&#xff0c;这期讲解数据结构队列的基础知识&#xff0c;希望你能帮到屏幕前的你。 &#x1f4da;️上期博客在这里&#xff1…...

Ubuntu24.04编译FFmpeg6.1(支持x264、x265、fdk-acc)

FFmpeg是一个开源的多媒体处理工具集&#xff0c;可以用于处理音频、视频和图片等多种媒体格式。由于其强大的功能和灵活性&#xff0c;FFmpeg被广泛应用在多媒体处理领域&#xff0c;包括音视频编解码、流媒体服务器、视频转码等。FFmpeg7.0 版本移除了 6.0 之前已弃用的 API&…...

顺序表-数据结构

一、结构定义 顺序表是通常是数组&#xff0c;要求数据连续存储。顺序表又分为定长顺序表和变长顺序表&#xff0c;本文实现后者。 1、头文件 #include <stdio.h> #include <stdlib.h> 2、定长顺序表 #define MAX 100 定长顺序表结构 typedef struct SqList {…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...