C#基础与进阶扩展合集-基础篇(持续更新)
目录
本文分两篇,进阶篇点击:C#基础与进阶扩展合集-进阶篇
一、基础入门
Ⅰ 关键字
Ⅱ 特性
Ⅲ 常见异常
Ⅳ 基础扩展
1、哈希表
2、扩展方法
3、自定义集合与索引器
4、迭代器与分部类
5、yield return
6、注册表
7、不安全代码
8、方法描述
二、扩展类型
1、BigInteger
2、Half
3、Decimal
4、可空值类型
5、可空引用类型
6、空合并
7、转义字符
8、StringBuilder
9、FormattableString
10、元组
三、其它
1、名称空间取别名
2、字符串前$与@
3、预处理器指令
4、隐藏方法
5、显示和隐式实现接口
6、泛型约束
7、字典初始化方式
8、集Set
9、有序集合
10、只读字段与属性
本文分两篇,进阶篇点击:C#基础与进阶扩展合集-进阶篇
一、基础入门
Ⅰ 关键字
1、record
record(记录),编译器会在后台创建一个类。支持类似于结构的值定义,但被实现为一个类,方便创建不可变类型,成员在初始化后不能再被改变 (C#9新增)
在运行时通过构造函数给成员赋值
2、init
init关键字,代替set(C#9新增)
特性:只能通过构造函数和对象初始化器来设置属性值
public string Name { get; init; }
若用旧的.NET框架版本使用.NET 5代码,需手动添加虚拟类,如下:
namespace System.Runtime.CompilerServices
{
internal static class IsExternalInit { }
}
3、with
with关键字(C#9新增),内部调用<>Clone浅copy方法,使用如下:
MyMath myMath2=myMath1 with { };//浅拷贝
4、base
base关键字,
作用1:子类实例化时默认调用父类的无参构造函数,base可指定调用父类对应的有参构造函数;
作用2:在子类中通过base调用父类被子类重写的虚方法;
5、params
params,修饰方法参数,
1、被修饰的参数必须为一维数组
2、被修饰参数为最后参数,后面不允许有其它参数
6、ref、out、in
1、被ref或out或in修饰的参数通过引用方式传递;
2、传参时也必须带关键字ref(out、in);
3、ref修饰的参数传参时必须提前定义并初始化,out可在传参时定义;
4、out修饰的参数必须在控制离开方法之前对该参数赋值;
5、in修饰的值类型参数,方法内为只读变量(可避免复制值的开销);
7、sealed
sealed,有封装的意思,一般用于修饰类或方法
1、修饰类时,该类不可被继承;
2、修饰方法时,一般用于virtual与抽象方法的继承类,sealed一般与override同时存在,被修饰的已重写的方法不可被其派生类重写。
8、lock
lock, 确保代码正常执行,不会被其他线程中断;将代码定义为互斥段,同一时刻只能由一个线程执行,其他线程必须等待(解决多线程同时抢占同一资源产生的冲突问题)
示例如下:
_root:指需要跟踪的对象(通常实例化一个object作为跟踪对象)
{ _list.Clear(); }:指定义为互斥段的代码块;
lock(_obj){Count--;}
9、readonly
readonly,用于修饰字段为只读字段 :
1、在运行时可通过构造函数赋值;
10、checked、unchecked
1、如果将一个代码块标记为checked,CLR就会对该代码块执行溢出检查,溢出会抛出OverflowException异常,也可在表达式中使用checked关键字;
2、也可在配置项目文件中添加CheckForOverflowUnderflow设置,可对所有未标记的代码进行溢出检查,如:<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>,可使用unchecked关键字来标记不进行溢出检查;
checked
{byte a = 255;a = (byte)(a + 3);
}
11、throw
抛出一个异常
throw new Exception("my exception...");
12、as与is
as,用于检查在兼容引用类型之间的转换,不会抛出异常,若不兼容则返回null,通常需对返回对象进行null判断;
注意:①as不用在类型间的转换,会报错;
②as不能用在值类型数据,会报错;
is,用于检查对象是否与给定类型兼容(可强制转换成给定类型),通常用于强制转换之前的检查(不兼容类型间强制转换会抛出异常),这样的写法通常CLR会进行两次类型的检查,会降低性能(若满足as用法尽量用as转换);
Ⅱ 特性
特性,指C#中对类及程序集成员的进一步描述
更多了解点击:C#进阶-特性 常用如下:
- [Key],指示该属性为主键(仅对属性、字段、索引器有效);
- [StringLength(maximumLength:50,MinimumLength =2)],限制字符串长度(仅对属性、字段、参数、索引器有效);
- [EmailAddress],识别邮箱格式(仅对属性、字段、参数、索引器有效);
- [Required],不可为空(仅对属性、字段、参数、索引器有效);
- [Display(Name="电话号码")],显示别名;
- [CallerMemberName],获取调用该方法的成员名(仅对参数有效);
- [CallerFilePath],获取调用该方法的文件路径(仅对参数有效);
- [CallerLineNumber],获取调用该方法的行数(仅对参数有效);
- [Compare(“Password”, ErrorMessage = “”)],比较两个属性的值是否相同;
- [DataType(DataType.Password)],标记某属性为密码类型;
Ⅲ 常见异常
- ArgumentException,方法接受实参时,检查实参未包含期望的值抛出,其派生有ArgumentNullException(空异常)和ArgumentOutOfRangeException(索引超出范围);
- NotSupportedException,当不支持一个方法时抛出;
- StackOverflowException,当为栈分配的内存满了导致溢出时抛出;
- OverflowException,在checked(关键字中有介绍)上下文中执行算术运算,当得到的值超出变量类型的取值范围时抛出;
- IOException基类,文件I/O导致的异常,其派生有FileLoadException、FileNotFoundException、EndOfStreamException、DriveNotFoundException。。。
- InvalidOperationException,当没有按正确顺序调用类的方法(如缺少初始化调用)时抛出;
- TaskCanceledException,当任务取消或超时的时候抛出;
- NullReferenceException,当使用的
null
引用导致需要引用的对象时抛出;
更多异常详解:微软文档Exception-C#
Ⅳ 基础扩展
1、哈希表
了解哈希表:C#-关于Hashtable
2、扩展方法
扩展方法详解:C#-扩展方法定义及其使用
3、自定义集合与索引器
自定义集合与索引器详解:C#-自定义集合与索引器
4、迭代器与分部类
迭代器与分部类详解:C#-关于迭代器与分部类
5、yield return
yield示例详解:C#-yield return实现数据迭代
6、注册表
了解注册表相关操作:C#-注册表的读取、创建、修改、删除操作
7、不安全代码
了解指针(不安全代码): C#-关于指针使用(不安全代码)
8、方法描述
对自定义方法添加描述:C#-方法的功能、参数、返回值描述
二、扩展类型
1、BigInteger
如果需要的数字比64位的long类型能够表示的值更大,则可使用BigInteger类型,该类型无关键字,无位数限制,可以一直增长下去,直到没有可用内存。
BigInteger bigInteger =111111111111111111;
2、Half
.NET5新增,16位单精度浮点数,无关键字,其有效位数为10位,指数位为5位;
注意:硬编码的一个非整数值(1.92171),一般默认为double类型,需强转;
Half half = (Half)1.92171;
3、Decimal
关键字decimal,.NET高精度浮点类型,128位,1位符号位、96位用作整数,剩下的位指定了比例因子。
注意:要把数字指定为该类型,在其数字后面加上字符M(或m);
decimal deci = 11111.11M;
4、可空值类型
①在类型定义中使用“?”,这将允许赋值null,如:int? a = null;
②编译器会将该语句变成Nullable<T>类型,如:Nullable<int> a=null;
③Nullable<T>不会增加引用类型的开销,仍然是struct值类型,只不过添加了一个布尔标志,用来指定值是否为null;
④总是可把不可为空的值赋值给可空值类型;
5、可空引用类型
①主要为了减少NullReferenceException类型的异常,可启用可空引用类型获得编译器的帮助:1、在项目文件中指定Nullable将其设为enable,如:<Nullable>enable</Nullable>;
2、使用预处理器指令启用:#nullable enable,禁用:#nullable disable,恢复项目文件中设置:#nullable restore
②启用后给引用类型赋值(string c = null;)编译器会报警告,若要赋值null,需加上“?”,如:string? c = null;
6、空合并
string? s=null;
string s2 = s?.ToLower()??string.Format("");//使用null条件运算符和空合并运算符
Console.WriteLine($@"\t{s2}\t{{}}");
7、转义字符
转义序列 | 字符 |
---|---|
\' | 单引号 |
\" | 双引号 |
\\ | 反斜杠 |
\0 | 空 |
\a | 警告 |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
8、StringBuilder
StringBuilder sb = new StringBuilder("111111");//动态字符串默认容量16字符,成倍增加
sb.Append("abcdefghjklmnopq");
Console.WriteLine(sb.Length);//获取有效长度
Console.WriteLine(sb.Capacity);//获取容量
9、FormattableString
FormattableString str = $"time:{t},number:{a}";//格式化字符串类型
Console.WriteLine("格式str:{0}",str.Format);//获取格式化字符串的原始字符串
for (int i = 0; i < str.ArgumentCount; i++)
{
Console.WriteLine("Arg{0}:{1}", i, str.GetArgument(i));//获取参数值
}
10、元组
元组,把多个类型合为一个类型,不需要创建类、结构、记录
var t=(String:"sss",Int32: 32);
t.Int32 = 2;
t.String = "Auston";.Net提供了Tuple<T>旧类型
ValueTuple<T>新类型(推荐)有更好的内置支持
三、其它
1、名称空间取别名
主要用于解决名称空间二义性问题:
using Sys = System;Sys.Console.WriteLine("Hello, Auston!");
2、字符串前$与@
字符串插值:字符串前带$前缀,允许在字符串类计算表达式;
verbatim字符串:字符串前带@前缀,解决反斜杠转义问题,常用于文件路径;
string a = "hello";
Console.WriteLine($"a:{a}");
Console.WriteLine(@"\file\a.txt");
3、预处理器指令
- #define,定义符号;
- #undef,删除符号定义;
- #if、#elif、#else、#endif,条件语句,支持部分逻辑运算符;
- #warning、#error,编译器遇到后会报错或警告,并显示后面文本;
- #region、#endregion,将一段代码视为给定名称的一个块;
- #line,用于改变编译器在警告和错误中显示的文件名和行号信息,如,#line 123 "Test.cs";
- #pragma,抑制(disable)或还原(restore)指定的编译警告;
- #nullable,启用(enable)或禁用(disable)可空引用类型
4、隐藏方法
在基类和派生类中存在签名相同的方法,且无virtual与override修饰时,派生类就会隐藏基类方法;
要隐藏方法,可在方法声明中加new关键字修饰,否则编译器会警告,大多数情况下应重写方法,而不是隐藏方法,隐藏方法会造成对于给定类的实例调用错误方法的危险;
可在派生类中使用base调用基类方法;
Pig pig = new();
pig.Hobby();
pig.BaseHobby();class Animal
{public void Hobby() => Console.WriteLine("Like run...");
}
class Pig : Animal
{new public void Hobby() => Console.WriteLine("Like eat...");public void BaseHobby() => base.Hobby();
}
5、显示和隐式实现接口
隐式实现接口示例:
MyLog myLog = new MyLog();
myLog.Log("this is a log!");
interface ILogger
{void Log(string message);
}class MyLog : ILogger
{public void Log(string message) => Console.WriteLine(message);
}
显示实现接口,被实现成员没有访问修饰符,并且方法前带有接口前缀;
对于显示实现接口,使用MyLog类型变量时,不能访问该接口,因为它是非公有的,只有使用接口类型可调用Log()方法;
使用显示实现接口原因:①为了解决不同接口相同签名方法的冲突;②向类外的代码隐藏接口方法,但仍满足接口契约;
示例如下:
ILogger myLog = new MyLog();
myLog.Log("this is a log!");
interface ILogger
{void Log(string message);
}class MyLog : ILogger
{void ILogger.Log(string message) => Console.WriteLine(message);
}
6、泛型约束
约束 | 说明 |
---|---|
where T : struct | 使用结构约束时,T必须为值类型 |
where T : class | 使用类约束时,T必须为引用类型 |
where T : class? | T必须是可空的或者不可为空的引用类型 |
where T : notnull | T必须是不可为空的类型,可为值类型或引用类型 |
where T : unmanaged | T必须是不可为空的非托管类型 |
where T : IFoo | 类型T必须实现接口IFoo |
where T : Foo | 类型T必须派生自基类Foo |
where T : new() | 构造函数约束,指定T必须有无参构造函数。不能为有参构造函数指定约束 |
where T1 : T2 | 使用约束时,可指定类型T1派生自泛型类型T2 |
7、字典初始化方式
Dictionary<int, string> dic = new Dictionary<int, string>() { { 1, "111" }, { 2, "bbb" } };
Dictionary<int, string> dic2 = new Dictionary<int, string>() { [1] = "111", [2] = "aaa" };
Console.WriteLine("{0}\t{1}", dic[1], dic2[1]);
8、集Set
包含不重复的元素的集合称为,“集(set)”;
.NET Core包含两个集,他们都实现ISet<T>接口:
①HashSet<T>,包含不重复元素的无序散列表;
②SortedSet<T>,包含不重复元素的有序列表;
集的提供另一个Add()方法,其返回类型为bool值,说明是否添加了元素,若该元素已存在,就不添加,并返回false;
HashSet<int> set = new HashSet<int>() { 2, 1, 7, 0, 1, 2 };
foreach (int i in set)Console.Write($"{i} ");//输出2 1 7 0
SortedSet<int> set2 = new SortedSet<int>() { 2, 1, 7, 0, 1, 2 };
foreach (int i in set2)Console.Write($"{i} ");//输出0 1 2 7
9、有序集合
有序集合包括有序集、有序列表、有序字典,功能几乎完全相同,但其性能有很大差异,有序列表使用的内存少,有序字典的元素检索速度快。
10、只读字段与属性
只读字段(readonly修饰的字段 ),在运行时通过构造函数赋值
只读属性,(set被private修饰),使用属性初始化或在构造函数里初始化,如下:
public int Id { get; } = 23;
相关文章:

C#基础与进阶扩展合集-基础篇(持续更新)
目录 本文分两篇,进阶篇点击:C#基础与进阶扩展合集-进阶篇 一、基础入门 Ⅰ 关键字 Ⅱ 特性 Ⅲ 常见异常 Ⅳ 基础扩展 1、哈希表 2、扩展方法 3、自定义集合与索引器 4、迭代器与分部类 5、yield return 6、注册表 7、不安全代码 8、方法…...

ReactJs笔记摘录
文章目录 前言目录结构组件动态组件高阶组件 Hook函数useStateuseEffectuseContextuseReduceruseCallbackuseMemo JSX语法根元素与斜杠使用变量推荐使用className替代class属性写法三元表达式 vs &&antd和tailwindcss 组件通信父传子:props和自定义函数事件…...

2023 re:Invent使用 PartyRock 和 Amazon Bedrock 安全高效构建 AI 应用程序
前言 本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 “Your Data, Your AI, Your Future.(你的数据,你的AI&…...

Mac 打不开github解决方案
序言 github 时有打不开的情况,为此很是烦恼,这里分享一下如何解决这种问题,其实问题的本质是在访问github网页时无法通过github.com的二级域名进行动态域名解析。 解决方案 手动配置静态文件hosts,将该域名和IP的映射关系添加…...

十五 动手学深度学习v2计算机视觉 ——全连接神经网络FCN
文章目录 FCN FCN 全卷积网络先使用卷积神经网络抽取图像特征,然后通过卷积层将通道数变换为类别个数,最后通过转置卷积层将特征图的高和宽变换为输入图像的尺寸。 因此,模型输出与输入图像的高和宽相同,且最终输出通道包含了该空…...

elementUI中的 “this.$confirm“ 基本用法,“this.$confirm“ 调换 “确认“、“取消“ 按钮的位置
文章目录 前言具体操作总结 前言 elementUI中的 "this.$confirm" 基本用法,"this.$confirm" 调换 "确认"、"取消" 按钮的位置 具体操作 基本用法 <script> this.$confirm(这是数据(res.data࿰…...

K8S 常用命令
获取所有的pod资源: kubectl get pod 获取所有的命名空间: kubectl get namespace 获取所有的Deployment资源: kubectl get deployment 删除指定的deploy: kubectl delete deploy nginx 获取所有的服务: kubectl get serv…...

12.使用 Redis 优化登陆模块
目录 1. 使用 Redis 优化登陆模块 1.1 使用 Redis 存储验证码 1.2 使用 Redis 存储登录凭证 1.3 使用 Redis 缓存用户信息 1. 使用 Redis 优化登陆模块 使用 Redis 存储验证码:验证码需要频繁的访问与刷新,对性能要求较高;验证码不需要永…...

Nacos-NacosRule 负载均衡—设置集群使本地服务优先访问
userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 NacosRule 权重计算方法 目录 一、介绍 二、示例(案例截图) 三、总结 一、介绍 NacosRule是AlibabaNacos自己实现的一个负载均衡策略&…...

软件设计师——信息安全(二)
📑前言 本文主要是【信息安全】——软件设计师——信息安全的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄…...

Unity中实现ShaderToy卡通火(原理实现篇)
文章目录 前言一、我们在片元着色器中,实现卡通火的大体框架1、使用 noise 和 _CUTOFF 判断作为显示火焰的区域2、_CUTOFF : 用于裁剪噪波范围的三角形3、noise getNoise(uv, t); : 噪波函数 二、顺着大体框架依次解析具体实现的功能1、 uv.x * 4.0; : …...

引迈信息-JNPF平台怎么样?值得入手吗?
目录 1.前言 2.引迈低代码怎么样? 3.平台亮点展示 4.引迈产品特点 5.引迈产品技术栈: 1.前言 低代码是近几年比较火的一种应用程序快速开发方式,它能帮助用户在开发软件的过程中大幅减少手工编码量,并通过可视化组件加速应用…...

大数据云计算——使用Prometheus-Operator进行K8s集群监控
大数据云计算——使用Prometheus-Operator进行K8s集群监控 一、 背景 在非operator配置的普罗中我们监控k8s集群都是通过配置configmap进行服务发现和指标拉取。切换到prometheus-operator难免会有些使用问题。不少用户已经习惯底层配置自动发现的方式。当过渡到servicemonit…...

[蓝桥杯刷题]合并区间、最长不连续子序列、最长不重复数组长度
前言 ⭐Hello!这里是欧_aita的博客。 ⭐今日语录: 成功的关键在于对目标的持久追求。 ⭐个人主页:欧_aita ψ(._. )>⭐个人专栏: 数据结构与算法 数据库 文章目录 前言合并区间问题📕现实应用大致思路代码实现代码讲解 最长不连续子序列&a…...

Hazel引擎学习(十二)
我自己维护引擎的github地址在这里,里面加了不少注释,有需要的可以看看 参考视频链接在这里 这是这个系列的最后一篇文章,Cherno也基本停止了Games Engine视频的更新,感觉也差不多了,后续可以基于此项目开发自己想要…...

中文字符串逆序输出
今天碰到这个题,让我逆序输出中文字符串,可给我烦死了,之前没有遇到过,也是查了资料才知道,让我太汗颜了。 英文字符串逆序输出很容易,开辟一块空间用来存放逆序后的字符串,从后往前遍历原字符串…...

MySQL BinLog 数据还原恢复
博文目录 文章目录 查看状态查看 binlog 开关及存储路径查看 binlog 配置 如 存储格式 binlog_format查看当前还存在的日志查看当前正在使用的日志 切换日志确定日志确定日志文件日志格式改写日志简要说明确定日志位置以事件为单位查看日志分析日志 还原数据 查看状态 查看 b…...

理想汽车校招内推--大量hc等你来
投递链接: https://li.jobs.feishu.cn/s/i8BLJE1j 欢迎大家投递...

RabbitMQ死信队列详解
什么是死信队列 由于特定的**原因导致 Queue 中的某些消息无法被消费,**这类消费异常的数据将会保存在死信队列中防止消息丢失,例如用户在商城下单成功并点击支付后,在指定时间未支付时的订单自动失效死信队列只不过是绑定在死信交换机上的队…...

计算机网络:物理层(编码与调制)
今天又学会了一个知识,加油! 目录 一、基带信号与宽带信号 1、基带信号 2、宽带信号 3、选择 4、关系 二、数字数据编码为数字信号 1、非归零编码【NRZ】 2、曼彻斯特编码 3、差分曼彻斯特编码 4、归零编码【RZ】 5、反向不归零编码【NRZI】 …...

嵌入式开发板qt gdb调试
1) 启动 gdbserver ssh 或者 telnet 登陆扬创平板 192.168.0.253, 进入命令行执行如下: chmod 777 /home/HelloWorld (2) 打 开 QTcreator->Debug->StartDebugging->Attach to Running Debug Server 进行…...

基于python实现原神那维莱特开转脚本
相信不少原友都抽取了枫丹大C那维莱特,其强力的输出让不少玩家爱不释手。由于其转的越快,越不容易丢伤害的特点,很多原友在开转时容易汗流浃背,所以特意用python写了一个自动转圈脚本,当按住鼠标侧键时,即可…...

C# 实现Lru缓存
C# 实现Lru缓存 LRU 算法全称是最近最少使用算法(Least Recently Use),是一种简单的缓存策略。 通常用在对象池等需要频繁获取但是又需要释放不用的地方。 代码实现的基本原理就是使用链表,当某个元素被访问时(Get或…...

牛客网BC107矩阵转置
答案: #include <stdio.h> int main() {int n0, m0,i0,j0,a0,b0;int arr1[10][10]{0},arr2[10][10]{0}; //第一个数组用来储存原矩阵,第二个数组用来储存转置矩阵scanf("%d%d",&n,&m); if((n>1&&n<10)&&am…...

协作办公原来如此简单?详解 ONLYOFFICE 协作空间 2.0 更新
协作办公原来如此简单?详解 ONLYOFFICE 协作空间 2.0 更新 上周,ONLYOFFICE 的协作空间推出升级版 2.0 版本了: ONLYOFFICE 协作空间 2.0 现已发布:新增公共房间、插件、重新分配数据、RTL 界面等功能 ONLYOFFICE 协作空间是去…...

2023年国赛高教杯数学建模A题定日镜场的优化设计解题全过程文档及程序
2023年国赛高教杯数学建模 A题 定日镜场的优化设计 原题再现 构建以新能源为主体的新型电力系统,是我国实现“碳达峰”“碳中和”目标的一项重要措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站(以下…...

c/c++ 结构体、联合体、枚举
结构体 结构体内存对齐规则: 1、结构体的第一个成员对齐到结构体变量起始位置偏移量为0的地址处 2、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 对齐数:编译器默认的一个对齐数与该成员变量大小的较小值。 vs 中…...

stl模板库成员函数重载类型混肴编译不通过解决方法
stl模板库成员函数重载类型混肴编译不通过解决方法 这种方式编译不通过IsArithmetic和HasMemberList编译器存在混肴 template <typename T, typename Enable std::enable_if<IsArithmetic<T>::value>::type >static void DumpWrapper(T* filed, std::strin…...

MySQL——表的约束
目录 一.表的约束 二.空属性 编辑三.默认值 四.列描述 五.主键 1.主键 2.符合主键 六.自增长 七.唯一键 八.外键 一.表的约束 真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性&…...

cordic 算法学习记录
参考:b站教学视频FPGA:Cordic算法介绍与实现_哔哩哔哩_bilibili FPGA硬件实现加减法、移位等操作比较简单,但是实现乘除以及函数计算复杂度高且占用资源多,常见的计算三角函数/平方根的求解方式有①查找表:先把函数对应…...