合集-c#基础
摘要:## 引言 最近做一个配置的功能,需求是该配置项跟另一个整形配置项关联,具有一定的函数关系,例如有一个配置项是值为 `N` ,则另一配置 `F` 项满足函数关系$F=2/(N+1)$。这个函数关系是客户手动输入,只需要简单的四则运算,所以我们要做的就是判断四则运算表达式是否有效,且给定 `N` 的值
阅读全文
摘要:## 引言 在C#中,让线程同步有两种方式: - 锁(lock、Monitor) - 信号量(EventWaitHandle、Semaphore、Mutex) 线程锁的原理,就是锁住一个资源,使得应用程序在此刻只有一个线程访问该资源。通俗地讲,就是让多线程变成单线程。在C#中,可以将被锁定的资源理解
阅读全文
摘要:## 引言 **dynamic** 是 `Framework 4.0` 就出现特性,它的出现让 C# 具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,默认 **dynamic** 对象支持开发者想要的任何特性。 ## dynamic 介绍 在C#中,dynamic是一种类型,它允许你在
阅读全文
摘要:## 引言 先不论什么是闭包,什么是闭包陷阱,我们开篇先看一段代码: ```csharp static void Main(string[] args) { List lists = new List(); for (int i = 0; i { Console.WriteLine(i); }; l
阅读全文
摘要:## 引言 上文[编码技巧 同步锁对象的选定](url)中,提到了在C#中,让线程同步有两种方式: - 锁(lock、Monitor等) - 信号量(EventWaitHandle、Semaphore、Mutex) 加锁是最常用的线程同步的方法,就不再讨论,本篇主要讨论使用信号量同步线程。 ## W
阅读全文
摘要:## 引言 众所周知,使用线程可以极大的提高应用程序的效率和响应性,提高用户体验,但是不可以无节制的使用线程,为什么呢? ## 线程的开销 线程的开销实际上是非常大的,我们从空间开销和时间开销上分别讨论。 ### 线程的空间开销 线程的空间开销来自这四个部分: 1. 线程内核对象(Thread Ke
阅读全文
摘要:## 引言 现在模拟一个异步方法抛出了异常: ```csharp public static async Task ThrowAfter(int ms, string message) { await Task.Delay(ms); throw new Exception(message); } `
阅读全文
摘要:## 介绍 **CAS**(Compare And Swap) 是一种无锁算法的实现手段,中文名称为比较并交换。它由 CPU 的原子指令实现,可以在多线程环境下实现无锁的数据结构。 ### 原理 **CAS** 的原理是:它会先比较内存中的某个值是否和预期值相同,如果相同则更新这个值,否则不做任何操
阅读全文
摘要:## 引言 今天同事问了我一个问题,`System.Windows.Forms.Timer`是前台线程还是后台线程,我当时想的是它是跟着UI线程一起结束的,应该是前台线程吧? 我确实没有仔细研究过他们的异同,所以带着这个疑问探究一下`System.Windows.Forms.Timer`。 ## S
阅读全文
摘要:## 引言 **yield**关键字是 C# 中的一种语言特性,用于在枚举器中简化迭代器的实现。它使得开发人员可以通过定义自己的迭代器来简化代码,而不必手动实现 IEnumerable 和 IEnumerator 接口。 使用 `yield` 关键字,可以将迭代器中的值一次一个地返回,而不必使用一个
阅读全文
摘要:## 引言 `Span` 是C# 中的一种结构体,它是一种内存安全的类型,可以用来表示连续的内存区域。`Span` 可以被用于访问和操作数组、堆上分配的内存和栈上分配的内存。使用 `Span` 可以避免不必要的内存拷贝,从而提高性能。 ## 对数组使用Span 如果需要快速访问托管或非托管的连续内存
阅读全文
摘要:## 引言 深拷贝是指创建一个新对象,该对象的值与原始对象完全相同,但在内存中具有不同的地址。这意味着如果您对原始对象进行更改,则不会影响到复制的对象 常见的C#常见的深拷贝方式有以下4类: 1. 各种形式的序列化及反序列化。 2. 通过反射机制获取该对象的所有字段和属性信息。遍历所有字段和属性,递
阅读全文
摘要:引言 面试中,常会问道,在大数据量的字符串拼接情况,为什么 StringBuilder 性能比直接字符串拼接更好? 主要原因就是 string 是不可变类型,每次操作都会创建新的字符串对象,频繁操作会导致内存频繁的分配和回收,就会降低性能, 而 StringBuilder 是可变类型,它允许对字符串
阅读全文
摘要:引言 如题,在VS中如何调试 .Net 源码呢? 一般来说,VS2022,都是默认启用 F12 转到定义能够看到源码,如果大家发现自己无法使用 F12 查看源码,可以在 "工具" -> "选项" -> "文本编辑器" -> "C#" -> "高级" -> "转到定义",勾选所有选项就对了。 但是光以
阅读全文
摘要:引言 最近在做的项目上做了一些性能优化的工作,用到了 Visual Studio 远程调试,所以本篇文章整理一下远程调试技巧。 首先,了解一下 Visual Studio远程调试是什么? Visual Studio 的远程调试功能允许在本地调试远程计算机上运行的应用程序。用远程调试,可以在本地计算机
阅读全文
摘要:引言 最近看一些代码的时候,发现有人用 System.Collections.Concurrent 下的 BlockingCollection 很便利的实现了生产者 - 消费者模式,这是之前没有注意到的,之前只关注过 ConcurrentQueue<T> 、ConcurrentStack<T> 或
阅读全文

浙公网安备 33010602011771号