.NET 6新特性
-
namespace不需要用大括号包围,可以直接 namespace name;
-
switch 新用法
int num=0; string res = num switch{ 1=>"现在是1", 2=>"现在是2", 3=>"现在是3", _=>"default" };
一些小贴士
1.方法中参数修饰符 out ref params
// out 参数由被调用的方法赋值,按引用传递
...Func...
Add(1,2,out int res);
Console.Write(res)//此时res已被赋值
...Func...
void Add(int num1,int num2,out int res){
res=num1+num2;//若此时不给res赋值则报错
}
//ref 调用者赋值,且可由被调用的方法 *可选* 重新赋值
...Func...
int res=0;//此时必须赋值
Sub(1,2,ref res);
Console.Write(res)//此时res已被赋值
...Func...
void Sub(int num1,int num2,ref int res){
res=num1-num2;//可以不给res赋值
}
//params 允许将一组可变的数量的参数作为单独的逻辑参数进行传递,只能有一个 params 且必须为参数列表最后一个参数
...Func...
Add(1,2);//参数列表
...Func...
void Add(params int[] nums){
int res=nums[0]+nums[1];
}
out修饰的参数必须在方法内修改,而ref可以修改也可以不修改out在传参时,参数是局部变量的话,可以不用赋值,因为out一定会对其进行赋值;- 而
ref修饰的参数,在实参必须有初始值才能调用,因为ref修饰的不一定会给它赋值
2.属性
属性=字段+方法(代理模式)
属性遵循大驼峰命名
public int Age {get;set;}
3.扩展方法
扩展方法必须在静态类下声明
参数前加this 如 AddJuhao(this string str) 调用 其他类对象.AddJuhao()
多线程
线程创建
new Thread(new ThreadStart(FuncName));//方式1
new Thread(FuncName); //方式2
new Thread(new ParameterizedThredStart(FuncName));//方式3 //可带参数 obj.Start("参数");
thread.Start()//启动线程
thread.Abort()//线程终止
thread.Abort("Thread Abort")// 参数为ExceptionState 供捕获异常使用
加解锁 、互斥量、信号量、原子操作
- 信号量:可以指定数量的线程同时使用
- 互斥量:只能被一个线程使用
- 原子操作
lock(obj){
...
}
//相当于
{
Monitor.Enter(obj);
...
Monitor.Exit(obj);
}
//Mutex 互斥量
private static Mutex mutex =new Mutex();//定义
mutex.waitOne();//等待互斥量授权 也就是等待其他线程 解锁
mutex.ReleaseMutex();//当前线程解锁
//信号量
Semaphore semaphore=new Semaphore(initialCount: 0, maximumCount: 2);//2个位置 初始0
semaphore.Release(releaseCount:2);//释放信号量2个位置
semaphore.waitOne();//信号量申请权限 最多可以有2个线程来使用
//Interlocked 原子操作类
Interlocked.ADD(变量,100);//变量 +100
//AutoResetEvent
volatile 可见性
volatile - C# 参考 | Microsoft Learn
C# Volatile__iorilan的博客-CSDN博客
即在多线程中的每次写操作,内存值被更新;读操作,内存值和当前引用的缓存值一致。
Concurrent命名空间
提供线程安全集合类
async await
async ...{//异步
await ...{ //等待
...
}
}
任务列表List<Task>
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
List<Task> ts=new List<Task>();
ts.Add(Task.Run(() =>
{
Thread.Sleep(3000);
MessageBox.Show("素菜做好了", "友情提示");
}));
ts.Add(Task.Run(() =>
{
Thread.Sleep(1000);
MessageBox.Show("荤菜做好了", "友情提示");
}));
/* //当任务列表所有任务完成之后
Task.WhenAll(ts).ContinueWith(t =>
{
MessageBox.Show("开始吃饭!", "提示");
});*/
//或者使用以下方式
await Task.WhenAll(ts);
MessageBox.Show("开始吃饭!", "提示");
}