C#-基础及扩展合集(持续更新)

news2024/12/23 16:18:35

一、基础 

Ⅰ 关键字

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(_obj){Count--;}

 

9、readonly

readonly,用于修饰字段为只读字段 :

1、在运行时可通过构造函数赋值;

 Ⅱ 特性

特性,指C#中对类及程序集成员的进一步描述

        更多了解点击:C#进阶-特性   常用如下:

  1.  [Key],指示该属性为主键(仅对属性、字段、索引器有效);
  2.  [StringLength(maximumLength:50,MinimumLength =2)],限制字符串长度(仅对属性、字段、参数、索引器有效);
  3.  [EmailAddress],识别邮箱格式(仅对属性、字段、参数、索引器有效);
  4.  [Required],不可为空(仅对属性、字段、参数、索引器有效);
  5.  [Display(Name="电话号码")],显示别名;
  6. [CallerMemberName],获取调用该方法的成员名(仅对参数有效);
  7. [CallerFilePath],获取调用该方法的文件路径(仅对参数有效);
  8. [CallerLineNumber],获取调用该方法的行数(仅对参数有效);
  9. [Compare(“Password”, ErrorMessage = “”)],比较两个属性的值是否相同;
  10. [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常用语句

关于Linq常用语句详细讲解点击:C#-关于LINQ 

select:返回指定类型 

Where查询特点条件(方式1:from in;方式2:Lambda表达式)

Order排序:1、descending 降序;2、ascending 升序

OfType查询特定类型

Join合并两集合通过指定键,返回指定结构类型集合

GroupJoin:俩集合通过指定键分组

Reverse反转集合元素顺序

GroupBy按指定键对自身分组 

Any / All 判断是否(任意一个/全部)满足条件

Skip跳过指定数量元素

 Take拿取指定数量元素

Count获取元素个数

 Sum、Average、Max、Min获取集合总值、平均值、最大值、最小值

Concat连接集合

Distinct去重(去重类中某个字段需实现IEqualityComparer接口

ElementAt获取指定索引元素(与[ ]类似)

First/Single、Last:获取集合中第一个、最后一个元素(如果集合中包含多个元素,使用Single会报错);

ToDictionary:将集合转换为字典;

ToList: 将集合转换为List;

SequenceEqual:判断两个集合是否相等;

9、Mutex互斥及防止App多开

1、继承自WaitHandle类:抽象基类,用于等待一个信号的设置(有静态方法WaitOne()、WaitAll()、WaitAny());

2、Mutex互斥锁可定义互斥名称,所以可用于跨进程的同步操作(因为操作系统可识别有名称的互斥,在不同进程间共享);

3、Mutex构造函数中,可指定互斥是否最初应由主调线程拥有、定义互斥名称、获取互斥是否已存在的信息;

用法1:跨进程互斥实现进程间同步(未命名互斥只能用于跨线程) 

Mutex mutext = new Mutex(false,"MyConsole");
mutext.WaitOne();
Console.WriteLine($"{Process.GetCurrentProcess().ProcessName}:\tStart......");
Console.ReadLine();
mutext.ReleaseMutex();
Console.WriteLine($"{Process.GetCurrentProcess().ProcessName}:\tEnd.......");

 用法2:防止App重复开启

Mutex mutext = new Mutex(false,"MyConsole",out bool createNew);
if (!createNew)
    return;

10、Monitor设置等待资源时间

lock关键字是由Monitor类实现(抛出异常也会解锁)如下:

    Monitor.Enter(_obj);
    try{Count--;}
    finally { Monitor.Exit(_obj); }

Monitor相对于lock的优点在于,使用Monitor的TryEnter()方法,其中可传递一个超时值,用于指定等待被锁定的最长时间,若_obj被锁定,TryEnter()方法将布尔型的引用参数设置为true,并同步的访问_obj锁定状态,若另一个线程锁定_obj时间超过指定时间,TryEnter()将bool引用参数置为false,线程将不再等待,而是去执行其它操作,如下:

    Monitor.TryEnter(_obj, 2000, ref _lockTaken);
    if (_lockTaken)
    {
        try
        {
            Console.WriteLine(Thread.CurrentThread.Name + ":\t obj lock.....");
            Thread.Sleep(5000);
            Console.WriteLine(Thread.CurrentThread.Name + ":\t obj release.....");
        }
        finally
        {
            Monitor.Exit(_obj);
        }
    }
    else
        Console.WriteLine("Timeout,Run other.....");

 

三、版本新增 

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>类型(推荐)有更好的内置支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1259066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python中的datetime库

1. datetime datetime是Python中用于处理日期和时间的类&#xff0c;它包含在datetime模块中。使用datetime类&#xff0c;我们可以创建表示特定日期和时间的对象&#xff0c;以及进行日期和时间的计算和操作。 from datetime import datetime, timedelta# 获取当前日期和时间…

ATA-7030高压放大器在等离子体实验中的应用有哪些

高压放大器在等离子体实验中有多种重要应用。等离子体是一种带电粒子与电中性粒子混合的物质&#xff0c;其具有多种独特的物理性质&#xff0c;因此在许多领域具有广泛的应用&#xff0c;例如聚变能源、等离子体医学、材料加工等。下面安泰电子将介绍高压放大器在等离子体实验…

简易selenium自动化测试框架(Python)

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

AIGC系列之:CLIP和OpenCLIP

目录 模型背景 CLIP模型介绍 相关资料 原理和方法 Image Encoder Text Encoder 对比学习 预训练 Zero Shot预测 优势和劣势 总结 OpenClip模型介绍 相关资料 原理 结果 用法 模型总结 模型背景 Stable Diffusion主要由三个核心模块组成&#xff1a; Text Enc…

聊聊如何进行代码混淆加固

​ 聊聊如何进行代码混淆 前言什么是代码混淆代码混淆&#xff0c;是指将计算机程序的代码&#xff0c;转换成一种功能上等价&#xff0c;但是难于阅读和理解的形式的行为。 代码混淆常见手段1、名称混淆 将有意义的类&#xff0c;字段、方法名称更改为无意义的字符串。生成…

多模态融合16篇优质论文及代码合集,含2023最新

多模态融合是多模态学习领域的基础问题&#xff0c;也是多模态研究中非常关键的研究点。它旨在从多个模态&#xff08;例如语音、图像、文本等&#xff09;中提取有价值的信息和特征&#xff0c;并将这些信息融合在一起以提高系统的性能。这一领域的研究内容广泛&#xff0c;包…

深入探索Maven:优雅构建Java项目的新方式(一)

Maven高级 1&#xff0c;分模块开发1.1 分模块开发设计1.2 分模块开发实现 2&#xff0c;依赖管理2.1 依赖传递与冲突问题2.2 可选依赖和排除依赖方案一:可选依赖方案二:排除依赖 3&#xff0c;聚合和继承3.1 聚合步骤1:创建一个空的maven项目步骤2:将项目的打包方式改为pom步骤…

CSGO搬砖还能做吗?CSGO饰品未来走势如何?

steam/csgo搬砖项目真能月入过万吗&#xff1f;到底真的假的&#xff1f; 如何看待CSGO饰品市场的整体走向&#xff1f; 从整体来说&#xff0c;CSGO的饰品市场与规模肯定会持续不断的上升&#xff0c;大盘不会发生特别大的波动&#xff0c;目前处于稳定期&#xff01;&…

05_属性描述符

05_属性描述符 文章目录 05_属性描述符一、属性描述符是什么&#xff1f;二、属性描述符①&#xff1a;查看属性描述②&#xff1a;设置属性描述符③&#xff1a;案例01.代码实现02.代码实现&#xff08;优化&#xff09; 一、属性描述符是什么&#xff1f; 属性描述符的结构 在…

Transformer中的多头注意力机制-为什么需要多头?

Transformer为什么使用多头注意力机制呢&#xff1f; 多头可以学习到不同维度的特征和信息。为什么可以学习到不同维度的信息呢&#xff1f; 答案是&#xff1a;多头注意力机制的组成是有单个的self attention&#xff0c;由于self attention通过产生QKV矩阵来学习数据特征&a…

字符串入门算法题!

概述 字符串和数组一样算是比较简单的题目&#xff0c;正适合打算法基础&#xff0c;一定要认真对待&#xff01;&#xff01;&#xff01; 字符串类型的算法问题可以分为简单、中等和困难的难度级别&#xff0c;基础类型一些基本的字符串处理问题&#xff0c;如字符串的拼接…

2023加拿大毕业典礼:共赴一场相遇 遥望未来可期

放眼国际金融&#xff0c;启幕璀璨时代。加拿大时间2023年11月14-16日&#xff0c;中国人民大学-加拿大女王大学金融硕士2023届行业高管班及国际班毕业生们携亲友&#xff0c;参加了为期3天的毕业庆祝活动&#xff0c;从加拿大女王大学史密斯商学院的多伦多教学区到女王大学的金…

随手写了个博客多平台发布脚本:Python自动发布文章到Wordpress

​ 引言 作为一名技术博主&#xff0c;提高博客发布效率是我们始终追求的目标。在这篇文章中&#xff0c;我将分享一个基于Python的脚本&#xff0c;能够实现博客多平台发布&#xff0c;具体来说&#xff0c;是自动发布文章到WordPress。通过这个简单而高效的脚本&#xff0c…

考试周刊杂志考试周刊杂志社考试周刊编辑部2023年第46期目录

教育教学研究 丰富作业形式 拓展课堂教学——“双减”下初中英语优化作业设计探析 王慧; 1-5 博学慎思明辨 撬动思维杠杆——论“思辨性阅读与表达”学习任务群范式构建 丁亚琴; 6-10《考试周刊》投稿邮箱&#xff1a;cn7kantougao163.com(注明投稿“《考试周刊》”) 崔…

折线图,样式调整background、serice、xAxis、yxAis等

效果展示&#xff1a; option参数&#xff1a; let option {backgroundColor: "rgba(48, 65, 90, 1)",title: {// text: obj.stnm,// subtext: obj.datasource,textStyle: {color: "#ffffff"},right: 10// left: center,// itemGap: 4},tooltip: {trigge…

JOSEF 综合继电器 HJZZ-32/2 AC220V 合闸延时整定0.02-9.99S

系列型号&#xff1a; HJZZ-91分闸、合闸、电源监视综合装置&#xff1b; HJZZ-92/1分闸、合闸、电源监视综合装置&#xff1b; HJZZ-92/2分闸、合闸、电源监视综合装置&#xff1b; HJZZ-92/2A分闸、合闸、电源监视综合装置&#xff1b; HJZZ-92/3分闸、合闸、电源监视综…

乐鑫推出 ESP ZeroCode ExL 模组

乐鑫推出 ESP ZeroCode ExL 模组&#xff0c;由 AWS IoT ExpressLink 提供支持&#xff0c;可简化用户构建兼容 Matter 的云连接设备。 为简化 Matter 设备的开发&#xff0c;乐鑫在年初发布了 ESP ZeroCode 模组和 ESP ZeroCode 控制台。ESP ZeroCode 模组非常适合一些简单设…

Gin框架如何使用并搭建一个后台管理系统 RBAC 权限管理(六)

一、RBAC 实现流程 1 、实现角色的增、删、改、查 2 、实现用户的增、删、改、查,增加修改用户的时候需要选择角色 3 、实现权限的增、删、改、查 (页面菜单) 4 、实现角色授权功能 5 、判断当前登录的用户是否有访问菜单的权限 6 、根据当前登录账户的角色信息动态显…

如何解决msvcp140.dll丢失问题,分享5个亲测有效的方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp140.dll丢失”。这个错误通常会导致某些应用程序无法正常运行。msvcp140.dll是Microsoft Visual C 2015 Redistributable Package的一部分&#xff0c;它是由Microsoft公司提供的运行…

seata集成springboot的一些错误小计

1 seata依赖没找到 dependencies.dependency.version for com.alibaba.cloud:spring-cloud-starter-alibaba-seata:jar is missing. line 126, column 21错误原因:未指定具体的seata版本 解决 <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-st…