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 {…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
TJCTF 2025
还以为是天津的。这个比较容易,虽然绕了点弯,可还是把CP AK了,不过我会的别人也会,还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...
