随笔分类 - .NET
.NET Core
.NET Framework
摘要:bool? 实际上是 Nullable<Boolean> 类型,可以当作三值的 bool 类型来使用。不过三值的布尔进行与或运算时的结果与二值有什么不同吗? 本文内容 重载条件逻辑运算符“与”(&&)“或”(||) 三值 bool? 的与或结果 参考资料 本文内容 重载条件逻辑运算符“与”(&&)“
阅读全文
摘要:一个工程师团队使用 Slack 进行团队协作比 QQ / 微信流的效率高多啦。除了基本的 IM 之外,它的扩展性也是非常重要的一点。 本文介绍 Slack 的开发入门:Incoming Webhooks 篇。 本文内容 创建一个新 Slack 应用 创建 Webhooks 应用 添加一个 Webho
阅读全文
摘要:使用 Nullable<T> 我们可以为原本不可能为 null 的值类型像引用类型那样提供一个 null 值。不过注意:Nullable<T> 本身也是个 struct,是个值类型哦。这意味着你随时可以调用 .HasValue 这样的方法,而不用担心会出现 NullReferenceExceptio
阅读全文
摘要:Mutex 是 Mutual Exclusion 的缩写,是互斥锁,用于防止两个线程同时对计算机上的同一个资源进行访问。不过相比于其他互斥的方式,Mutex 能够跨越线程边界。 本文内容 Mutex 是什么? 简单的 Mutex(不能跨进程互斥) 创建跨进程互斥的 Mutex 处理异常情况 Appl
阅读全文
摘要:如果你在代码中使用了 FileInfo.Exists 实例方法来判断一个文件是否存在,也许会发现此方法可能错误地判断来一个文件是否真的存在。这是一个坑。 本文将介绍坑的原因,并提供填坑的办法。 本文内容 问题代码 原因分析 解决办法 本文内容 问题代码 原因分析 解决办法 问题代码 原因分析 解决办
阅读全文
摘要:我们在代码中会写 #if DEBUG 或者 [Conditional("DEBUG")] 来使用已经定义好的条件编译符号。而定义条件编译符号可以在代码中使用 #define WALTERLV 来实现,也可以通过在项目属性中设置条件编译符号(Conditional Compilation Symbol
阅读全文
摘要:条件编译符号指的是 Conditional Compilation Symbols。你可以在 Visual Studio 的项目属性中设置,也可以直接在项目文件中写入 DefineConstants 属性。 不过对于不同种类的项目,我建议使用不同的设置方法。本文将介绍如何设置条件编译符。 对于新旧格
阅读全文
摘要:林德熙 小伙伴希望保存一个文件,并且希望如果出错了也要不断地重试。然而我认为如果一直错误则应该对外抛出异常让调用者知道为什么会一直错误。 这似乎是一个矛盾的要求。然而最终我想到了一个办法:让重试一直进行下去,谁需要关心异常谁就去 catch 异常,不需要关心异常的模块则跟着一直重试直到成功。 我们通
阅读全文
摘要:最近有小伙伴问我如何可以让 Windows 静置一段时间不操作之后,显示一个特殊的界面。我想了想,屏幕保护程序可以做到这一点,而且,屏幕保护程序的开发也是非常简单的。 本文将介绍如何为 Windows 这一悠久的功能进行开发。 本文内容 屏幕保护程序的本质 安装屏幕保护程序 处理屏幕保护程序参数 请
阅读全文
摘要:你可以使用临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphores)和事件(Event)来处理线程同步。然而,在编写一些异步处理函数,尤其是还有 async 和 await 使用的时候,还有一些更方便的类型可以用来处理线程同步。 使用 TaskCompletio
阅读全文
摘要:CommandLineParser 是一款用于解析命令行参数的 NuGet 包。你只需要关注你的业务,而命令行解析只需要极少量的配置代码。 本文将介绍如何使用 CommandLineParser 高效写出自己程序的命令行解析部分。 本文内容 NuGet 包和 GitHub 开源仓库 最简单的命令行解
阅读全文
摘要:当你需要监视文件或文件夹的改变的时候,使用 FileSystemWatcher 便可以完成。不过,FileSystemWatcher 对文件夹的监视要求文件夹必须存在,否则会产生错误“无效路径”。 那么,如果文件或文件夹不存在的时候可以怎么监视文件的改变呢?更麻烦的是如果顶层很多级文件夹都不存在,怎
阅读全文
摘要:StyleCop 本质上是一个 C# 源代码规则分析器,可以帮助团队成员强制执行一组代码样式和一致性规则。 本文将简述 StyleCop 以及它能为团队带来的价值。 本文内容 StyleCop 是什么? StyleCop 能做什么,不能做什么? StyleCop 的优势和价值 本文内容 StyleC
阅读全文
摘要:StyleCop 可以帮助强制执行代码格式化规范,ReSharper 可以帮助你更高效地编写代码。把两者结合起来,你便能高效地编写符合团队强制格式化规范的代码来。 本文就介绍如何使用 ReSharper 来高效地遵循 StyleCop 的代码格式化规范。 本文内容 安装插件 StyleCop by
阅读全文
摘要:我在之前的博客中有教大家如何编写 NuGet 工具包,其中就有编写 .targets 文件。 我在实际的使用中,发现 Visual Studio 2017 带来的含 Sdk 的新 csproj 格式基本上没有多少坑;然而旧的 csproj 文件却总是不能完美的运行,总是出错。关键是,不是每台电脑都出
阅读全文
摘要:我们已经知道 Task 是可等待的,但是去看看 Task 类的实现,几乎找不到哪个基类、接口或者方法属性能够告诉我们与 await 相关。 而本文将探索什么样的类是可使用 await 异步等待的? Dixin’s Blog - Understanding C# async / await (2) T
阅读全文
摘要:.NET 中的 async / await 写异步代码用起来真的很爽,就像写同步一样。我们可以在各种各样的异步代码中看到 Task 返回值,这样大家便可以使用 await 等待这个方法。不过,有时需要写一些特别的异步方法,这时需要自己来实现一个可以异步等待的对象。 本文将讲述如何实现一个可等待对象,
阅读全文
摘要:我在几篇文章中都说到了在 .NET 中自己实现 Awaiter 情况。async / await 写异步代码用起来真的很爽,就像写同步一样。然而实现 Awaiter 没有现成的接口,它需要你按照编译器的要求为你的类型添加一些具有特定名称的属性和方法。然而没有接口的帮助,我们编写起来就很难获得工具(如
阅读全文
摘要:WPF 中为了 UI 的跨线程访问,提供了 Dispatcher 线程模型。其 Invoke 方法,无论在哪个线程调用,都可以让传入的方法回到 UI 线程。 然而,如果你在 Lazy 上下文中使用了 Invoke,那么当这个 Lazy<T> 跨线程并发时,极有可能导致死锁。本文将具体说说这个例子。
阅读全文
摘要:AutoResetEvent、ManualResetEvent、Monitor、lock 等等这些用来做同步的类,如果在异步上下文(await)中使用,需要非常谨慎。 本文将说一个在同步上下文中非常常见的一种用法,换成异步上下文中会产生死锁的问题。 本文内容 一段正常的同步上下文的代码 一个微调即会
阅读全文