.Net/C#基础
文章平均质量分 60
.Net/C#技术记录和分享
heater404
这个作者很懒,什么都没留下…
展开
-
C#弱引用
如果是false,这个弱引用就是一个short weak reference,当GC回收时,发现根中没有这个对象的引用了,就认为这个对象无用,这时短弱引用对这个对象的跟踪到此为止,弱引用的target被设置为null。但是当值为true时,有可能在对象添加强引用的一瞬前,对象就被垃圾回收机制回收掉。对于那些创建便宜但是耗费大量内存的对象,即希望保持该对象,又要在应用程序需要时使用,同时希望GC必要时回收时,可以考虑使用弱引用。强引用:持有对象的引用,防止GC回收引用对象。是泛型版本的,默认就是断弱引用。原创 2023-04-08 16:02:43 · 342 阅读 · 1 评论 -
有return的时候,finally块中代码还会执行吗
1 背景当然是面试被问到了。。。。2 记录一下这篇文章主要讲解两个问题:在try中有return或者catch中有return的时候,finally中的代码是否会执行?如果会被执行,是在什么时候执行的呢?先看第一个问题,我们也准备了一点代码。 static void Main(string[] args) { Foo(50); Foo(200); } static int Foo(int a) { tr原创 2022-03-09 12:21:26 · 3823 阅读 · 0 评论 -
C#特性(attribute)
1 什么是特性特性是一种允许我们向程序的程序集添加元数据的语言结构,它用于保存程序结构信息的某种特殊类型的类。2 预定义的特性2.1 Obsoletepublic ObsoleteAttribute(string? message, bool error);public ObsoleteAttribute(string? message);第一个参数表示错误信息,第二个参数表示是否报错。 class Program { [Obsolete("this meth原创 2022-02-24 17:52:11 · 326 阅读 · 0 评论 -
C#反射(reflection)
反射是.Net中的重要机制,通过反射可以得到“.exe”或“.dll”等程序集内部的接口、类、方法、字段、属性、特性等信息,还可以动态创建出类型实例并执行其中的方法。反射指程序可以访问、检测和修改它本身状态或行为的一种能力。程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。可以使用反射动态的创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。1 获取Type类型对象 //通过反射获取类原创 2022-02-24 16:41:43 · 774 阅读 · 1 评论 -
.Net中的状态机库Stateless
一、什么是状态机和状态模式状态机是一种用来进行对象建模的工具,它是一个有向图像,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每一个事件都在属于“当前”节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少由一个必须的终态。当到达终态,状态机停止。状态模式主要用来解决对象状态转换比较复杂的情况。它把状态的逻辑判断转移到不同的类中,可以把复杂的逻辑简单化。二、状态机的要素状态机有四个要素,即现态、条件、动作、次态。其原创 2021-05-24 20:42:12 · 710 阅读 · 1 评论 -
线程同步之Volatile
编译器优化c#编译器会在不改变我们的意图的情况下做一些优化,比如:a = 1;a = 2;编译器编译之后,可能就只剩下第二行了。再比如:a = 1;b = a;编译器优化后,可能会把第二行优化成b = 1再比如:a = m;b = n;编译器生成IL时,有可能会改变两行代码的顺序。以上变化都是在编译器认为不改变作者意图的前提下做的,如果在单线程环境下这也没有问题,但是如果是多线程环境操作一个公共资源的话,先读后读或先写后写,都可能会造成不确定的结果。运行时优化在运行时,为转载 2021-05-20 15:33:18 · 482 阅读 · 0 评论 -
锁
一、MonitorMonitor 类 (System.Threading) | Microsoft Docs通过使用 Monitor 类,您可以通过调用 Monitor.Enter 、 Monitor.TryEnter 和方法,来同步对某个代码区域的访问 Monitor.Exit 。 对象锁提供了限制访问代码块的功能,通常称为临界区。 当线程拥有对象的锁时,任何其他线程都无法获取该锁Monitor 具有以下功能:它与按需的对象相关联。它是未绑定的,这意味着可以从任何上下文直接调用它。Monit原创 2021-05-20 15:20:16 · 83 阅读 · 0 评论 -
原子操作Interlocked 类
一、官方文档Interlocked 类 (System.Threading) | Microsoft Docs二、示例线程安全资源锁定机制。using System;using System.Threading;namespace InterlockedExchange_Example{ class MyInterlockedExchangeExampleClass { //0 for false, 1 for true. private st原创 2021-05-20 10:22:20 · 102 阅读 · 0 评论 -
C#_线程同步基元之CountdownEvent
C#_线程同步基元之CountdownEvent一、官方文档CountdownEvent 类 (System.Threading) | Microsoft Docs二、示例表示在计数变为零时处于有信号状态的同步基元。也就是不为零的时候会阻塞,直到为零的时候才释放。 public class CountdownEventTest { ConcurrentQueue<int> queue = new ConcurrentQueue<int>(Enu原创 2021-05-19 18:26:40 · 182 阅读 · 0 评论 -
C#_闭包
C#_闭包一、闭包的含义首先,闭包并不是针对某一特定语言的概念,而是一个通用的概念。闭包是指有权访问另一个函数作用域中的变量的函数。注意,闭包这个词本身值得是一种函数。而创建这种特殊函数的一种常见方式是在一个函数中创建另一个函数。在C#中我们可以使用委托或者本地函数。二、理解闭包的实现原理 static void Main(string[] args) { GetAction()(30); } static A原创 2021-01-23 10:58:36 · 3742 阅读 · 0 评论 -
Linq
Linq前言在System.Linq 命名空间下,提供支持某些查询的类和接口,这些查询使用语言集成查询。#mermaid-svg-L4MgJ65PvNMDHixp .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-L4MgJ65PvNMDHixp .label text{fill:#333}#mermaid-原创 2021-01-21 16:58:14 · 104 阅读 · 0 评论 -
C#_Task和Task<T>
前言在介绍Task之前,我们可以先聊一聊Thread和ThreadPool前台线程:主程序必须等待线程执行完毕后才可退出程序。Thread默认为前台线程,也可以设置为后台线程。后台线程:主程序执行完毕后就退出,不管线程是否执行完毕。Thread Pool默认为后台线程线程消耗:开启一个新线程,线程不做任何操作,都要消耗1M左右的内存。ThreadPool是线程池,其目的就是为了减少开启新线程消耗的资源,线程池都已有一些创建好的线程,使用的时候从线程池中取空闲线程,线程池中线程默认都是后台线程。线程原创 2021-01-20 12:09:53 · 2311 阅读 · 0 评论 -
C#_异步编程
理解异步同步任务(一般指方法):一个应用程序调用某个方法,等到其执行完才进行下一步操作。异步任务(一般指方法):一个程序调用某一方法,在处理完成前就返回该方法,不需要等待方法完成就可以继续执行后面的代码。异步的好处在于非阻塞(调用线程不会赞同执行去等待子线程完成),因此我们把一些不需要立即使用结果、较耗时的任务设为异步执行,可以提高程序的运行效率。异步方法微软极力推荐基于Task任务的async和await关键字实现方法的异步调用,也称为基于任务的异步模式,简称TAP(Task-base asyn原创 2021-01-18 20:04:11 · 1792 阅读 · 0 评论 -
C#_HttpClient
class Program { static readonly HttpClient client = new HttpClient(); static void Main(string[] args) { string uri = @"http://www.bing.com"; var respose = client.GetAsync(uri); HttpStatu...原创 2021-01-13 15:27:16 · 205 阅读 · 0 评论 -
Http和Https协议
一、概念Http协议(Hyper Text Transfer Protocol)是超文本传输协议的缩写。它是从Web服务器传输超文本标记语言(Html)到本地浏览器的传送协议。Web服务器也称WWW(World Wide Web)服务器,主要功能是提供网上信息浏览服务。Web服务器是可以向发出请求的浏览器提供文档的程序。常用的Web服务器是Apache和Microsoft的Internet信息服务器(Internet Information Services,IIS)。二、原理Http是一个基于TC原创 2021-01-12 22:22:50 · 176 阅读 · 0 评论 -
C#_Serilog Tutorial
一、安装官方网站:https://serilog.net/,或在Nuget中直接搜索Serilog下载。二、使用 static void Main(string[] args) { Logger log = new LoggerConfiguration().CreateLogger(); log.Debug("Hello World"); }使用LoggerConfiguration对象的CreateL原创 2021-01-12 18:12:21 · 863 阅读 · 0 评论 -
C#_Unit Testing 一(xUnit)
一、前言在VS中新建一个xunit的项目,该项目中已经自动安装了一些Nuget包,其中一个关键的就是xunit,https://xunit.net/。同时,在同一个解决方案下我们也新建了一个类库,这个类库就是需要被测试的。这里提一点,一般情况下,我们是将单元测试项目单独新建一个项目的,不会在被测试项目中写单元测试。所以在单元测试项目中需要引用一下被测项目。值得一提的是项目命名、类名和方法名要规范,一般就是在被测项目名称后加一个“Test”后缀。二、示例需要测试的类库中就一个类,定义了四个方法原创 2021-01-11 11:49:43 · 1890 阅读 · 0 评论 -
PDFsharp & MigraDoc(Document Manipulation Libraries 三)
一、简介官方链接二、使用待补充原创 2021-01-07 14:48:01 · 396 阅读 · 0 评论 -
EPPlus(Document Manipulation Libraries 二)
一、前言全称为:ExcelPacketPlus。支持对excel文档的读写和基本图表的实现。支持.Net Framework和.Net Core。可在NuGet直接搜索下载。可参考:https://github.com/EPPlusSoftware/EPPlus.Sample.NetCore二、使用介绍待补充...原创 2021-01-07 14:39:07 · 213 阅读 · 0 评论 -
CsvHelper(Document Manipulation Libraries 一)
一、前言官方地址:https://joshclose.github.io/CsvHelper/,也可以在NuGet中直接下载。依赖:.NetFramework,Version=v4.5.NetFramework,Version=v4.7注意,.netcore暂不支持。二、Writing a CSV File1、一次性写入多行我们先自定义一个类,将这个类的对象写入csv文件中。public class Foo{ public UInt16 Member1 { get; set;原创 2021-01-07 14:12:20 · 382 阅读 · 0 评论 -
C#_深拷贝和浅拷贝
一、概念深拷贝:复制对象中所有值类型和引用类型的字段的值,副本是重新创建的一个对象,对象中字段只是复制的所有字段的值,没有复制引用。所以副本对象内的值并不会因为源对象数据的值的修改而改变。浅拷贝:同样会复制对象中所有值类型,但是引用类型复制的是引用,所以在源对象数据中如果引用类型数据变化了,副本中的数据也会变化。值的一提的是,string类型理论上是引用类型,但是表现上是值类型,因为字符串类型的唯一性。二、微软已提供的接口和方法MemberwiseClone 方法:创建当前 System.Obje原创 2020-12-30 18:01:15 · 140 阅读 · 0 评论 -
C#_垃圾回收
一、GC机制1、托管与非托管托管资源就是托管给CLR的资源,CLR能对这些资源进行管理。CLR使用GC(Garbage Collector)来进行内存的管理,当检测到不需要的内存的时候就会自动释放。GC进行垃圾回收的时间我们无法确定,并且顺序也不能确定,除非手动调用GC.Collect()方法来通知运行环境立即进行垃圾回收。非托管资源则是CLR无法对这些资源管理,这些资源的申请、释放必须由使用者自行管理。Stream,数据库的连接,GDI+的相关对象都是非托管资源。2、什么是垃圾我们知道,值类型分原创 2020-12-30 14:42:43 · 257 阅读 · 0 评论 -
C#_System.IO
一、类图#mermaid-svg-LCdNetTROAIARS3R .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-LCdNetTROAIARS3R .label text{fill:#333}#mermaid-svg-LCdNetTROAIARS3R .node rect,#mermaid-svg-LCdNe原创 2020-12-29 19:40:58 · 290 阅读 · 0 评论 -
C#_SymmetricAlgorithm(对称算法)
SymmetricAlgorithm(对称算法)一、简介对称密码算法有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。对称算法的加密和解密用公式可以表示为:Ek(M)=CDk©=M常用的采用对称密码术的加密方案有5个组成部分(如图所示)l)明文:原始信息。2)加密算法:以密钥为参数,对明文进行多种置换和转换的规则和步骤,变换结果为密文。3)密钥:加密与解密算法的参数,直接影响对明文进行变换的结果。4)密文:对明文进行变换的结果。5)解密算法:加密算法的逆变换,以原创 2020-12-29 17:23:52 · 1856 阅读 · 1 评论 -
C#_Hash Algorithms
Hash Algorithms一、Hash概念Hash(散列,也称“哈希”)。散列方法的主要思想是根据结点的关键码值来确定其存储地址:以关键码值k为自变量,通过一定的函数关系h(k)(称为散列函数),计算出对应的函数值来,把这个值解释为结点的存储地址,将节点存入到此存储单元中。二、Hash优点先分类再查找,通过计算缩小范围,加快查找速度。例:集合:{13,19,25,27,17}若是采用数组或链表结构:访问其中的一个元素(如18),需要遍历整个集合的元素,时间复杂度为O(n).而采用哈原创 2020-12-29 12:20:59 · 765 阅读 · 0 评论 -
C#_深入浅出Dynamic
C#_深入浅出dynamic一、前言我们知道C#是一个强类型语言,也就是说编译器在编译的时候会坚持数据类型是否正确。但是dynamic的出现让C#具有了弱语言类型的特性。编译器在编译的时候不再对类型进行检查,编译器默认dynamic对象支持你想要的任何特性。 dynamic dy = 100; dy.Name = 89; dy.GetName();上例中,我们将一个dynamic对象赋值为100,并且调用了dynamic对象的原创 2020-12-28 21:04:43 · 798 阅读 · 0 评论 -
C#_正则表达式(Regular Expression)
C#_正则表达式(Regular Expression)1、转义字符转义字符描述模式匹配\a与报警 (bell) 符 \u0007 匹配。\a“Warning!” + ‘\u0007’ 中的 “\u0007”\b在字符类中,与退格键 \u0008 匹配。[\b]{3,}“\b\b\b\b” 中的 “\b\b\b\b”\t与制表符 \u0009 匹配。(\w+)\t“Name\tAddr\t” 中的 “Name\t” 和 “Addr\t”\r与原创 2020-12-28 17:12:57 · 438 阅读 · 0 评论 -
C#_深入理解Unity容器
C#_深入理解Unity容器一、背景**DIP是依赖倒置原则:**一种软件架构设计的原则(抽象概念)。依赖于抽象不依赖于细节**IOC即为控制反转(Inversion of Control):**传统开发,上端依赖(调用/指定)下端对象,会有依赖,把对下端对象的依赖转移到第三方容器(工厂+配置文件+反射),能够程序拥有更好的扩展性,是DIP的具体实现方式,可以用来减低计算机代码之间的耦合度。DI 即为依赖注入(Dependency Injection):是实现IOC的手段和方法,就是能做到构造某原创 2020-12-15 17:40:13 · 3757 阅读 · 0 评论 -
C#_线程同步基元之WaitHandle
C#_线程同步之WaitHandle一、前言WaitHandle位于System.Threading命名空间下,是用来封装等待对共享资源进行独占访问的操作系统特定的对象。WaitHandle是一个抽象类,我们一般不直接使用,而是使用它的派生类:EventWaitHandleAutoResetEvent(派生自EventWaitHandle)ManualResetEvent(派生自EventWaitHandle)MutexSemaphore二、AutoResetEventAutoRese原创 2020-12-07 20:43:51 · 869 阅读 · 0 评论 -
C#枚举和特性的搭配使用
一、前言我们使用枚举类型的时候,很多时候都会在枚举字段中添加一些特性,然后通过反射获取这个特性中的信息。 public enum PageType { [PageType("\xe602")] RegMap, [PageType("\xe672")] PointCloud, [PageType("\xe637")] Config原创 2020-11-28 16:21:05 · 678 阅读 · 0 评论 -
C#便于处理位的集合
C#便于处理位的集合一、BitArray // // 摘要: // 管理位值的压缩数组,这些值以布尔值的形式表示,其中 true 表示此位为开 (1),false 表示此位为关 (0)。 [ComVisible(true)] [DefaultMember("Item")] public sealed class BitArray : ICollection, IEnumerable, ICloneable { //原创 2020-11-08 22:56:16 · 233 阅读 · 0 评论 -
C#深入理解堆和栈的区别
C#深入理解栈(stack)和堆(heap)的区别在讲栈和堆之前,我们先看看值类型和引用类型:类别描述值类型基本数据类型 枚举类型 结构类型引用类型类 接口 数组1)值类型:值类型总是分配在它声明的地方,作为局部变量时,存储在栈上;作为类对象的字段时,则跟随此对象存储在堆中。2)引用类型:引用类型存储在堆中。类型实例化的时候,会在堆中开辟一部分空间存储类的实例。类对象的引用(地址)还是存储在栈中。 class Program { st原创 2020-11-08 18:09:35 · 1353 阅读 · 0 评论 -
C#深入理解结构体和类的区别
C#深入理解结构体和类的区别1、在结构体中可以声明字段,但是声明字段的时候是不能给初始值的;在类中声明一个字段的同时是可以赋初始值的。在类中声明字段的时候直接赋值,是因为编译器在编译的时候将赋值的代码放到了构造函数中。从本质上来说,类和结构的字段在声明的时候都不能直接初始化的,只是微软在语法上允许了类可以直接赋值。2、关于构造函数结构体中的隐式的无参构造函数在结构中无论如何都是存在的,不能收到为结构添加一个无参的构造函数;在类中可以添加无参的构造函数,但是一旦添加一个,那么隐式的那一个就会消失。结原创 2020-11-06 10:47:06 · 261 阅读 · 0 评论 -
C#深入理解委托和事件的区别
C#深入理解委托和事件的区别1、委托 class Program { static void Main(string[] args) { Publisher publisher = new Publisher("篮球先锋报"); Observer observerA = new Observer("老A"); publisher.Magazine += observerA.RecvMa原创 2020-10-30 00:14:36 · 2061 阅读 · 1 评论 -
C#深入理解协变和逆变
C#深入理解协变和逆变1、背景是否会有小伙伴有如下的疑惑??class Program{ delegate T TestDelegate<T>();//泛型委托 static void Main(string[] args) { TestDelegate<Dog> deDog = Target; TestDelegate<Animal> deAnimal = deDog;//这里会报错 }原创 2020-10-25 17:46:28 · 292 阅读 · 3 评论 -
C#深入理解枚举器和迭代器
C#深入理解枚举器和迭代器1、枚举器和可枚举类型可枚举类型是实现IEnumerable接口的类型, public interface IEnumerable { IEnumerator GetEnumerator(); }IEnumerable接口中有一个方法,用于返回枚举器,枚举器是实现了IEnumerator接口的类型。IEnumerator接口定义如下: // // 摘要: // 支持对非泛型集合的简单迭代。 [C原创 2020-10-24 22:23:51 · 1331 阅读 · 0 评论 -
C#深入理解比较对象的相等性
C#比较对象的相等性1、比较引用类型的相等性引用类型都继承自object类型,object类型有如下的用来比较对象相等性的方法:1)static bool ReferenceEquals(Object objA, Object objB)该方法是一个静态方法,比较的是两个对象的引用,其中null等于null。2)virtual bool Equals(Object obj);该方法是一个虚方法,可以在自己的类中重写它,从而按值来比较对象。3)static bool Equals(Object原创 2020-10-18 03:07:05 · 216 阅读 · 0 评论 -
C#枚举Flag属性的应用
C#枚举Flag属性的应用1、普通枚举直接上代码:using System;using static System.Console;namespace FirstDotnetCorePro{ class Program { static void Main(string[] args) { DaysOfWeek weekday = DaysOfWeek.Saturday | DaysOfWeek.Sunday;原创 2020-10-18 02:13:15 · 1880 阅读 · 0 评论 -
引用的dll路径问题
引用的dll路径问题1、问题背景在.Net项目中我们经常会引用一些dll,但是这些dll会默认在可执行文件目录下。如果dll较多,会显得该目录很臃肿。如果我们可以另外建一个目录专门存放这些dll就比较好。2、解决方案https://blog.csdn.net/xiaominggunchuqu/article/details/78749391可参考上述博客地址,在app.config配置文件中进行配置。<configuration><runtime> <转载 2020-10-11 01:25:39 · 882 阅读 · 0 评论 -
WPF_Behavior之自动滚动到底部的ListBox
WPF_Behavior之自动滚动到底部的ListBox一、前言有一个ListBox,它的ItemSource绑定了一个集合,当这个集合动态增加的时候,ListBox的Item也会增多。问题来了,由于ListBox控件的高度有限,如果其Item过多,那么ListBox的垂直滑轮不会自动滚动到最新添加的Item,如果有什么办法让它自动滚动就好。其实有一个办法就是添加触发器,这个方法应该可以实现的,但是触发器只能对某一个控件添加,触发器的效果也只能对该控件起作用,如果有其它类似的控件也需要该效果,那么不得原创 2020-10-07 23:18:29 · 1935 阅读 · 0 评论