c#中的约束、TimeSpan、defult、operator
c#中的约束
在C#中,约束(Constraints)用于限制泛型类型参数的类型,以确保泛型类型或方法在编译时能够满足特定的要求。约束允许开发者指定泛型类型参数必须满足的条件,比如实现特定的接口或继承自特定的类。以下是一些常见的约束类型:
-
类类型约束 (
class或struct):-
class约束指定类型参数必须是引用类型。 -
struct约束指定类型参数必须是值类型。
public class MyClass<T> where T : class {// T 必须是引用类型 } -
-
接口约束 (
interface):-
接口约束指定类型参数必须实现一个或多个特定的接口。
public interface IInterfaceA { } public interface IInterfaceB { } public class MyGenericClass<T> where T : IInterfaceA, IInterfaceB {// T 必须同时实现 IInterfaceA 和 IInterfaceB } -
-
构造函数约束 (
new()):-
构造函数约束指定类型参数必须有一个无参数的公共构造函数。
public class MyGenericClass<T> where T : new() {public T CreateInstance() => new T();// T 必须有一个无参数的公共构造函数 } -
-
基类约束 (
: BaseType):-
基类约束指定类型参数必须是指定基类的子类。
public class MyBaseClass { } public class MyGenericClass<T> where T : MyBaseClass {// T 必须是 MyBaseClass 的子类 } -
-
多个约束:
-
可以对类型参数应用多个约束,它们可以组合使用。
public class MyGenericClass<T> where T : class, IInterfaceA, new() {// T 必须是引用类型,实现 IInterfaceA 接口,并有一个无参数的公共构造函数 } -
-
类型参数默认值约束 (
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的默认值是0,double的默认值是0.0。 -
对于引用类型(例如
class,string),默认值是null。 -
对于
bool类型,没有默认值,因为bool是一个值类型,并且它只有两个可能的值:true和false。 -
对于
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 关键字用于定义和重载运算符,使得自定义类型可以像内置类型一样使用标准的运算符,如 +, -, ==, != 等。这提高了代码的可读性和一致性。
以下是一些常见的运算符重载示例:
-
一元运算符:如
+,-,!,++,--。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 };} } -
二元运算符:如
+,-,*,/,%,==,!=。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); } -
递增和递减运算符:
++和--。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;} } -
关系运算符:
<,>,<=,>=。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){// 实现比较逻辑} } -
赋值运算符:
=。public class MyClass {public int Value { get; set; } public static MyClass operator =(MyClass a, int value){a.Value = value;return a;} } -
逻辑运算符:
&&,||。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 };} }
重载运算符时,需要遵循一些规则和最佳实践:
-
运算符重载应该是直观的,并且与内置类型的行为一致。
-
重载的运算符应该保持对称性,例如,如果重载了
==,也应该重载!=。 -
重载
==和!=时,也应该重载GetHashCode和Equals方法。 -
重载
+时,也应该考虑重载-以及可能的+=和-=。 -
避免重载
&,|,&=,|=等位运算符,除非你的类型是位字段。
相关文章:
c#中的约束、TimeSpan、defult、operator
c#中的约束 在C#中,约束(Constraints)用于限制泛型类型参数的类型,以确保泛型类型或方法在编译时能够满足特定的要求。约束允许开发者指定泛型类型参数必须满足的条件,比如实现特定的接口或继承自特定的类。以下是一些…...
挖矿木马攻破了服务器
最近被国外的挖矿木马攻破了服务器 根据非法登录,用 #last指令查看登录ip 首先删掉登录主机 #kill -9 pts/0 第二步 #top 看看什么占用cpu高 第三步杀死狂刷CPU的服务 过一分钟后,服务又开始狂刷cpu。 第四步根据pid查到服务地址 #systemctl status…...
从容应对技术面试:策略、技巧与成功案例
欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: 工💗重💗hao💗:野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。 ⭐…...
Spring Boot 整合 RestTemplate:详解与实战
Spring Boot 整合 RestTemplate:详解与实战指南 一、引言二、依赖添加Maven 示例:Gradle 示例: 三、创建 RestTemplate 实例四、使用 RestTemplate 发起请求五、处理响应六、高级用法1. 自定义 RestTemplate 实例2. 文件上传、下载以及常见的…...
【利用模板模式和责任链模式实现数据校验】
利用模板模式和责任链模式实现数据校验 一、业务背景二、模板模式和责任链模式代码实现1、数据校验抽象处理器ValidateHandler2、数据校验责任链工具类ValidateChainUtil3、网元调整数据校验抽象类AbstractNodeCheckHandler4、依次定义3个责任链handler,通过Order注…...
学习笔记第十九天
1.标准I/O的基本概念 标准输入(stdin):默认是指键盘输入。 标准输出(stdout):默认是指显示器输出。 标准错误(stderr):用于输出错误信息,也是指向显示器&…...
设计模式 - 单例模式
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、单例模…...
fastapi之WebSockets
文章目录 WebSockets基本概念FastAPI 中的 WebSocket 支持WebSocket 应用示例示例 1: 简单的 WebSocket 连接解释 示例 2: 广播消息的 WebSocket 实现解释 客户端代码示例 完整示例项目结构服务器端代码 (main.py)解释 简单的前端客户端 (static/index.html)解释 测试 相关代码…...
Kotlin 和 Java区别
Kotlin 和 Java 是两种主要用于 Android 开发的编程语言,它们之间有一些关键的区别: 1. 语法简洁性: Kotlin:具有更简洁的语法,减少了冗余代码。例如,Kotlin 支持类型推断,避免了大量的样板…...
windows 达梦到ORACLE dblink
达梦通过DBLINK访问Oracle数据库有两种: 方式一:通过Oracle oci接口; 方式二:一种是通过ODBC数据源的方式。 本案例选择使用Oralce OCI的方式去访问Oracle数据库。 配置Oracle OCI客户端 下载地址: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端口做网络访问控制,如设置iptables…...
算法训练.
一.扩散 题解: 计算点之间的距离,然后对图进行处理即可,这个数据规模较小,因此我使用了floyd,还有最小生成树和二份答案加并查集的写法; 代码: #include <iostream> #include <cstring> #in…...
08、MySQL-事务
目录 1、事务简介 2、事务操作 2.1 方式一 2.2 方式二 3、事务四大特性 4、并发事务问题 5、事务隔离级别 1、事务简介 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,…...
2024 年的 Node.js 生态系统
数据来源于 Node.js Toolbox,网站展示了 Node.js 生态系统中积极维护且流行的库。...
LVS(Linux Virtual Server)
简介 LVS(Linux Virtual Server)是一个高性能的开源负载均衡解决方案,它通过在Linux内核中实现IPVS(IP Virtual Server)模块来提供负载均衡功能。LVS能够将外部请求根据特定的算法分发到后端的多个服务器上,…...
回顾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 …...
【数据结构】队列,你必须知道的内部原理!!!
🌞🌞🌞生活本就沉闷,但跑起来就会有风 ~~~ 前言: 🌟🌟Hello家人们,这期讲解数据结构队列的基础知识,希望你能帮到屏幕前的你。 📚️上期博客在这里࿱…...
Ubuntu24.04编译FFmpeg6.1(支持x264、x265、fdk-acc)
FFmpeg是一个开源的多媒体处理工具集,可以用于处理音频、视频和图片等多种媒体格式。由于其强大的功能和灵活性,FFmpeg被广泛应用在多媒体处理领域,包括音视频编解码、流媒体服务器、视频转码等。FFmpeg7.0 版本移除了 6.0 之前已弃用的 API&…...
顺序表-数据结构
一、结构定义 顺序表是通常是数组,要求数据连续存储。顺序表又分为定长顺序表和变长顺序表,本文实现后者。 1、头文件 #include <stdio.h> #include <stdlib.h> 2、定长顺序表 #define MAX 100 定长顺序表结构 typedef struct SqList {…...
OpenClaw技能开发入门:千问3.5-9B定制天气查询
OpenClaw技能开发入门:千问3.5-9B定制天气查询 1. 为什么需要自定义技能? 去年冬天,我经常需要同时查看多个城市的天气情况来安排出差行程。每次手动打开天气网站、输入城市名、截图保存的操作让我不胜其烦。直到发现OpenClaw支持自定义技能…...
PyTorch 2.8多场景实操:科研训练+工程推理+内容创作的统一技术底座
PyTorch 2.8多场景实操:科研训练工程推理内容创作的统一技术底座 1. 为什么选择PyTorch 2.8作为统一技术底座 PyTorch 2.8作为当前最主流的深度学习框架之一,已经成为学术界和工业界的首选工具。这个基于RTX 4090D 24GB显卡深度优化的镜像,…...
【Java微服务Istio配置黄金法则】:20年架构师亲授5大避坑指南与生产级配置模板
第一章:Java微服务Istio配置的核心认知与演进脉络Istio 作为云原生服务网格的事实标准,其配置体系并非孤立存在,而是深度耦合于 Java 微服务的生命周期、通信契约与可观测性需求。早期 Spring Cloud Netflix 生态依赖客户端库(如 …...
停止学习新语言!2026年技术人的反内耗宣言
一、技术内耗的困局:语言焦虑与效率陷阱2026年的技术圈,Python稳居TIOBE榜首,Rust强势崛起,TypeScript重构前端生态……语言迭代的速度远超人类学习极限。测试从业者深陷三重内耗漩涡:工具链绑架:70%自动化…...
Beyond ChatGPT: Building Physical World AI with PaLM-E and VoxPoser (Hands-on Guide)
从语言模型到物理世界操作:PaLM-E与VoxPoser实战指南 当ChatGPT在对话中展现出惊人的语言理解能力时,一个更激动人心的问题浮现:如何让AI系统突破虚拟界限,在物理世界中执行复杂任务?这正是PaLM-E与VoxPoser这类多模态…...
Arcgis林业资源管理实战:从GPS打点到小班成图的完整工作流
ArcGIS林业资源管理实战:从GPS打点到小班成图的完整工作流 林业资源调查是森林经营管理的基石,而GIS技术正在彻底改变传统林业调查的工作模式。记得去年参与某林场资源普查时,我们团队用传统方法完成一个林班调查需要两周,而采用A…...
循环冷却水流量示意图设计 建筑水流量示意图绘制教程
一、引言 在建筑给排水、暖通空调及工业循环水系统设计中,循环冷却水流量示意图与建筑水流量示意图是核心技术图纸之一,其作用是直观呈现水流路径、管径规格、流量分配、设备连接关系及压力节点参数,为系统施工、调试、运维及故障排查提供可…...
JAVA重点基础、进阶知识及易错点总结(15)缓冲流 + 转换流
🚀 Java 巩固进阶 第15天 主题:缓冲流 转换流 —— 高效 IO 与编码安全的终极方案📅 进度概览:今天学习 生产环境真正在用的流组合!掌握缓冲流 转换流,你的文件操作代码才能达到"标准、高效、不乱码…...
Windows平台OpenClaw部署:百川2-13B-4bits量化版调用详解
Windows平台OpenClaw部署:百川2-13B-4bits量化版调用详解 1. 为什么选择这个组合? 去年冬天,当我第一次尝试在Windows笔记本上部署本地AI助手时,遇到了显存不足的难题。我的GTX 3060显卡根本无法承载常规的13B模型,直…...
模拟前端电路设计:高精度信号处理核心技术解析
1. 模拟前端电路设计概述 模拟前端电路是连接真实世界与数字系统的关键桥梁,它负责将传感器采集的微弱模拟信号进行调理、放大和转换,使其能够被后续的数字系统正确处理。作为一名从事硬件设计十余年的工程师,我处理过从医疗设备到工业控制的…...
