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
1、被ref或out修饰的参数通过引用方式传递;
2、传参时也必须带关键字ref(out);
3、ref修饰的参数传参时必须提前定义并初始化,out可在传参时定义;
4、out修饰的参数必须在控制离开方法之前对该参数赋值;
7、sealed
sealed,有封装的意思,一般用于修饰类或方法
1、修饰类时,该类不可被继承;
2、修饰方法时,一般用于virtual与抽象方法的继承类,sealed一般与override同时存在,被修饰的已重写的方法不可被其派生类重写。
8、lock
lock, 确保代码正常执行,不会被其他线程中断;将代码定义为互斥段,同一时刻只能由一个线程执行,其他线程必须等待(解决多线程同时抢占同一资源产生的冲突问题)
示例如下:
_root:指需要跟踪的对象(通常实例化一个object作为跟踪对象)
{ _list.Clear(); }:指定义为互斥段的代码块;
lock(_root)
{_list.Clear();
}
9、readonly
readonly,用于修饰字段为只读字段 :
1、在运行时可通过构造函数赋值;
Ⅱ 特性
特性,指C#中对类及程序集成员的进一步描述:
- [Key],指示该属性为主键(仅对属性、字段、索引器有效);
- [StringLength(maximumLength:50,MinimumLength =2)],限制字符串长度(仅对属性、字段、参数、索引器有效);
- [EmailAddress],识别邮箱格式(仅对属性、字段、参数、索引器有效);
- [Required],不可为空(仅对属性、字段、参数、索引器有效);
- [Display(Name="电话号码")],显示别名;
- [CallerMemberName],获取调用该方法的成员名(仅对参数有效);
- [CallerFilePath],获取调用该方法的文件路径(仅对参数有效);
- [CallerLineNumber],获取调用该方法的行数(仅对参数有效);
- [Compare(“Password”, ErrorMessage = “”)],比较两个属性的值是否相同;
- [DataType(DataType.Password)],标记某属性为密码类型;
三、扩展知识
1、Predicate
拥有一个或多个泛型参数并返回一个 bool 值,常用于对 collection 进行一组条件检索,类似于Func。
举例:Predicate pre=m=>m.Id==2;
2、设置C#语言版本
工程文件 x.csproj中修改
PropertyGroup节点内添加子节点:
<LangVersion>latest</LangVersion>
3、ListCollectionView过滤集合
使用ListCollectionView类构造函数注入列表
通过该类的 Filter属性过滤集合
List<Animal> animals = new List<Animal>() { new Animal(1,"ani1"),new Animal(2,"动物2") };List<Bear> bears = new List<Bear>();var tmp = animals.Adapt<List<Bear>>();tmp.ForEach(m => m.Description = "Animal adapt bear...");ListCollectionView view=new ListCollectionView(tmp);view.Filter = i => ((Bear)i).ID == 2;foreach (var animal in view)MessageBox.Show(((Bear)animal).Name);
4、Adapt适配器
安装NutGet包:Mapster
可理解成转换器,适配器适配的是不同类间相同的名称,不论字段或属性(必须为值类型或字符串类型),只要名字相同,都适配给目的对象;
注意:即使名称相同,属性或字段也不能适配成方法
Animal animal = new Animal(18);Bear bear = animal.Adapt<Bear>();Console.WriteLine(bear.Age.ToString());Console.WriteLine(bear.Description.ToString());Console.WriteLine("************************");Bear bear1=new Bear();Console.WriteLine(bear1.Age.ToString());Console.WriteLine(bear1.Description.ToString());Console.WriteLine("*************************");Banana banana = animal.Adapt(new Banana());Console.WriteLine(banana.Description);

5、值类型与引用类型
值类型:变量直接保存其数据,作为类的字段(成员变量)时,跟随其所属的实例存储,也就是存储在堆中;作为方法中的局部变量时,存储在栈上;
引用类型:变量保存其数据的引用(地址)分配在栈中,具体数据(实例)部署在托管堆中;
值类型:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型
引用类型:数组,用户定义的类、接口、委托,object,字符串
引用类型string:
string a = "A";string b = a;Console.WriteLine($"a:{a}\tb:{b}");a= "B";Console.WriteLine($"a:{a}\tb:{b}");

string为引用类型,上面示例看出string像值类型:
实际上,是由于运算符的重构所导致的结果。当a被重新赋值时,.NET为a在托管堆上重新分配了一块内存。这样做的目的是,使字符串类型与通俗意义上讲的字符串更接地气。
引用类型数组:
数组元素为值类型时,在托管堆中一次性分配全部值类型空间(堆中栈),并自动初始化;
元素为 引用类型时,先在托管堆分配一次空间,此时不会自动初始化任何元素(均为null)。等到有代码初始化某个元素的时,这个引用类型元素的存储空间才会被分配在托管堆上;
6、程序设置当前项目工作目录
Directory.SetCurrentDirectory(Path.GetDirectoryName(typeof(Test).Assembly.Location));
7、获取App.config配置文件中的值
1、获取appSettings节点值:
ConfigurationManager.AppSettings[key];
2、获取connectionStrings节点值:
var list= ConfigurationManager.ConnectionStrings;
string str="";
foreach (ConnectionStringSettings item in list)
{
if(item.Name=="ConTest")
str = item.ConnectionString;
}
8、Linq常用方法
Where查询(方式1:from in;方式2:Lambda表达式):
List<string> list = new List<string>() { "111","222","33","44"};var list2=from m in list where m.Length==3 select m;var list3=list.Where(m => m.Length==2); //使用Lambda表达式foreach (var m in list3)Console.WriteLine(m);
order排序:1、descending 降序;2、ascending 升序
List<int> list = new List<int>() { 11, 2, 23, 7 };//var list2=from m in list orderby m descending select m;var list2 = from m in list orderby m ascending select m;//var list3 = list.OrderBy(x => x).ToList();//Lambda表达式var list3 = list.OrderByDescending(x => x).ToList();foreach (var m in list3)Console.WriteLine(m);
四、版本新增
C#9新增顶级语句;
字符串的范围除SubString方法,C#8新增hat(^)、范围运算符([..]);
StringBuilder sb = new StringBuilder("111111");//动态字符串默认容量16字符,成倍增加
sb.Append("abcdefghjklmnopq");
Console.WriteLine(sb.Length);//获取有效长度
Console.WriteLine(sb.Capacity);//获取容量
string rangstr ="hello,auston!" ;
Console.WriteLine(rangstr[..5]);//范围运算符
Console.WriteLine(rangstr[7^2]);//hat^运算符,从索引7往前数第2个字符
string? s=null;
string s2 = s?.ToLower()??string.Format("");//使用null条件运算符和空合并运算符
Console.WriteLine($@"\t{s2}\t{{}}");//字符串插值(带$前缀)与verbatim字符串(带@前缀)
DateTime t = DateTime.Now;
Console.WriteLine($"{t:D}");//字符串格式控制
int a = 2_2_2;//使用数字分隔符,提高代码可读性(编译器会忽略下划线)
Console.WriteLine($"{a:c}");
double d = 22.336_6;
Console.WriteLine($"{d:###.##}");//小数点后四舍五入保留2位
Console.WriteLine($"{d:000.00}");//小数点前保留3位,后保留2位
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));//获取参数值
}
只读字段(readonly修饰的字段 ),在运行时通过构造函数赋值
只读属性,(set被private修饰),使用属性初始化或在构造函数里初始化,如下:
public int Id { get; } = 23;
元组,把多个类型合为一个类型,不需要创建类、结构、记录
var t=(String:"sss",Int32: 32);
t.Int32 = 2;
t.String = "Auston";.Net提供了Tuple<T>旧类型
ValueTuple<T>类型(推荐)有更好的内置支持
相关文章:
C#关键字、特性基础及扩展合集(持续更新)
一、基础 Ⅰ 关键字 1、record record(记录),编译器会在后台创建一个类。支持类似于结构的值定义,但被实现为一个类,方便创建不可变类型,成员在初始化后不能再被改变 (C#9新增) …...
单例模式-支持并发的C语言实现
代码实现: c #include <stdio.h> #include <stdlib.h> #include <pthread.h>// 定义单例对象结构体 typedef struct {// 单例对象的数据成员int value; } Singleton;// 静态变量,用于保存唯一实例的指针 static Singleton* instance …...
java_基础_数据类型
1.数据类型 java 语言是强类型语言,对于每一种数据都给出了明确的数据类型,不同的数据类型也分配了不同的内存空间,所以他们的数据大小也不一样的. 数据类型关键字内存占用取值范围整数byte1-128~127short2-32768~32767int4-2的31次方到2的31次方-1long8-2的63次方到2的63次方…...
C++入门第九篇---Stack和Queue模拟实现,优先级队列
前言: 我们已经掌握了string vector list三种最基本的数据容器模板,而对于数据结构的内容来说,其余的数据结构容器基本都是这三种容器的延申和扩展,在他们的基础上扩展出更多功能和用法,今天我们便来模拟实现一下C库中…...
计算机组成原理(计算机系统概述)
目录 一. 计算机的发展二. 计算机硬件的基本组成2.1 早期冯诺依曼机2.2 现代计算机的结构 三. 各硬件的工作原理3.1 主存储器的基本组成3.2 运算器的基本组成3.3 控制器的基本组成 四. 计算机的工作过程 \quad 一. 计算机的发展 计算机系统 硬件 软件 #mermaid-svg-gp2AsYELE…...
Qt手写ListView
创建视图: QHBoxLayout* pHLay new QHBoxLayout(this);m_pLeftTree new QTreeView(this);m_pLeftTree->setEditTriggers(QAbstractItemView::NoEditTriggers); //设置不可编辑m_pLeftTree->setFixedWidth(300);创建模型和模型项: m_pLeftTree…...
【开源】基于Vue.js的城市桥梁道路管理系统的设计和实现
项目编号: S 025 ,文末获取源码。 \color{red}{项目编号:S025,文末获取源码。} 项目编号:S025,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询城市桥…...
2、git进阶操作
2、git进阶操作 2.1.1 分支的创建 命令参数含义git branch (git checkout -b)<new_branch> <old_branch>表示创建分支-d <-D>删除分支 –d如果分支没有合并,git会提醒,-D强制删除-a -v查看分支-m重新命名分支commit id从指定的commi…...
集线器-交换机-路由器
1.集线器(Hub) 集线器就是将网线集中到一起的机器,也就是多台主机和设备的连接器。集线器的主要功能是对接收到的信号进行同步整形放大,以扩大网络的传输距离,是中继器的一种形式,区别在于集线器能够提供多端口服务,也…...
金融众筹模式系统源码 适合创业孵化机构+天使投资机构+投资基金会等 附带完整的搭建教程
随着互联网技术的发展和金融市场的开放,金融众筹模式逐渐成为一种新型的融资方式。这种模式通过互联网平台聚集大量投资者,共同参与到一个项目中,为项目提供资金支持,最终获得投资回报。今天罗峰给大家分享一款金融众筹模式系统源…...
大数据学习(24)-spark on hive和hive on spark的区别
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦ᾑ…...
SQLite3 数据库学习(六):Qt 嵌入式 Web 服务器详解
参考引用 SQLite 权威指南(第二版)SQLite3 入门 1. Apache 搭建 cgi 环境 1.1 什么是 Apache Apache 是世界使用排名第一的 Web 服务器软件 它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用 1.2 具体搭建流程…...
各平台chatGPT使用体验(国内外)
首推:openAI 地址:https://chat.openai.com/ 这个真的很好用,而且回复的结果也基本让让人满意,个人首推,而且对比国内的除了回答更令人满意外,它更连贯,不像国内的gpt一句一问,跟进…...
机器学习【02】在 Pycharm 里使用 Jupyter Notebook
只有 Pycharm 的 Professional 版才支持 Jupyter Notebook 一.新建一个项目 参考新建项目 二.相关设置 右键你的项目名,新建一个JupyterNotebook文件 新建后发现 点击最右边的install jupyter可以自动安装 也可以使用命令行在对应的虚拟环境中安装 我们使用直…...
什么是proxy代理?
1. 什么是proxy代理 代理(Proxy)是 JavaScript 中一种非常强大而灵活的功能。代理允许你拦截并覆盖对象的默认行为,提供了一种拦截、定制和扩展对象操作的机制。 简单说,就是在访问对象属性或者赋值时,可以做一些额外…...
opencv-python读取的图像分辨率太大不能完全显示
如果使用OpenCV-Python读取的图像分辨率太大,无法完全显示在屏幕上,可以考虑以下几种方法: 1.缩放图像:使用OpenCV的resize函数,将图像缩小到适合屏幕显示的大小。例如,可以将图像的宽度和高度都缩小到屏幕…...
【ArcGIS Pro微课1000例】0038:基于ArcGIS Pro的人口密度分析与制图
文章目录 一、人口密度二、人口密度分析1. 点密度分析2. 核密度分析三、结果比对一、人口密度 人口密度是指单位土地面积上居住的人口数,通常以每平方千米或每公顷内的常住人口为单位计算。人口密度同资源、经济密切结合,因此,科学准确地分析人口密度的分布情况,对合理制定…...
Python 安装Vue依赖包发生异常:npm ERR! notsup Required: {“node“:“^18.17.0 || >=20.5.0“}
异常: 原因:node和npm要求升级为高版本 解决:重新安装node环境 (1) 官网下载Node.js (2)双击安装node.js (3)运行查看...
TypeScript 项目 Airbnb 语法风格 ESLint 配置
TypeScript 项目 Airbnb 语法风格 ESLint 配置 1. 配置 安装: npm i -D eslint-config-airbnb-typescript typescript-eslint/eslint-plugin^6.0.0 typescript-eslint/parser^6.0.0配置: .eslintrc.js: module.exports {root: true,env: {node: true…...
怎么使用sentinel,以及所有的知识点
Sentinel是一个开源的流量控制和实时监控系统,主要用于保护企业级应用程序免受不良的请求。下面是使用Sentinel需要了解的知识点: 1. 什么是流量控制? 流量控制指的是限制应用程序的请求流量,防止过多的请求超出系统的承受范围。…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...
