<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[guliang21的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/guliang21</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; guliang21]]></copyright><item><title><![CDATA[【C#】BlockingCollection 用法浅析]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/133014313</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/133014313</guid><author>guliang21</author><pubDate>Tue, 30 Mar 2021 11:20:00 +0800</pubDate><description><![CDATA[多线程操作集合时，ConcurrentQueue 是我常用的，一直用得也挺爽，突然发现了 BlockingCollection，原来还可以更简单。。。
BlockingCollection&lt;T&gt; 是一个自带阻塞功能的线程安全集合类，和 ConcurrentQueue&lt;T&gt; 有点像，不同的是，BlockingCollection&lt;T&gt; 自带阻塞功能。

Add ...]]></description><category></category></item><item><title><![CDATA[【C#】使用 Castle 实现 AOP，以及 Autofac 集成 Castle]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/132974789</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/132974789</guid><author>guliang21</author><pubDate>Mon, 22 Feb 2021 08:52:00 +0800</pubDate><description><![CDATA[Castle 是 2003 年诞生于 Apache Avalon 项目，目的是为了创建一个IOC 框架。发展到现在已经有四个组件：

ORM组件：ActiveRecord
IOC组件：Windsor
动态代理组件：DynamicProxy
Web MVC组件：MonoRail

本文主要介绍 动态代理组件 Castle.DynamicProxy
基本用法
Castle.DynamicProxy ...]]></description><category></category></item><item><title><![CDATA[【C#】反射的用法及效率对比]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/133011293</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/133011293</guid><author>guliang21</author><pubDate>Thu, 18 Feb 2021 13:13:00 +0800</pubDate><description><![CDATA[反射实例化类
public class Person
{
    public string Name { get; set; }

    public Person(string name)
    {
        this.Name = name;
    }

    public string Say(string msg)
    {
        return $"{Name...]]></description><category></category></item><item><title><![CDATA[【C#】List 并发丢数据问题]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/132974788</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/132974788</guid><author>guliang21</author><pubDate>Tue, 09 Feb 2021 10:34:00 +0800</pubDate><description><![CDATA[项目中出了个 BUG，就在我眼皮子底下，很明显的一个 BUG，愣是看了两天才看出来。
我有多个任务并发，任务执行完成后都有一个返回结果，我用一个 List 将结果收集起来，等所有任务完成后，发送出去。结果一直 丢数据。
我反复检查逻辑都没有问题，最后恍然 List 是非线程安全的。
大家都知道 List 是非线程安全的，但是如果仅有 Add 操作呢？估计有些人就会认为没问题。
下面的代码，期望输...]]></description><category></category></item><item><title><![CDATA[【C#】DockPanelSuite 中 DockState.Document 状态下子窗体控件不显示的解决方案]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/133062079</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/133062079</guid><author>guliang21</author><pubDate>Wed, 16 Dec 2020 18:41:00 +0800</pubDate><description><![CDATA[DockPanelSuite 是 Winform 中优秀的布局控件，但是这次使用过程中却出了个问题。
我遇到的问题是这样的，主窗体是通过 ShowDialog 显示的，子窗体的停靠状态为 DockState.Document，主窗体关闭时，并未真正 Close，仅是 Hide。
然后问题来了
问题1：在主窗体 Load 事件中直接 Show 子窗体，关闭主窗体后再次打开，报错 创建窗口句柄时出错...]]></description><category></category></item><item><title><![CDATA[【C#】DataGridView 数据绑定的一些细节]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/132974792</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/132974792</guid><author>guliang21</author><pubDate>Sun, 16 Aug 2020 18:30:00 +0800</pubDate><description><![CDATA[多年不写 Winform 了，突然要做一个 winform 项目，各种不顺手，各种百度。
DataGridView 数据绑定的一些细节问题，记录备查。
数据绑定
BindingList&lt;EmployeeVO&gt; dataSource;

private async void FrmEmployeeInfo_Load(object sender, System.EventArgs e)
...]]></description><category></category></item><item><title><![CDATA[【设计模式】如何用组合替代继承]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/132974787</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/132974787</guid><author>guliang21</author><pubDate>Mon, 15 Jun 2020 09:47:00 +0800</pubDate><description><![CDATA[如果问面向对象的三大特性是什么，多数人都能回答出来：封装、继承、多态。
继承 作为三大特性之一，近来却越来越不推荐使用，更有极端的语言，直接语法中就不支持继承，例如 Go。这又是为什么呢？
为什么不推荐使用继承？
假设我们要设计一个关于鸟的类。
我们将“鸟类”定义为一个抽象类 AbstractBird。所有更细分的鸟，比如麻雀、鸽子、乌鸦等，都继承这个抽象类。
大部分鸟都会飞，那我们可不可以在 ...]]></description><category></category></item><item><title><![CDATA[如何用组合替代继承]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/106756260</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/106756260</guid><author>guliang21</author><pubDate>Mon, 15 Jun 2020 09:42:45 +0800</pubDate><description><![CDATA[如果问面向对象的三大特性是什么，多数人都能回答出来：封装、继承、多态。
继承 作为三大特性之一，近来却越来越不推荐使用，更有极端的语言，直接语法中就不支持继承，例如 Go。这又是为什么呢？
为什么不推荐使用继承？
假设我们要设计一个关于鸟的类。
我们将“鸟类”定义为一个抽象类 AbstractBird。所有更细分的鸟，比如麻雀、鸽子、乌鸦等，都继承这个抽象类。
大部分鸟都会飞，那我们可不可以在 AbstractBird 抽象类中，定义一个 Fly() 方法呢？
答案是否定的。尽管大部分鸟都会飞，但也有特例，]]></description><category></category></item><item><title><![CDATA[【C#】AutoMapper 使用手册]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/106710820</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/106710820</guid><author>guliang21</author><pubDate>Fri, 12 Jun 2020 10:36:34 +0800</pubDate><description><![CDATA[文章目录1 入门例子2 注册2.1 Profile3 配置3.1 命名约定3.2 配置可见性3.3 全局属性/字段过滤3.4 识别前缀和后缀3.5 替换字符4 调用构造函数5 数组和列表映射5.1 处理空集合5.2 集合中的多态6 方法到属性映射7 自定义映射8 扁平化映射8.1 IncludeMembers9 嵌套映射

本文基于 AutoMapper 9.0.0

AutoMapper 是一个对象-对象映射器，可以将一个对象映射到另一个对象。
官网地址：http://automapper.org/
官方]]></description><category></category></item><item><title><![CDATA[函数式编程中的基本概念]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/106492887</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/106492887</guid><author>guliang21</author><pubDate>Tue, 02 Jun 2020 11:40:15 +0800</pubDate><description><![CDATA[函数签名
假设有一个函数 f，输入一个 int 值，返回一个 string 值，在 C# 中，该函数可以表示为：
Func&lt;int, string&gt;

我们可以使用箭头（→）符号来表示：
f : int → string

箭头符号是函数式编程社区的标准函数符号，与语言无关。
当没有输入或没有输出(void)时，用 ()  表示。如果有多个输入或输出，则用元组表示。
例如：
Func&lt;string&gt;
Func&lt;int, int, int&gt;

分别表示为：
() → str]]></description><category></category></item><item><title><![CDATA[【VS】Visual Studio 就可以反编译查看源码了，再见了 Reflector]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/106239401</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/106239401</guid><author>guliang21</author><pubDate>Sat, 23 May 2020 12:58:26 +0800</pubDate><description><![CDATA[以前需要反编译的时候，一直都是用的神器 Reflector。但毕竟还是有点不方便，因为要从 VS 切换到另一个工具。而且，Reflector 现在收费了。
然而现在才发现，原来 VS 已经自带反编译功能了，不愧是宇宙第一 IDE。
工具 → 选项 → 文本编辑器 → c#&gt;高级 → 启用导航到反编译源
勾上以后， F12 就可以直接查看反编译后的源代码了。

...]]></description><category></category></item><item><title><![CDATA[【C#】CsvHelper 使用手册]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/106233049</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/106233049</guid><author>guliang21</author><pubDate>Wed, 20 May 2020 12:12:10 +0800</pubDate><description><![CDATA[现在网上的 CsvHelper 教程都比较旧，本文基于 CsvHelper 最新版本 15.0.5]]></description><category></category></item><item><title><![CDATA[【C#】使用 System.Globalization.DateTimeFormatInfo 屏蔽系统时间格式对代码的影响]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/106212402</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/106212402</guid><author>guliang21</author><pubDate>Tue, 19 May 2020 13:15:29 +0800</pubDate><description><![CDATA[时间格式我使用的一直都是 yyyy-MM-dd HH:mm:ss，然后某天，我改成了 yyyy/MM/dd HH:mm:ss，然后神奇的问题就来了。

怎么会出现这种情况的呢？
因为我手贱改了系统的日期格式。打开 控制面板 → 日期和时间 → 更改日期和时间 → 更改日历设置

我把日期格式设置成了 yyyy-MM-dd，然后就这样了。也就是说，系统的时间格式优先级比 ToString 方法要高。
我们一般不会去修改系统的时间格式，这时 ToString 方法还是有效的，一旦修改了，ToString 方法就]]></description><category></category></item><item><title><![CDATA[【swagger】C# 中 swagger 的使用及避坑]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/105291124</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/105291124</guid><author>guliang21</author><pubDate>Tue, 07 Apr 2020 12:49:13 +0800</pubDate><description><![CDATA[文章目录1 安装2 修改名称和版本号3 显示说明4 路由相同，查询参数不同的方法5 忽略 Model 中的某些字段6 传递 header7 出错时的 HTTP 状态码
开发 web api 的时候，写文档是个痛苦的事情，而没有文档别人就不知道怎么调用，所以又不得不写。
swagger 可以自动生成接口文档，并测试接口，极大的解放了程序员的生产力。
1 安装
通过 NuGet 安装 Swashbuc...]]></description><category></category></item><item><title><![CDATA[【C#】Newtonsoft.Json 中 JArray 添加数组报错：Could not determine JSON object type for type 'xxx']]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/105290710</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/105290710</guid><author>guliang21</author><pubDate>Fri, 03 Apr 2020 13:02:49 +0800</pubDate><description><![CDATA[有时我们临时需要一个 JSON 字符串，直接拼接肯定不是好方法，但又懒得去定义一个类，这是用 JObject 就会非常的方便。
但是在 JObject 中添加数组却经常被坑。
List&lt;string&gt; names = new List&lt;string&gt;
{
    "Tom",
    "Jerry"
};

JArray array = new JArray(names);...]]></description><category></category></item><item><title><![CDATA[【C#】比较 Random 与 RandomNumberGenerator 生成随机字符串]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/105263763</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/105263763</guid><author>guliang21</author><pubDate>Thu, 02 Apr 2020 11:02:48 +0800</pubDate><description><![CDATA[生成随机数，第一反应肯定是 Random 类，然而，Random 生成的随机数被称为伪随机数，因为用 Random 生成随机数时，需要用到一个“种子”，而 使用相同的种子，一定会产生相同序列的数字。
Random r1 = new Random(1);
Console.WriteLine(r1.Next(100));	// 24

Random r2 = new Random(1);
Consol...]]></description><category></category></item><item><title><![CDATA[【C#】正则进阶]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/104276551</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/104276551</guid><author>guliang21</author><pubDate>Wed, 12 Feb 2020 12:19:18 +0800</pubDate><description><![CDATA[.NET 中的正则表达式是基于 Perl 5 的正则表达式。
超时
从 .NET Framework 4.5 开始，正则表达式支持在匹配操作中指定超时时间。如果匹配超时，就会抛出 RegexMatchTimeoutException。
所有方法都增加了带超时时间参数的重载：
public static Match Match(string input, string pattern, RegexO...]]></description><category></category></item><item><title><![CDATA[【C#】写文件时如何去掉编码前缀]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/104244907</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/104244907</guid><author>guliang21</author><pubDate>Mon, 10 Feb 2020 10:38:16 +0800</pubDate><description><![CDATA[我们都知道，文件有不同的编码，例如我们常用的中文编码有：UTF8、GK2312 等。
Windows 操作系统中，新建的文件会在起始部分加入几个字符的前缀，来识别编码。
例如，新建文本文件，写入单词 Hello，另存为 UTF8。Hello 占 5 个字节，但文本大小却是 8 个字节。（win7 系统下还是这样的，win10 已经去掉了编码前缀，所以 win10 下文件大小依然是 5 个字节。看来...]]></description><category></category></item><item><title><![CDATA[【C#】定时器保活机制引起的内存泄露问题]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/104192065</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/104192065</guid><author>guliang21</author><pubDate>Thu, 06 Feb 2020 10:42:46 +0800</pubDate><description><![CDATA[C# 中有三种定时器，System.Windows.Forms 中的定时器和  System.Timers.Timer 的工作方式是完全一样的，所以，这里我们仅讨论 System.Timers.Timer 和 System.Threading.Timer
1、定时器保活
先来看一个例子：
class Program
{
    static void Main(string[] args)
   ...]]></description><category></category></item><item><title><![CDATA[【VS】NuGet 修改包路径]]></title><link>https://blog.youkuaiyun.com/guliang21/article/details/132974785</link><guid>https://blog.youkuaiyun.com/guliang21/article/details/132974785</guid><author>guliang21</author><pubDate>Wed, 20 Nov 2019 10:33:00 +0800</pubDate><description><![CDATA[NuGet 是 .NET 平台下的一个免费、开源的包管理开发工具。
修改全局包管理目录
通过 NuGet 安装包时，NuGet 先将包下载至一个统一的目录，默认路径是：C:\Users\用户名\.nuget\packages
下载的包多了以后，会导致 C 盘空间被大量占用。我们可以通过修改配置将其指定到自定义的目录下。
搜索 NuGet.Config 文件，默认位置是：C:\Users\用户名\...]]></description><category></category></item></channel></rss>