当前位置: 首页 > news >正文

C#基础与进阶扩展合集-进阶篇(持续更新)

目录

本文分两篇,基础篇点击:C#基础与进阶扩展合集-基础篇

一、进阶 

1、Predicate

2、设置C#语言版本

3、ListCollectionView过滤集合

4、值类型与引用类型

5、程序设置当前项目工作目录

6、获取App.config配置文件中的值

7、Linq常用语句

8、并行LINQ

9、强引用与弱引用

10、using处理非托管资源

11、模块初始化器

12、序列化

13、并行编程

14、单元测试

 二、进阶扩展

1、Adapt适配器

2、Mutex互斥及防止App多开

3、Monitor设置等待资源时间

4、扩展方法实现解构

5、Span实现切片

6、数组池减少GC工作

7、深度解析await关键字

8、Task 

9、ValueTask

10、async异步编程 

11、CancellationTokenSource 

12、异步方法的异常处理

三、版本新增 

1、范围运算符 

2、字符串格式控制 

3、数字分隔符 

4、小数点前后保留格式 


本文分两篇,基础篇点击:C#基础与进阶扩展合集-基础篇

一、进阶 

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、值类型与引用类型

值类型:变量直接保存其数据,作为类的字段(成员变量)时,跟随其所属的实例存储,也就是存储在堆中;作为方法中的局部变量时,存储在栈上;

引用类型:变量保存其数据的引用(地址)分配在栈中,具体数据(实例)部署在托管堆中;

值类型:结构体(数值类型,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)。等到有代码初始化某个元素的时,这个引用类型元素的存储空间才会被分配在托管堆上;

5、程序设置当前项目工作目录

Directory.SetCurrentDirectory(Path.GetDirectoryName(typeof(Test).Assembly.Location));

Environment.CurrentDirectory=Path.Combine(Directory.GetCurrentDirectory(),"..");

6、获取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;
}

7、Linq常用语句

定义LINQ扩展方法的一个类是System.Linq名称空间中的Enumerable;

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:判断两个集合是否相等;

8、并行LINQ

System.Linq名称空间中包含的类ParallelEnumerable可将查询的工作拆分到多个处理器上同时运行的多个线程中;

通常可使用AsParallel()方法让集合类以并行方式查询,该方法扩展了IEnumerable<TSource>接口,返回ParallelQuery<TSource>类;

示例如下,示例中并行LINQ所用时间约90ms,普通LINQ所用时间约为420ms,可以看出并行LINQ加快了代码运行速度

var list=Enumerable.Range(0, 5000_0000).Select(x => Random.Shared.Next(100)).ToList();
Stopwatch sw = Stopwatch.StartNew();
var avera= list.AsParallel().Where(m=>m<50).Select(m=>m).Average();
sw.Stop();
Stopwatch sw2 = Stopwatch.StartNew();
var avera2= list.Where(m => m < 50).Select(m => m).Average();
sw2.Stop();
Console.WriteLine(sw.Elapsed.TotalMilliseconds);//约90ms
Console.WriteLine(sw2.Elapsed.TotalMilliseconds);//约420ms

9、强引用与弱引用

1、在应用程序中实例化一个类或结构时,只要有代码引用它,就会形成强引用

2、GC不能收集仍在引用的对象的内存,也就是强引用的内存,但它可以收集不在根表中直接或间接引用的托管内存;

3、弱引用允许创建和使用对象,但如果垃圾收集器碰巧运行,就会收集对象并释放内存,弱引用开销比小对象大,用于小对象没有意义;

4、弱引用使用WeakReference类创建的,使用构造函数传递强引用,其Target属性的值若不为null,则该对象仍可使用,若赋值给传递类型对象,则会再次创建该对象的强引用,不能被GC收集(注意:在访问Target时可能被GC收集,所以通常赋值后需对其进行null判断);

            WeakReference weakReference = new WeakReference(new Pig());Pig pig = weakReference.Target as Pig;if (pig != null){//use pig}else{ //reference not available}

10、using处理非托管资源

方式一:声明一个析构函数(或终结器finalizer)作为类的成员;

C#中,析构函数在底层.NET体系结构中为终结器,编译器会隐式的把析构函数编译成等价于重写Finalize()方法的代码,如下:

    protected override void Finalize(){try {//Finalizer implementation}finally {base.Finalize();}}

方式二:实现IDisposable或IAsyncDisposable接口;

C#中,推荐使用该方式替代析构函数,这些接口定义了一种模具(具有语言级的支持),该模式为释放非托管的资源提供了确定的机制,并避免产生析构函数固有的与GC相关的问题;

注意:若处理过程中出现异常则不会释放,通常在finally块中释放,如下:

People people = null;
try
{people = new();//other process
}
finally
{people.Dispose();
}
class People : IDisposable
{public void Dispose(){//implementation}
}

 方式三:using语句和using声明(推荐),实现了对方式二的封装;

用于实现IDisposable接口的对象,当对象的引用超出作用域时,自动调用该对象的Dispose()或DisposeAsync()方法,如下示例,会生成与上面try块等价的IL代码;

using (People people = new())
{ //other process
}

11、模块初始化器

若需要在使用一个库的任何类型之前调用该库的初始化代码,可使用C#的一个新特性,模块初始化器[ModuleInitializer]

在使用该类的任何类型之前,会自动调用该特性标记的初始化方法,该方法必须是静态、无参,返回void,使用public或internal访问修饰符;

    [ModuleInitializer]public static void Initializer(){Console.WriteLine("*******Module Initializer********");}

12、序列化

序列化相关详解:C#-序列化与反序列化(xml、json)

13、并行编程

关于并行编程详解:C#-关于并行编程

14、单元测试

运用NUnit单元测试框架:C#-单元测试NUnit框架的安装及使用


 二、进阶扩展

1、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);

2、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;

3、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);}}elseConsole.WriteLine("Timeout,Run other.....");

4、扩展方法实现解构

了解扩展方法点击:扩展方法定义与使用 

创建Deconstruct()方法(也称解构器),将分离部分放入out参数中,这里使用扩展方法实现解构,示例如下:

Stu stu = new Stu(98, "Auston");
stu.Deconstruct(out int score, out string name);
Console.WriteLine($"{name}:{score}");static class StuExtension
{public static void Deconstruct(this Stu stu, out int score, out string name){score = stu.Score;name = stu.Name;}
}

5、Span<T>实现切片

1、Span<T>,可快速访问托管与非托管的连续内存,如数组、长字符串;

2、可实现对数组部分进行访问或切片,不会复制数组元素,是从span中直接访问的,切片的两种方式①构造函数传递数组的开头与结尾;②Slice方法传递开头索引,提取到数组末尾;

3、可使用Span改变值,除了索引访问更改,还提供方法有:Clear()、填充Fill()、复制CopyTo()(不推荐,目标span不够大会抛异常)、复制推荐TryCopyTo()(span不够大不抛异常,而是返回false);

4、若只需对数组片段进行读访问,可使用ReadOnlySpan<T>;

int[] c = { 1, 3, 5, 8 };
Span<int> span = new Span<int>(c);
Span<int> span1= new Span<int>();
span[1] = 11;
span.Clear();
span.Fill(11);
Span<int> span2 = new Span<int>(c,0,3);
Span<int> span3 = span.Slice(0,3);   //切片
ReadOnlySpan<int> span4 = new(c);   //只读变量
if (!span.TryCopyTo(span3))Console.WriteLine("Argument");

6、数组池减少GC工作

         通过ArrayPool类(名称空间System.Buffers)使用数组池,可减少垃圾收集器的工作,ArrayPool管理一个数组池,数组可以从这租借,并返回池中,内存在ArrayPool中管理。

创建ArrayPool<T>,调用静态Create()方法;

使用预定义共享池,通过访问Shared属性

从池中租用内存,可调用Rent()方法,(池中数组元素数量最低16,且都是成倍增加);

内存(数组)返回到池中,调用Return()方法,可指定返回池之前是否清除该数组(false,下次租用数组的人可读取数据);

ArrayPool<int> arrayPool = ArrayPool<int>.Create(maxArrayLength: 100, maxArraysPerBucket: 10);
int[] arr = ArrayPool<int>.Shared.Rent(10);
arr[15] = 15;
Console.WriteLine($"Len={arr.Length}\tarr[15]={arr[15]}");//输出Len=16    arr[15]=15
ArrayPool<int>.Shared.Return(arr,true);
Console.WriteLine(arr[15]);//输出0

7、深度解析await关键字

await通常与async一同使用来实现异步编程,async没有await搭配使用将毫无意义;

使用Task任务的GetAwaiter()方法,返回一个TaskAwaiter<T>类型对象,该对象的OnCompleted()方法实现了INotifyCompletion接口,在任务完成时调用;

await实际就是编译器把await关键字后的所有代码放进了OnCompleted()方法的代码块中。

        public static void Main(string[] args){TestAsync();Console.ReadLine();}public static async void TestAsync(){var awaiter = MyAsync().GetAwaiter();awaiter.OnCompleted(() =>{Console.WriteLine($"MyAsync ended....");});//await MyAsync();//Console.WriteLine("MyAsync ended.....");}public static async Task<string> MyAsync(){Thread.Sleep(100);Console.WriteLine(nameof(MyAsync));return nameof(MyAsync);}

8、Task 

GetAwaiter()方法,用于await关键字的实现,详细如上;

ContinueWith()方法,用于延续任务;

RunSynchronously()方法同步任务;

WaitAll()静态方法,阻塞调用任务,直到所有任务完成;

WhenAll()静态方法,返回一个任务,从而允许使用async关键字等待结果,因此不会阻塞等待的任务;

WhenAny()静态方法,用于等待任意一个任务结束;

注意:任务不一定使用线程池中的线程,也可以使用其他线程,调用RunSynchronously()任务以同步方式运行,以相同的线程作为主调线程,如示例中的 t4;

开始一个新任务方式有如下几种:

        TaskMethod();Task t1 = Task.Run(TaskMethod);Thread.Sleep(100);Task t2 = Task.Factory.StartNew(TaskMethod);Thread.Sleep(100);Task t3 = new TaskFactory().StartNew(TaskMethod);Thread.Sleep(100);Task t4 = new(TaskMethod);//t4.Start();t4.RunSynchronously();static void TaskMethod(){Console.WriteLine($"Task ID:{Task.CurrentId?.ToString() ?? "no task"}");Console.WriteLine($"thread ID:{Thread.CurrentThread.ManagedThreadId}");Console.WriteLine($"Is background:{Thread.CurrentThread.IsBackground}");Console.WriteLine($"Is pool thread:{Thread.CurrentThread.IsThreadPoolThread}");Console.WriteLine("*****************Auston****************");}

使用泛型类Task<TResult>获取Task结果,示例如下 

        Task<(int result1, int result2)> t4 = new (TaskWithResult,(2,5));t4.Start();Console.WriteLine(t4.Result.Item1+$"\t{t4.Result.Item2}");static (int, int) TaskWithResult(object obj){(int a, int b) = ((int a, int b))obj;return (a * 10, b * 100);}

9、ValueTask

C#7新增可用作await的新类型,ValueTask是一个结构,其在堆上没有对象,相对于Task具有性能上的优势(当不能忽略任务开销的时候可使用);

10、async异步编程 

async、await异步编程详解:C#-异步编程 

11、CancellationTokenSource 

CancellationTokenSource控制Task详解:C#-控制Task结束 

12、异步方法的异常处理

若调用异步方法没有等待,try/catch不会捕获异常,因为在抛出异常前,就已经执行完毕了,若要捕获异常,需await等待异步方法。

        static void PutError(){try{await ThrowExcp();}catch (Exception ex){Console.WriteLine(ex.ToString());}}static async Task ThrowExcp(){ await Task.Delay(1000);throw new Exception("Exception.....");}


三、版本新增 

C#9新增顶级语句;

字符串的范围除SubString方法,C#8新增hat(^)、范围运算符([..]); 

1、范围运算符 

string rangstr ="hello,auston!" ;
Console.WriteLine(rangstr[..5]);//范围运算符
Console.WriteLine(rangstr[7^2]);//hat^运算符,从索引7往前数第2个字符 

2、字符串格式控制 

 DateTime t = DateTime.Now;
Console.WriteLine($"{t:D}");//字符串格式控制

3、数字分隔符 

 int a = 2_2_2;//使用数字分隔符,提高代码可读性(编译器会忽略下划线)
Console.WriteLine($"{a:c}");

4、小数点前后保留格式 

 double d = 22.336_6;
Console.WriteLine($"{d:###.##}");//小数点后四舍五入保留2位
Console.WriteLine($"{d:000.00}");//小数点前保留3位,后保留2位

相关文章:

C#基础与进阶扩展合集-进阶篇(持续更新)

目录 本文分两篇&#xff0c;基础篇点击&#xff1a;C#基础与进阶扩展合集-基础篇 一、进阶 1、Predicate 2、设置C#语言版本 3、ListCollectionView过滤集合 4、值类型与引用类型 5、程序设置当前项目工作目录 6、获取App.config配置文件中的值 7、Linq常用语句 8、…...

快速入门GitHub 之超简单的注册方法和超好用的使用技巧

最近几天发现有些人对Github网站很好奇,但是无奈自己不会用,因为是外国人的网站,首先自己的英文就不过关。对于这个,其实可以用谷歌浏览器去浏览Github,它有一键翻译的功能。但还是有必要介绍一下关于Github的一些功能和具体操作,初学编程语言的小伙伴们一定对 GitHub 有…...

ESP32-Web-Server编程- 在 Web 上开发动态纪念册

ESP32-Web-Server编程- 在 Web 上开发动态纪念册 概述 Web 有很多有趣的玩法&#xff0c;在打开网页的同时送她一个惊喜。 需求及功能解析 本节演示在 ESP32 上部署一个 Web&#xff0c;当打开对应的网页时&#xff0c;将运行动态的网页内容&#xff0c;显示炫酷的纪念贺词…...

双向ESD保护 汽车级TVS二极管 ESD9B3.3ST5G工作原理、特性参数、封装形式

什么是汽车级TVS二极管&#xff1f; TVS二极管是一种用于保护电子电路的电子元件。它主要用于电路中的过电压保护&#xff0c;防止电压过高而损坏其他部件。TVS二极管通常被称为“汽车级”是因为它们能够满足汽车电子系统的特殊要求。 在汽车电子系统中&#xff0c;由于车辆启…...

Ribbon-IRule 修改负载均衡的规则

1、负载均衡规则描述 &#xff08;1&#xff09;整体关系 &#xff08;2&#xff09;规则描述 内置负载均衡规则类规则描述RoundRobinRule简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。AvailabilityFilteringRule对以下两种服务器进行忽略: (1)在默认情况下&…...

双十二电视盒子哪个牌子最好?自费3000+测评整理电视盒子推荐

双十二不知道电视盒子哪个牌子最好的新手很多&#xff0c;想要我分享电视盒子推荐&#xff0c;为结果更客观我花费三千多购入了十几款热销电视盒子&#xff0c;通过一个月时间的全面对比测评后整理了电视盒子推荐&#xff0c;给双十二不知道怎么选电视盒子的朋友们提供参考。 一…...

排序:直接选择排序

直接选择排序&#xff1a; 本质&#xff1a; 直接选择排序的本质就是在数组中进行遍历挑选出最大的元素&#xff0c;讲最大的元素放到对应的位置后&#xff0c;再次选出次大的位置&#xff0c;而后又放到对应的位置..........................直到数组成为一个有序序列。 优…...

Nacos多数据源插件

Nacos从2.2.0版本开始,可通过SPI机制注入多数据源实现插件,并在引入对应数据源实现后,便可在Nacos启动时通过读取application.properties配置文件中spring.datasource.platform配置项选择加载对应多数据源插件.本文档详细介绍一个多数据源插件如何实现以及如何使其生效。 注意:…...

【Java基础篇 | 面向对象】—— 聊聊什么是接口(上篇)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 关于接口的简单的介绍…...

golang实现函数yamlToStruct(infile,outFile)

问&#xff1a; golang实现函数yamlToStruct(infile,outFile),将yaml文件格式化成golang的结构体 gpt: 要实现一个将YAML文件格式化成Golang结构体的函数&#xff0c;你可以使用 yaml 和 reflect 包来处理。首先&#xff0c;你需要使用 yaml.Unmarshal 函数将YAML文件解析为一…...

产品成本收集器流程演示

感谢大佬的文章&#xff0c;我只是一个翻译搬运工&#xff0c;原文地址&#xff1a;产品成本收集器 概述 SAP 令人兴奋的部分之一是它在不同操作模块之间的集成程度。使用产品成本收集器来跟踪生产就是一个很好的例子。在本博客中&#xff0c;我计划遵循产品成本收集器流程&a…...

【微服务】springboot整合quartz使用详解

目录 一、前言 二、quartz介绍 2.1 quartz概述 2.2 quartz优缺点 2.3 quartz核心概念 2.3.1 Scheduler 2.3.2 Trigger 2.3.3 Job 2.3.4 JobDetail 2.4 Quartz作业存储类型 2.5 适用场景 三、Cron表达式 3.1 Cron表达式语法 3.2 Cron表达式各元素说明 3.3 Cron表达…...

Electron+Ts+Vue+Vite桌面应用系列:TypeScript常用时间处理工具

文章目录 1️⃣ 时间处理工具1.1 格式化时间1.2 把时间戳改成日期格式1.3 Day.js 工具类使用1.4 date-fns 工具类使用 优质资源分享 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/134712978 ElectronTsVueVite桌面应用…...

记录 | centos源码编译bazel

tensorflow的源码编译依赖于 bazel 这里进行 bazel 的源码编译 1、安装依赖 sudo yum install -y java-11-openjdk sudo yum install -y java-11-openjdk-devel sudo yum install -y protobuf-compiler zip unzip2、知悉要安装的 bazel 的版本 务必安装受支持的 Bazel 版本…...

常见的Bean工厂后置处理器

此代码在jdk11上测试通过&#xff0c;SpringBoot版本为2.7.14 1.上代码 导入坐标 <dependencies><!-- spring数据坐标 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-rest</art…...

代码随想录算法训练营第四十二天| 416 分割等和子集

目录 416 分割等和子集 416 分割等和子集 class Solution { public:const int N 210;bool canPartition(vector<int>& nums) {vector<int>f(N);int sum 0;for(auto num : nums)sum num;if(sum % 2 1)return false;//如果int target sum / 2;for(int i …...

memmove 和 memcpy的区别

函数原型及作用 memcpy 和 memmove 都是C语言中的库函数&#xff0c;在头文件string.h中&#xff0c;作用是拷贝一定长度的内存的内容&#xff0c;原型分别如下&#xff1a; void* memcpy(void *dst, const void *src, size_t count); void* memmove(void *dst, const void *…...

C实现的双向链表队列

如下代码所示&#xff0c;一个头文件实现的双向链表&#xff0c;用c代码实现&#xff1a; #ifndef _LINUX_LIST_H #define _LINUX_LIST_H#include "stddef.h" #include "poison.h"#ifndef ARCH_HAS_PREFETCH #define ARCH_HAS_PREFETCH static inline voi…...

自适应中值滤波器的python代码实现-----冈萨雷斯数字图像处理

基本原理&#xff1a; 自适应中值滤波器是一种图像处理技术&#xff0c;用于去除图像中的噪声。其原理是根据像素周围邻域内像素值的特性&#xff0c;动态地选择滤波器的大小和中值滤波的程度。 **邻域选择&#xff1a;**对于每个像素点&#xff0c;选取一个窗口或者邻域&…...

Python作业答疑_6.22~6.25

一、Python 一班 1. 基数分割列表 1.1 问题描述 给定一无序数列&#xff0c;把数列的第一个数字当成基数&#xff0c;让数列中基数小的数字排在数列前面&#xff0c;比基数大的数字排在数列的后面。 1.2 问题示例 如数列&#xff1a;num[4,1,8,3,9,2,10,7]。基数为 4&…...

Uber Go 语言编码规范

uber-go/guide 的中文翻译 English 文档链接 Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司&#xff0c;也是 Go 语言的早期 adopter。其开源了很多 golang 项目&#xff0c;诸如被 Gopher 圈熟知的 zap、jaeger 等。2018 年年末 Uber 将内部的 Go 风格规范 开源到 G…...

UniRepLKNet:用于音频、视频、点云、时间序列和图像识别的通用感知大内核ConvNet

摘要 https://arxiv.org/abs/2311.15599 大核卷积神经网络(ConvNets)最近受到了广泛的研究关注,但存在两个未解决的关键问题需要进一步研究。(1)现有大核ConvNets的架构在很大程度上遵循传统ConvNets或Transformers的设计原则,而大核ConvNets的架构设计仍未得到充分解决。(2…...

Http协议与Tomcat

HTTP协议 HTTP协议&#xff08;HyperText Transfer Protocol&#xff09;即超文本传输协议 &#xff0c;是TCP/IC网络体系结构应用层的一个客户端-服务端协议&#xff0c;是所有客户端&#xff0c;服务端数据传输的基石&#xff08;数据传输规则&#xff09; 特点 ⭐基于TCP协…...

Spring AOP从入门到精通

目录 1. AOP的演化过程 1. 代理模式 2. 动态代理 2.1 JDK动态代理 2.2 Cglib动态代理 3. Spring模式 3.1 ProxyFactory 3.2 ProxyFactoryBean 3.3 AbstractAutoProxyCreator 2. Spring AOP抽象 1. 核心术语 1.1 连接点(JoinPoint) 1.2 切点(Pointcut) 1.3 增强(Ad…...

Tap虚拟网卡

1 概述 Tap设备通常用于虚拟化场景下&#xff0c;其驱动代码位于drivers/net/tun.c&#xff0c;tap与tun复用大部分代码&#xff0c; 注&#xff1a;drivers/net/tap.c并不是tap设备的代码&#xff0c;而是macvtap和ipvtap&#xff1b; 下文中&#xff0c;我们统一称tap&#…...

【数电笔记】53-与非门构成的基本RS触发器

目录 说明&#xff1a; 1. 电路组成 2. 逻辑功能 3. 特性表 4. 特性方程 5. 状态转换图 6. 驱动表 7. 例题 例1 例2 说明&#xff1a; 笔记配套视频来源&#xff1a;B站&#xff1b;本系列笔记并未记录所有章节&#xff0c;只对个人认为重要章节做了笔记&#xff1b…...

kubernetes(k8s)容器内无法连接同所绑定的Service ClusterIP问题记录

kubernetes(k8s)容器内无法连接同所绑定的Service ClusterIP问题记录 1. k8s环境 k8s使用kubernetes-server-linux-amd64_1.19.10.tar.gz 二进制bin 的方式手动部署 k8s 版本: [rootmaster ~]# kubectl version Client Version: version.Info{Major:"1", Minor:&…...

Hadoop入门学习笔记

视频课程地址&#xff1a;https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接&#xff1a;https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 这里写目录标题 一、VMware准备Linux虚拟机1.1. VMware安装Linux虚拟机1.1.1. 修改虚拟机子网IP和网关1.1.2. 安装…...

堆栈,BSS,DATA,TEXT

一、目标文件 首先目标文件的构成&#xff0c;Linux下就是.o 文件 编译器编译源码后生成的文件叫目标文件&#xff08;Object File&#xff09;。 目标文件和可执行文件一般采用同一种格式&#xff0c;这种存储格式为 ELF。 目前文件的内容至少有编译后的机器指令代码和数据&a…...

Java八股文面试全套真题【含答案】-JSON篇

什么是JSON&#xff1f; 答案&#xff1a;JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;基于JavaScript的对象字面量表示法&#xff0c;用于在不同语言和平台之间传输数据。JSON的数据结构是怎样的&#xff1f; 答案&#xf…...

数据库管理-第119期 记一次迁移和性能优化(202301130)

数据库管理-第119期 记一次迁移和性能优化&#xff08;202301130&#xff09; 1 迁移 之前因为DV组件没有迁移成功的那个PDB&#xff0c;后来想着在目标端安装DV组件迁移&#xff0c;结果目标端装不上&#xff0c;而且开了SR也没看出个所以然来。只能换一个方向&#xff0c;尝…...

【云原生-K8s】镜像漏洞安全扫描工具Trivy部署及使用

基础介绍基础描述Trivy特点 部署在线下载百度网盘下载安装 使用扫描nginx镜像扫描结果解析json格式输出 总结 基础介绍 基础描述 Trivy是一个开源的容器镜像漏洞扫描器&#xff0c;可以扫描常见的操作系统和应用程序依赖项的漏洞。它可以与Docker和Kubernetes集成&#xff0c;…...

【Docker】Swarm的ingress网络

Docker Swarm Ingress网络是Docker集群中的一种网络模式&#xff0c;它允许在Swarm集群中运行的服务通过一个公共的入口点进行访问。Ingress网络将外部流量路由到Swarm集群中的适当服务&#xff0c;并提供负载均衡和服务发现功能。 在Docker Swarm中&#xff0c;Ingress网络使…...

gcc安全特性之FORTIFY_SOURCE

GCC 4.0引入了FORTIFY_SOURCE特性&#xff0c;旨在加强程序的安全性&#xff0c;特别是对于字符串和内存操作函数的使用。下面是对FORTIFY_SOURCE机制的深入分析&#xff1a; 1. 功能 FORTIFY_SOURCE旨在检测和防止缓冲区溢出&#xff0c;格式化字符串漏洞以及其他与内存操作…...

【JUC】二十、volatile变量的特点与使用场景

文章目录 1、volatile可见性案例2、线程工作内存与主内存之间的原子操作3、volatile变量不具有原子性案例4、无原子性的原因分析&#xff1a;i5、volatile变量小总结6、重排序7、volatile变量禁重排的案例8、日常使用场景9、总结 volatile变量的特点&#xff1a; 可见性禁重排无…...

软件工程期末复习(2)

学习资料 设计模式与软件体系结构【期末全整理答案】_软件设计模式与体系结构期末考试题_鸽子不二的博客-CSDN博客 软件设计与体系结构(第二版)部分习题_软件设计与体系结构第二版课后答案-CSDN博客 软件体系结构试题库试题和答案 - 豆丁网Docin 软件设计与体系结构复习 - CN…...

[vue3] 使用 vite 创建vue3项目的详细流程

一、vite介绍 Vite&#xff08;法语意为 “快速的”&#xff0c;发音 /vit/&#xff0c;发音同 “veet”) 是一种新型前端构建工具&#xff0c;能够显著提升前端开发体验&#xff08;热更新、打包构建速度更快&#xff09;。 二、使用vite构建项目 【学习指南】学习新技能最…...

#HarmonyOS:软件安装window和mac预览Hello World

Window软件地址 https://developer.harmonyos.com/cn/develop/deveco-studio#download 安装的建议 这个界面这样选&#xff0c;其他界面全部按照默认路径往下走&#xff01;&#xff01;&#xff01; 等待安装… 安装环境错误处理 一般就是本地node配置异常导致&#xff…...

nginx 一键切换停机维护页面 —— 筑梦之路

背景说明 进行停机维护或者系统升级等操作&#xff0c;会影响到用户使用&#xff0c;如果停机维护期间用户未看到停机维护的通知&#xff0c;仍去访问系统&#xff0c;会提示默认不太友好的访问错误界面 &#xff0c;这时如果在维护的时候直接展示停机公告的具体信息&#xff0…...

Python作业答疑

1. 旋转字符串 1.1 问题描述 给定一个字符串&#xff08;以字符数组的形式&#xff09;和一个偏移量&#xff0c;根据偏移量原地从左向右旋转字符串。 1.2 问题示例 输入str"abcdefg"&#xff0c;offset3&#xff0c;输出"efgabcd"。 输入str"ab…...

计算机网络实用工具之Hydra

简介 Hydra 是一个并行登录破解程序&#xff0c;支持多种协议进行攻击。它非常快速且灵活&#xff0c;并且很容易添加新模块。 该工具使研究人员和安全顾问能够展示远程未经授权访问系统是多么容易。 目前该工具支持以下协议&#xff1a; Asterisk, AFP, Cisco AAA, Cisco au…...

AUTOSAR 入门

前言 AUTOSAR是什么Vector DaVinci 工具功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个注脚注释也是必…...

新版IDEA中,module模块无法被识别,类全部变成咖啡杯无法被识

新版IDEA中&#xff0c;module模块无法被识别&#xff0c;类全部变成咖啡杯无法被识 如下图&#xff1a; 解决方法&#xff1a;java的Directory文件没有被设置为根目录&#xff0c;解决方法如下&#xff1a; 这是方法之一&#xff0c;还有很多的原因 可能的原因&#xff1a; …...

vue.js el-table 动态单元格列合并

一、业务需求&#xff1a; 一个展示列表&#xff0c;表格中有一部分列是根据后端接口动态展示&#xff0c;对于不同类型的数据展示效果不一样。如果接口返回数据是’类型1‘的&#xff0c;则正常展示&#xff0c;如果是’类型2‘的数据&#xff0c;则合并当前数据的动态表格。…...

word模板导出word文件

前期准备工作word模板 右键字段如果无编辑域 ctrlF9 一下&#xff0c;然后再右键 wps 直接 ctrlF9 会变成编辑域 pom.xml所需依赖 <dependencies> <!--word 依赖--> <dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId…...

debianubuntu的nvidia驱动升级

背景 给出的机器的驱动版本不符合要求&#xff0c;使用自定义的驱动版本。 前置 如果使用nvidia官方的.run安装的驱动包&#xff0c;可以使用系统自带的nvidia-uninstall命令卸载比较方便&#xff0c;不建议使用apt pruge nvidia-*命令删除。会带来其他的问题。 卸载完成之…...

【开源视频联动物联网平台】视频接入网关的用法

视频接入网关是一种功能强大的视频网关设备&#xff0c;能够解决各种视频接入、视频输出、视频转码和视频融合等问题。它可以在应急指挥、智慧融合等项目中发挥重要作用&#xff0c;与各种系统进行对接&#xff0c;解决视频能力跨系统集成的难题。 很多视频接入网关在接入协议…...

【bug排查解决】现象级延迟8-10s

业务背景 最近公司在做物联网相关的项目&#xff0c;调试过程中发现好玩的bug。 首先一个数据采集场景&#xff0c;plc采集数据全链路&#xff1a; kepServer&#xff08;kepserver IOT gateway&#xff09; -> emqx &#xff08;查看日志&#xff09;-> iot服务 -> 业…...

【人生感悟】不能对一个人太好是有心理学原理的

1、不能对一个人太好是有心理学原理的&#xff0c;当你长期友善对待一个人时&#xff0c;如果这个人认知程度不是很高&#xff0c;层次稍微的偏低&#xff0c;那他可能直接把你的友善理解为理所应当&#xff0c;甚至是你在讨好他&#xff0c;还会把你们之间的关系理解成他是高于…...

动态规划学习——最长回文子序列,让字符串变成回文串的最小插入次数

一&#xff0c;最长回文串 1.题目 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例 1&#xff1a; 输入&…...