10-C#

YoloV10 训练自己的数据集(推理,转化,C#部署) yolov10和yolov8的文件结构差不多 所以如果你训练过其他的yolov5以上的yolo,你可以直接拷贝环境进行使用,当然你如果想配置gpu。然后再设置各项参数 你可以再其中自己定义一个文件 里面写上你需要的类 比如置信度,类别 以及类别数量等等。为后续的dll生成做准备。下载anaconda 并安装 在网上随意下载一个2022版本的就行。创建一个名为yolo的cs文件用于 将yolov10模型结构做引用。下方网站中下载你需要的版本下载时要注意对应关系,我们需要设定yolov10的模型结构。 阅读详情

C#.Net-多线程-进阶篇-学习笔记

一、Parallel 并行编程

1.1 Parallel.Invoke

基本用法

// 一次执行多个委托
Parallel.Invoke(
    () => { DoWork1(); },
    () => { DoWork2(); },
    () => { DoWork3(); }
);

特点

  • 可以传入多个委托
  • 会开启线程执行(可能是新线程,也可能是主线程参与)
  • 会阻塞主线程,相当于主线程等待所有子线程执行结束

限制线程数量

ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = 3; // 最多开启3个线程

Parallel.Invoke(options,
    () => { DoWork1(); },
    () => { DoWork2(); },
    () => { DoWork3(); },
    () => { DoWork4(); },
    () => { DoWork5(); }
);

不阻塞界面的方式

Task.Run(() =>
{
    Parallel.Invoke(
        () => { DoWork1(); },
        () => { DoWork2(); },
        () => { DoWork3(); }
    );
});

1.2 Parallel.For

基本用法

// 100个任务,限制3个线程执行
ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = 3;

Parallel.For(0, 100, options, index =>
{
    Console.WriteLine($"index: {index}, 线程ID: {Thread.CurrentThread.ManagedThreadId:00}");
    DoWork(index);
});

核心价值

  • 控制线程数量,避免线程泛滥
  • 100个任务不会开启100个线程
  • 3个线程平摊100个任务
  • 既提高性能,又不过度消耗资源

1.3 Parallel.ForEach

基本用法

List<int> dataList = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = 3; // 3个线程处理10个任务

Parallel.ForEach(dataList, options, item =>
{
    Console.WriteLine($"处理: {item}, 线程ID: {Thread.CurrentThread.ManagedThreadId:00}");
    ProcessData(item);
});

应用场景

  • 批量数据处理
  • 文件批量操作
  • 大量计算任务

1.4 Parallel总结

优点

  • 基于Task的封装,使用简单
  • 自动控制线程数量
  • 避免线程过多导致资源浪费

使用建议

  • 有大量独立任务时使用
  • 需要控制并发数量时使用
  • 任务之间无依赖关系时使用

二、多线程异常处理

2.1 异常捕获问题

普通try-catch无法捕获多线程异常

try
{
    Task task = Task.Run(() =>
    {
        int i = 0;
        int j = 10;
        int k = j / i; // 除以0异常
    });
    // 异常被吞掉,捕获不到
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message); // 不会执行
}

2.2 正确的异常捕获

方法1:使用Wait等待

try
{
    Task task = Task.Run(() =>
    {
        int i = 0;
        int j = 10;
        int k = j / i;
    });
    
    task.Wait(); // 必须等待,才能捕获异常
}
catch (AggregateException aex) // 多线程异常类型
{
    Console.WriteLine(aex.Message);
    foreach (var innerEx in aex.InnerExceptions)
    {
        Console.WriteLine(innerEx.Message);
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

方法2:多个任务的异常处理

try
{
    List<Task> tasks = new List<Task>();
    
    for (int i = 0; i < 20; i++)
    {
        string keyword = $"Task_{i}";
        tasks.Add(Task.Run(() =>
        {
            Thread.Sleep(new Random().Next(50, 100));
            
            if (keyword == "Task_6")
                throw new Exception("Task_6异常");
            if (keyword == "Task_9")
                throw new Exception("Task_9异常");
            if (keyword == "Task_12")
                throw new Exception("Task_12异常");
        }));
    }
    
    Task.WaitAll(tasks.ToArray());
}
catch (AggregateException aex)
{
    // 遍历所有内部异常
    foreach (var exception in aex.InnerExceptions)
    {
        Console.WriteLine(exception.Message);
    }
}

2.3 异常类型优先级

catch (AggregateException aex) // 具体异常类型,优先匹配
{
    // 处理多线程异常
}
catch (Exception ex) // 抽象异常类型,其次匹配
{
    // 处理其他异常
}

三、线程取消(CancellationToken)

3.1 线程取消原理

核心概念

  • 线程无法从外部取消,只能自己取消自己
  • 线程取消本质是向外抛出异常
  • 使用CancellationTokenSource统一管理

3.2 标准的线程取消

基本用法

CancellationTokenSource cts = new CancellationTokenSource();

// cts.IsCancellationRequested 默认为 false
// cts.Cancel() 执行后,变为 true(只能从false变true,不可逆)

Task task = Task.Run(() =>
{
    // 检查是否取消
    if (cts.IsCancellationRequested)
    {
        Console.WriteLine("任务被取消");
        return;
    }
    
    // 或者直接抛出异常
    cts.Token.ThrowIfCancellationRequested();
    
    // 执行任务
    DoWork();
    
}, cts.Token);

// 取消任务
cts.Cancel();

3.3 实际应用场景

场景:多个任务,一个失败全部取消

try
{
    List<Task> tasks = new List<Task>();
    CancellationTokenSource cts = new CancellationTokenSource();
    
    for (int i = 0; i < 100; i++)
    {
        string keyword = $"Task_{i}";
        tasks.Add(Task.Run(() =>
        {
            Thread.Sleep(new Random().Next(10, 300));
            
            // 任务开始前检查
            cts.Token.ThrowIfCancellationRequested();
            
            try
            {
                if (keyword == "Task_6")
                {
                    throw new Exception("Task_6异常");
                }
                
                // 执行任务
                DoWork();
            }
            catch (Exception)
            {
                cts.Cancel(); // 发生异常,取消所有任务
                throw;
            }
            
            // 任务结束前检查
            cts.Token.ThrowIfCancellationRequested();
            
        }, cts.Token)); // 传入Token,未开始的任务不再开启
    }
    
    Task.WaitAll(tasks.ToArray());
}
catch (AggregateException aex)
{
    foreach (var exception in aex.InnerExceptions)
    {
        Console.WriteLine(exception.Message);
    }
}

3.4 线程取消的三种情况

  • 已经结束的线程:无法取消(管不住)
  • 正在执行的线程:可以取消,抛出异常结束
  • 还未开始的线程:不再开启,直接跳过

四、线程安全

4.1 什么是线程安全

定义

  • 一段业务逻辑,单线程执行和多线程执行的结果完全一致,就是线程安全
  • 否则就是线程不安全

线程不安全示例

List<int> list = new List<int>();

// 单线程:结果是10000
for (int i = 0; i < 10000; i++)
{
    list.Add(i);
}
Console.WriteLine(list.Count); // 10000

// 多线程:结果不确定
List<int> list2 = new List<int>();
for (int i = 0; i < 10000; i++)
{
    Task.Run(() =>
    {
        list2.Add(i);
    });
}
Thread.Sleep(5000);
Console.WriteLine(list2.Count); // 可能是9937、9976、9982等

4.2 解决线程安全的方法

方法1:加锁(不推荐)

private readonly static object lockObj = new object();

List<int> list = new List<int>();
for (int i = 0; i < 10000; i++)
{
    Task.Run(() =>
    {
        lock (lockObj) // 加锁,独占资源
        {
            list.Add(i);
        }
    });
}

注意事项

  • 锁对象定义:private readonly static object lockObj = new object();
  • 不要锁String类型
  • 不要锁this
  • 加锁会影响性能,相当于反多线程

方法2:分块/分区执行(推荐)

List<int> list1 = new List<int>();
List<int> list2 = new List<int>();
List<int> list3 = new List<int>();

int total = 10000;
int part1 = 3000;
int part2 = 6000;
int part3 = 10000;

List<Task> tasks = new List<Task>();

// 分三块,每块单线程执行(线程安全)
tasks.Add(Task.Run(() =>
{
    for (int i = 0; i < part1; i++)
    {
        list1.Add(i);
    }
}));

tasks.Add(Task.Run(() =>
{
    for (int i = part1; i < part2; i++)
    {
        list2.Add(i);
    }
}));

tasks.Add(Task.Run(() =>
{
    for (int i = part2; i < part3; i++)
    {
        list3.Add(i);
    }
}));

Task.WaitAll(tasks.ToArray());

// 单线程汇总
list1.AddRange(list2);
list1.AddRange(list3);
Console.WriteLine(list1.Count); // 10000

方法3:使用线程安全集合(推荐)

// 线程安全的集合类型
BlockingCollection<int> blockingList = new BlockingCollection<int>();
ConcurrentBag<int> concurrentBag = new ConcurrentBag<int>();
ConcurrentDictionary<string, int> concurrentDict = new ConcurrentDictionary<string, int>();
ConcurrentQueue<int> concurrentQueue = new ConcurrentQueue<int>();
ConcurrentStack<int> concurrentStack = new ConcurrentStack<int>();

// 使用示例
ConcurrentBag<int> bag = new ConcurrentBag<int>();
for (int i = 0; i < 10000; i++)
{
    Task.Run(() =>
    {
        bag.Add(i); // 线程安全,无需加锁
    });
}
Thread.Sleep(5000);
Console.WriteLine(bag.Count); // 10000

4.3 线程安全总结

方法优点缺点推荐度
加锁简单直接性能差,本质上是把多线程退化成串行⭐
分块执行性能好,设计优雅需要设计分区逻辑⭐⭐⭐⭐⭐
线程安全集合简单,性能好需要替换数据结构⭐⭐⭐⭐⭐

⚠️ 加锁虽然能解决问题,但锁的范围内代码实际上是串行执行的,等于抵消了多线程的并发优势,只在没有更好方案时才考虑。

五、中间变量问题

5.1 问题现象

// 错误示例:所有线程输出的i都是5
for (int i = 0; i < 5; i++)
{
    Task.Run(() =>
    {
        Console.WriteLine($"i = {i}"); // 输出:5, 5, 5, 5, 5
    });
}

5.2 问题原因

  1. Task开启线程有延迟(虽然很短)
  2. 开启多线程不会阻塞主线程
  3. 循环很快,当线程真正执行时,循环已结束
  4. 此时i已经变成5

5.3 解决方案

// 正确示例:使用中间变量
for (int i = 0; i < 5; i++)
{
    int k = i; // 每次循环创建新的变量
    Task.Run(() =>
    {
        Console.WriteLine($"i = {i}, k = {k}"); 
        // i输出5,k输出0,1,2,3,4
    });
}

原理

  • 每次循环创建新的变量k
  • 每个线程使用的是各自循环内的k
  • k的值在创建时就已确定

六、实战案例:双色球开奖系统

6.1 需求分析

规则

  • 6个红球(01-33,不重复)
  • 1个蓝球(01-16)
  • 点击开始,所有球同时跳动变化
  • 点击停止,显示最终结果

技术要点

  • 7个球 = 7个线程
  • 每个线程独立运行,相互不影响
  • 红球需要去重
  • 避免死锁

6.2 核心代码

private bool isRunning = true;
private List<Task> taskList = new List<Task>();
private static object lockObj = new object();

private void btnStart_Click(object sender, EventArgs e)
{
    isRunning = true;
    taskList.Clear();
    
    // 遍历所有Label控件
    foreach (var control in gboSSQ.Controls)
    {
        if (control is Label label)
        {
            taskList.Add(Task.Run(() =>
            {
                if (label.Name.Contains("Blue")) // 蓝球
                {
                    while (isRunning)
                    {
                        int index = new RandomHelper().GetRandomNumberDelay(0, 16);
                        string num = blueNums[index];
                        
                        this.Invoke(new Action(() =>
                        {
                            label.Text = num;
                        }));
                    }
                }
                else // 红球
                {
                    while (isRunning)
                    {
                        int index = new RandomHelper().GetRandomNumberDelay(0, 33);
                        string num = redNums[index];
                        
                        lock (lockObj)
                        {
                            var currentNums = GetCurrentRedNumbers();
                            if (!currentNums.Contains(num))
                            {
                                this.Invoke(new Action(() =>
                                {
                                    label.Text = num;
                                }));
                            }
                        }
                    }
                }
            }));
        }
    }
    
    // 所有任务完成后的回调
    Task.Factory.ContinueWhenAll(taskList.ToArray(), tasks =>
    {
        this.Invoke(new Action(() =>
        {
            ShowResult();
            isRunning = true;
        }));
    });
}

private void btnStop_Click(object sender, EventArgs e)
{
    isRunning = false;
    // 不能在这里Wait,会死锁
    // Task.WaitAll(taskList.ToArray()); // 死锁!
}

6.3 关键技术点

1. 随机数去重

public class RandomHelper
{
    public int GetRandomNumber(int min, int max)
    {
        Guid guid = Guid.NewGuid();
        int seed = DateTime.Now.Millisecond;
        
        // 使用GUID增加随机性
        foreach (char c in guid.ToString())
        {
            seed += GetSeedIncrement(c);
        }
        
        Random random = new Random(seed);
        return random.Next(min, max);
    }
}

2. 跨线程更新UI

// 子线程不能直接操作UI,需要委托给主线程
this.Invoke(new Action(() =>
{
    label.Text = num;
}));

3. 避免死锁

// 错误:主线程等待子线程,子线程需要主线程更新UI
Task.WaitAll(taskList.ToArray()); // 死锁!

// 正确:使用回调
Task.Factory.ContinueWhenAll(taskList.ToArray(), tasks =>
{
    // 不阻塞主线程
});

七、小结

  • Parallel:控制线程数量,避免泛滥
  • 异常处理:使用 AggregateException,必须 Wait 才能捕获
  • 线程取消:CancellationTokenSource 统一管理
  • 线程安全:优先使用分块或线程安全集合,加锁是最后手段
  • 中间变量:循环中开启线程时,必须用临时变量捕获循环值
  • 死锁:避免主线程和子线程相互等待
如何在.NetFramework下使用c#10.0 C# 10.0 提供了很多高级语法糖和很多方便的特性,例如new(), global using, record等。但是.netFrameWork 只支持到C# 7, 对于做工控,需要调用.netFrameWork非托管代码,无法脱离.netFrameWork的小伙伴们很不友好。今天介绍一下如何在.netFrameWork下使用C# 10.0。可以在某个类中加入以下代码,就完美支持了。第二步,看到了xml配置文件,加入。 阅读详情

相关推荐

Windows 10端口转发的C#实现

在网络编程中,TCP(传输控制协议)和UDP(用户数据报协议)是最常用的两种协议。TCP是面向连接的协议,提供可靠的、有序的、错误检测和纠正的数据传输服务。TCP协议保证数据包按照发送的顺序被接收,且在传输过程中数据不丢失、不重复。UDP是无连接的协议,提供尽最大努力交付,不需要建立连接,从而降低了开销。UDP不保证数据的可靠性,不保证数据包的顺序,也不提供错误检测和纠正。在端口转发中,我们可根据应用需要选择使用TCP或UDP协议。

weixin_42522857的博客 834

[C#]使用C#部署yolov10的目标检测tensorrt模型

注意源码提供上面对应环境的dll,只需要安装上面一样cuda+cudnn和tensorrt版本即可正常运行。如果您不安装一样版本不能正常运行。此时需要重新编译TensorRtExtern.dll,此外由于tensorrt依赖硬件不一样电脑可能无法共用tensorrt模型,所以必须要重新转换onnx模型到engine才可以运行。tensorrt依赖不同硬件需要自己从onnx转换tensorrt,转换就是调用api实现,流程如下。最后将转换好的tenorrt模型使用C#源码即可。【演示源码下载地址】

FL1623863129的博客 1799

TSMaster如何用珠海创芯CAN卡实现高效CAN通信(附完整驱动安装指南)

本文详细介绍了如何使用TSMaster软件与珠海创芯CAN卡实现高效CAN通信,包括驱动安装、系统配置、ControlCAN.dll替换及TSMaster集成配置等关键步骤。通过实战指南和故障排除技巧,帮助工程师快速搭建稳定可靠的CAN通信测试环境,适用于汽车电子和工业控制等领域。

weixin_29201859的博客 479

C# Onnx Yolov10 Detect

C# Onnx Yolov10 Detect

.NET 人工智能实践 1376

2021年软件测试面试题大全

简述测试流程: 1、阅读相关技术文档(如产品PRD、UI设计、产品流程图等)。 2、参加需求评审会议。 3、根据最终确定的需求文档编写测试计划。 4、编写测试用例(等价类划分法、边界值分析法等)。 5、用例评审(主要参与人员:开发、测试、产品、测试leader)。 6、开发提交代码至SVN或者GIT ,配管搭建测试环境。 7、执行测试用例,记录发现的问题。 8、验证bug与回归测试。 9、编写测试报告。 10、产品上线。 补充测试用例设计过程: 根据需求得出测试需求 设计测试方

hard_days的博客 20万+

TouchSocket TcpService:构建高性能Tcp服务的终极利器

/ 接收到的数据data");// 回复客户端await ((ITcpSessionClient)client).SendAsync("服务端已收到消息!");// 继续执行后续插件TouchSocket的TCPService以极简的API、强大的扩展性和卓越的性能,重新定义了.NET TCP服务的开发体验。无论是物联网平台还是金融级实时通信系统,TCPService均能提供可靠的基础设施支持。立即探索示例项目,开启你的高性能服务开发之旅!扩展阅读如何实现WebSocket服务?

若汝棋茗 的博客 1461

C# 10新增功能_C# 10新增特性

C# 10新增功能_C# 10新增特性_语法方面的变更 一、C# 10 向 C# 语言添加了以下功能和增强功能: 记录结构 结构类型的改进 内插字符串处理程序 指令 文件范围的命名空间声明 扩展属性模式 对 Lambda 表达式的改进 可使用 内插字符串 记录类型可密封 改进型明确赋值 在同一析构中可同时进行赋值和声明 可在方法上使用 属性 CallerArgumentExpression 属性 增强的 pragma 更多详细点击参考: C# 10 中的新增功能 - C# 指南 | Microsof

天马3798 1033

Calibre LVS错误排查实战:从Innovus到GDS的完整调试流程(附常见错误解析)

本文详细介绍了数字IC后端设计中,从Innovus工具输出数据到Calibre LVS物理验证的完整调试流程。文章系统性地讲解了LVS错误排查的方法论,包括报告解读、图形化定位以及针对器件不匹配、电源网络错误、短路开路等常见问题的深度解析与解决方案,旨在帮助工程师高效完成版图与原理图的一致性检查。

weixin_29218963的博客 775

C# 二十年语法变迁之 C# 10参考

C# 二十年语法变迁之 C# 10参考https://benbowen.blog/post/two_decades_of_csharp_vi/自从 2000 年引入 C# 以来,该语言的规模已经大大增加,我不确定任何人是否有可能随时对每个语言特性都有深入的了解。因此,我想写一系列快速参考文章,总结自 C# 2.0 以来所有主要的新语言特性。我不会详细介绍它们中的任何一个,但我希望这个系列可以作为我...

farway000的博客 329

从软体机器人到鞋垫分析:Abaqus超弹性材料(Ogden模型)仿真配置全流程

本文详细介绍了Abaqus中Ogden模型在超弹性材料仿真中的应用全流程,涵盖从实验数据导入、参数拟合到模型构建与求解优化的关键步骤。特别针对鞋垫分析等生物力学场景,提供了单元选择、接触设置和并行计算等实用技巧,帮助工程师实现高精度仿真分析。

weixin_42525385的博客 399

从Reset到Read:深入解析Rolling Shutter曝光流水线

本文深入解析Rolling Shutter(卷帘曝光)的工作原理,重点探讨Reset和Read信号在图像传感器中的关键作用。通过Reset-Read流水线机制,详细解释了曝光控制、时序调优及运动伪影补偿等核心技术,帮助读者理解卷帘曝光在高速摄影和动态场景中的应用。

weixin_42531925的博客 253

C# 10 完整特性介绍

前言开头防杠:.NET 的基础库、语言、运行时团队从来都是相互独立各自更新的,.NET 6 在基础库、运行时上同样做了非常多的改进,不过本文仅仅介绍语言部分。距离上次介绍 C# 10 的特...

dotNET跨平台 962

通信算法之249: DJI波形物理层

D-J-I的Lightbridge波形、Ocusync1波形、Ocusync2波形、Ocusync3波形,

leegang12的专栏 1436

C# 10的新特性

我们很高兴地宣布 C# 10 作为 .NET 6 和 Visual Studio 2022 的一部分已经发布了。在这篇文章中,我们将介绍 C# 10 的许多新功能,这些功能使您的代码更漂亮、更具表现力和更快 . 阅读 Visual Studio 2022 公告 和 .NET 6 公告 以了解更多信息,包括如何安装。 全局和隐式usings using 指令简化了您使用命名空间的方式。 C# 10 包括一个新的全局 using 指令和隐式 usings,以减少您需要在每个文件顶部指定的 usings 数

微软技术栈 1436

Orange3实战教程:实例---文本分类

我们可以使用预测模型按作者、类型、情感等对文档进行分类。在此工作流中,我们根据文档的Aarne Thompshon Uther索引对文档进行归类,这是故事的主题定义。我们使用两个简单的学习器,Logistic回归和朴素贝叶斯,两者都可以在诺谟图中检查。然后再从可视化分类中添加列线图组件,观察哪些词对逻辑回归最重要。也可以尝试使用在朴素贝叶斯模型上,并编辑连线属性。再从模型中添加朴素贝叶斯模型,以尝试不同的学习器。

err2008的专栏 384

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

面试必备之C#10语法特性总结

C# 10已与.NET 6、VS2022一起发布,本文按照.NET的发布顺序,根据微软官方文档整理C#中一些有趣的语法特性。注:基于不同.NET平台创建的项目,默认支持的C#版本是不一样的...

farway000的博客 1999

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

yolov10--C#接口

该原始模型,需要被转换为openvinocsharp所支持的模型格式,为此需要建立一个yolov10的python环境,使用conda创建,requirements.txt 为 yolov10官方代码下的所需包。这里为了演示,使用官方yolov10m模型(其他大小的模型同理)做演示,可从下方下载,当然也可以是自己训练好的模型。运行代码,可以得到统计的代码加载、预处理、推理的运行时间,并且得到识别结果,类别号、置信度、以及位置。在该创建好的虚拟环境,cd 至下载好的yolov10m.pt 所在目录,执行。

AP1005834的博客 2454

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C# 10 的五大新功能

作者 | Matthew MacDonald 译者 | 弯月 责编 | 欧阳姝黎出品 | 优快云(ID:优快云news)以下为译文:C# 的 GitHub 页面上记...

优快云资讯 4834

C#10 快速语法参考(一)

通过键入void后跟方法名、一组括号和一个代码块,可以在类内部创建一个方法。void关键字意味着这个方法不会返回值。方法的命名约定与类相同——一个描述性的名称,每个单词最初都大写。C# 中的所有方法必须属于一个类,并且它们是唯一可以执行语句的地方。C# 没有全局函数,全局函数是在类之外定义的方法。派生类中的成员可以重定义其基类中的成员。对于所有类型的继承成员都可以这样做,但是它最常用于给实例方法新的实现。为了给一个方法一个新的实现,该方法在子类中被重新定义,使用与它在基类中相同的签名。

龙哥盟 995

一探即将到来的 C# 10

前言# 本来因为sql教程懒不想写这篇文章,但是不少人表示java基础教程有兴趣,于是最后决定还是写一下。 .NET 6 最近几个预览python基础教程版一直都在开发体验(如 hot reload、linker 等)、平台支持(如 Android、iOS 等)、工具链(如 crossgen2、PGO 工具和 wasm 的 AOT 等)、JIT(如 LSRA、Jump threading、PGO 和 guarded devirtualization 以c#教程及使 struct 保持在寄存器上等)、GC

chinaherolts2008的博客 340

13 个 C# 10 特性

常量的内插字符串C# 10 允许使用在常量字符串初始化中使用插值, 如下const string name = "Oleg"; const string greeting = $"Hell...

zls365365的博客 151

C#打开Win10 APP

添加引用: using System.Diagnostics; Process.Start("outlookcal:"); //打开系统日历 //系统时钟:ms -clock: //系统天气:msnweather: //系统日历:outlookcal: //时钟设置:timedate.cpl //系统设置:ms -settings: //应用商店:ms -windows-store: //蓝牙设置:ms-settings:bluetooth 查找名称: 可以打开注册表项:HKEY_CLASS..

dh164645822的专栏 628

[译] 预览 C# 10 的新东西

原文:Introducing C# 10[1]作者:Ken Bonny[2]翻译:Rwing[3]译文:[翻译] 预览 C# 10 的新东西[4]本周早些时候(译注:原文发表于5月1日),我关注了Mads Torgersen[5]在DotNet SouthWest[6]大会上的演讲[7],他是微软的 C# 语言的首席设计师。他概述了 C# 10 即将包含的很酷的...

zls365365的博客 106
上一篇: 06-C#
下一篇: 13-C#
似水明俊德
博客等级 码龄8年 247粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值