取消

int? 竟然真的可以是 null!.NET/C# 确定可空值类型 Nullable 实例的真实类型

使用 Nullable<T> 我们可以为原本不可能为 null 的值类型像引用类型那样提供一个 null 值。不过注意:Nullable<T> 本身也是个 struct,是个值类型哦。这意味着你随时可以调用 .HasValue 这样的方法,而不用担心会出现 NullReferenceException。 等等!除了本文提到的一些情况。 Nullable 中...

签署 Centennial Program Addendum,使用 Desktop Bridge 将 Win32 应用转制成 UWP

能上架 Windows 应用商店的并不一定必须是 UWP 应用程序或者 PWA 程序,也可以是普通的 Win32 应用程序。典型的上架应用商店的应用有微信、Telegram、Snipaste 等。使用 Desktop Bridge,我们即可以为我们的普通 Win32 应用程序做一个 UWP 的包来。 商店中那些转制的应用 如果你并没有感受到 Win32 转制的商店应用和原生的 U...

C# 中委托实例的命名规则

我们知道一个类中的属性应该用名词或名词性短语,方法用动词或动宾短语;但是委托的实例却似乎有一些游离。因为在 .NET 中委托代表的是一个动作,既可以把它看作是名词,也可以看作是动词。在用法上,既可以像属性和变量一样被各种传递,也可以像一个方法一样被调用。 那么委托实例的命名,应该遵循属性和变量的命名,还是遵循方法的命名呢? 委托的实例可以当作属性或者变量使用: var action...

三值 bool? 进行与或运算后的结果

bool? 实际上是 Nullable<Boolean> 类型,可以当作三值的 bool 类型来使用。不过三值的布尔进行与或运算时的结果与二值有什么不同吗? 重载条件逻辑运算符“与”(&&)“或”(||) 在 [C# 重载条件逻辑运算符(&& 和   )](/post/overloa...

为什么我们不应该使用微信或者 QQ 作为团队协作的 IM 工具?

如果你的团队没有觉得微信是低效的团队 IM 工具,那只有两种可能: 团队成员很少使用微信进行私人的生活和娱乐。 你就是一个低效的团队,而且还不自知。 微信,连接一切 微信,连接一切。除了家人、朋友、同学这些熟人关系,还有同事、客户、用户、企业号这些工作上的关系,还有各种各种办事小程序、各种资讯公众号、各种商店服务号、快递通知等生活和私人的快捷入口。 每个人都有微信...

Slack 开发入门之 Incoming Webhooks:往 Slack 的 Channel 中发消息

一个工程师团队使用 Slack 进行团队协作比 QQ / 微信流的效率高多啦。除了基本的 IM 之外,它的扩展性也是非常重要的一点。 本文介绍 Slack 的开发入门:Incoming Webhooks 篇。 创建一个新 Slack 应用 如果你已经创建了一个 Slack 应用,可以跳过这一节。 在这里 https://api.slack.com/apps/new 创建一个新...

WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object)

众所周知的,WPF 中多数对象都继承自 DispatcherObject,而 DispatcherObject 带给这些对象一个特点:不能跨线程访问。 不过,WPF 中依然存在一些例外。本文将介绍 WPF 那些可跨线程访问的 DispatcherObject,如何充分利用这个特点提高应用程序的性能,以及如何自己编写这样的 DispatcherObject。 什么样的 Dispat...

.NET 使用 XPath 来读写 XML 文件(顺带解决 XML 命名空间的问题)

XPath 是 XML 路径语言(XML Path Language),用来确定XML文档中某部分位置的语言。无论是什么语言什么框架,几乎都可以使用 XPath 来高效查询 XML 文件。 本文将介绍 .NET 中的 XPath 相关类型的使用。 本文读写的 XML 文件会以 文章末尾的代码 - 假设的 XML 文件 作为示例。 关于 XPath 语法,可以阅读 XML 的 XPa...

基于 task 为 VSCode 添加自定义的外部命令

我们有很多全局的工具能在各处使用命令行调用,针对某个仓库特定的命令可以放到仓库中。不过,如果能够直接为顺手的文本编辑器添加自定义的外部命令,那么执行命令只需要简单的快捷键即可,不需要再手工敲了。 写一个外部命令的调用 由于是调用外部工具,所以工具本身用什么语言写已经不重要的了,只要有环境,没有什么是不能执行的。 这里以我博客中使用的外部命令 mdmeta 为例。我将此工具使用 ...

.NET 中使用 Mutex 进行跨越进程边界的同步

Mutex 是 Mutual Exclusion 的缩写,是互斥锁,用于防止两个线程同时对计算机上的同一个资源进行访问。不过相比于其他互斥的方式,Mutex 能够跨越线程边界。 Mutex 是什么? 与其他线程同步的方式一样,Mutex 也提供对资源的互斥访问;不过 Mutex 使用的系统资源会比 Monitor 更多,而 Monitor 就是实现 C# 中 lock 关键字所用...

谨慎使用 FileInfo.Exists 实例方法,而是使用 File.Exists 静态方法替代

如果你在代码中使用了 FileInfo.Exists 实例方法来判断一个文件是否存在,也许会发现此方法可能错误地判断来一个文件是否真的存在。这是一个坑。 本文将介绍坑的原因,并提供填坑的办法。 问题代码 我们使用两种不同的方式判断文件是否存在: FileInfo.Exists 实例方法 File.Exists 静态方法 static async Task Mai...

C#/.NET 使用 CommandLineParser 来标准化地解析命令行

CommandLineParser 是一款用于解析命令行参数的 NuGet 包。你只需要关注你的业务,而命令行解析只需要极少量的配置代码。 本文将介绍如何使用 CommandLineParser 高效写出自己程序的命令行解析部分。 NuGet 包和 GitHub 开源仓库 NuGet 包:CommandLineParser GitHub 开源仓库:commandlin...

只需 5 秒钟,你就能取到 WPF 程序的超高分辨率超高清截图

我想要截取一个 WPF 程序的图标,但是它太小了。如果我就这样截屏截下来,是很不高清的。由于我需要制作一份课件,所以我需要超高清版本,可是,如何做才能最快速拿到 WPF 程序的超高清截图呢? 本文分享一个方法,只需 5 秒钟,你就能拿到! 第一步:打开 Snoop 如果你没有 Snoop,请前往下载:Release Snoop 2.10.0 · cplotts/snoopwpf...

Write a MSBuild Target to detect whether the project is rebuilding or not

MSBuild or the dotnet build command both supports Incremental Building for compiling performance. You can read How to: Build Incrementally - Visual Studio - Microsoft Docs to lean more about increm...

编写 Target 检测 MSBuild / dotnet build 此次编译是否是差量编译

MSBuild 或 Roslyn 编译项目时均支持差量编译,毕竟为了性能。我在 每次都要重新编译?太慢!让跨平台的 MSBuild/dotnet build 的 Target 支持差量编译 一文中介绍了如何使一个 Target 支持差量编译。在那篇文章中我说到差量编译会导致 Target 不执行;也就是说,如果一个 Target 对后续的编译会产生影响,那么一定不能设置为差量编译。 不过,...

在 Roslyn 分析语法树时添加条件编译符号的支持

我们在代码中会写 #if DEBUG 或者 [Conditional("DEBUG")] 来使用已经定义好的条件编译符号。而定义条件编译符号可以在代码中使用 #define WALTERLV 来实现,也可以通过在项目属性中设置条件编译符号(Conditional Compilation Symbols)来实现。 然而如果我们没有做任何特殊处理,那么使用 Roslyn 分析使用了条件编译符号...

.NET 中什么样的类是可使用 await 异步等待的?

我们已经知道 Task 是可等待的,但是去看看 Task 类的实现,几乎找不到哪个基类、接口或者方法属性能够告诉我们与 await 相关。 而本文将探索什么样的类是可使用 await 异步等待的? Dixin’s Blog - Understanding C# async / await (2) The Awaitable-Awaiter Pattern 一文解决了我们的疑惑。asy...

.NET 除了用 Task 之外,如何自己写一个可以 await 的对象?

.NET 中的 async / await 写异步代码用起来真的很爽,就像写同步一样。我们可以在各种各样的异步代码中看到 Task 返回值,这样大家便可以使用 await 等待这个方法。不过,有时需要写一些特别的异步方法,这时需要自己来实现一个可以异步等待的对象。 本文将讲述如何实现一个可等待对象,一个自定义的 Awaiter。 Awaiter 系列文章 入门篇: .N...

定义一组抽象的 Awaiter 的实现接口,你下次写自己的 await 可等待对象时将更加方便

我在几篇文章中都说到了在 .NET 中自己实现 Awaiter 情况。async / await 写异步代码用起来真的很爽,就像写同步一样。然而实现 Awaiter 没有现成的接口,它需要你按照编译器的要求为你的类型添加一些具有特定名称的属性和方法。然而没有接口的帮助,我们编写起来就很难获得工具(如 ReSharper)自动生成代码的支持。 本文将分享我提取的自己实现 Awaiter 的接...

了解 .NET 的默认 TaskScheduler 和线程池(ThreadPool)设置,避免让 Task.Run 的性能急剧降低

.NET Framework 4.5 开始引入 Task.Run,它可以很方便的帮助我们使用 async / await 语法,同时还使用线程池来帮助我们管理线程。以至于我们编写异步代码可以像编写同步代码一样方便。 不过,如果滥用,也可能导致应用的性能急剧下降。本文将说明在默认线程池配置(ThreadPoolTaskScheduler)的情况下,应该如何使用 Task.Run 来避免性能的...

Turn on Mobile Hotspot (Wi-Fi) in Windows 10

We’ll learn how to turn on Mobile Hotspot (Wi-Fi) in Windows 10. This post is written in multiple languages. Please select yours: 中文 ...

在 Windows 10 中开启移动 WLAN 热点

本文将介绍如何在 Windows 10 中开启移动 Wi-Fi 热点。 This post is written in multiple languages. Please select yours: 中文 E...

在 WPF/UWP 中实现一个可以用 await 异步等待 UI 交互操作的 Awaiter

.NET 和 C# 共同给我们带来的 async/await 异步编程模型(TAP)用起来真的很爽。为了实现异步等待,我们只需要在一切能够能够异步等待的方法前面加上 await 即可。能够异步等待的最常见的类型莫过于 Task,但也有一些其他类型。即便有些耗时操作没有返回可等待的类型,我们也可以用一句 Task.Run(action) 来包装(同步转异步 - 林德熙 中也有说明);不过副作用...

.NET 编写一个可以异步等待循环中任何一个部分的 Awaiter

林德熙 小伙伴希望保存一个文件,并且希望如果出错了也要不断地重试。然而我认为如果一直错误则应该对外抛出异常让调用者知道为什么会一直错误。 这似乎是一个矛盾的要求。然而最终我想到了一个办法:让重试一直进行下去,谁需要关心异常谁就去 catch 异常,不需要关心异常的模块则跟着一直重试直到成功。 我们通过编写一个自己的 Awaiter 来实现,本文将说明其思路和最终实现的代码。 A...

.NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件

你可以使用临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphores)和事件(Event)来处理线程同步。然而,在编写一些异步处理函数,尤其是还有 async 和 await 使用的时候,还有一些更方便的类型可以用来处理线程同步。 使用 TaskCompletionSource,你可以轻松地编写既可以异步等待,又可以同步等待的代码来。 等待事件...

使用 WPF 开发一个 Windows 屏幕保护程序

最近有小伙伴问我如何可以让 Windows 静置一段时间不操作之后,显示一个特殊的界面。我想了想,屏幕保护程序可以做到这一点,而且,屏幕保护程序的开发也是非常简单的。 本文将介绍如何为 Windows 这一悠久的功能进行开发。 屏幕保护程序的本质 屏幕保护程序本质上就是一个 Win32 窗口应用程序。 好了,这一节真的结束了…… 编译好一个窗口应用程序之后,把扩展名改为...

优化 UWP 中图片的内存占用

跟图片打交道的 UWP 应用或多或少都会遇到图片带来的性能问题,就算不主要处理图片,做个论坛做个新闻客户端都涉及到大量图片。一个帖子、一篇文章里多半都是些高清大图,这些图片一张即可占用程序 1~2M 的内存空间。普通的写法内存很快就爆了,那么 UWP 中我们可以用哪些方法优化呢? 1. DecodePixelWidth/DecodePixelHeight 对于那些高分辨率图像,直接设...

文件和文件夹不存在的时候,FileSystemWatcher 监听不到文件的改变?如果递归地监听就可以了

当你需要监视文件或文件夹的改变的时候,使用 FileSystemWatcher 便可以完成。不过,FileSystemWatcher 对文件夹的监视要求文件夹必须存在,否则会产生错误“无效路径”。 那么,如果文件或文件夹不存在的时候可以怎么监视文件的改变呢?更麻烦的是如果顶层很多级文件夹都不存在,怎么能监视呢?本文将告诉你方法。 本文的代码适用于 .NET Framework 和 .NE...

StyleCop 是什么,可以帮助团队带来什么价值?

StyleCop 本质上是一个 C# 源代码规则分析器,可以帮助团队成员强制执行一组代码样式和一致性规则。 本文将简述 StyleCop 以及它能为团队带来的价值。 StyleCop 是什么? StyleCop 本质上是一个 C# 源代码规则分析器,可以帮助团队成员强制执行一组代码样式和一致性规则。 划重点 —— “强制”。只要你愿意,你甚至可以让多写了一个空格的小伙伴无法成...

UWP 中的 LaunchUriAsync,使用默认浏览器或其他应用打开链接

古老的 Win32 应用启动其他程序太过方便,以至于一部分开发者都已经不记得 Windows 能通过关联协议(参见 桌面应用程序关联协议)的方式通过统一资源定位符(URI)来启动应用程序了。 转到 UWP 后,使用 URI 启动应用似乎成为了最推荐的方式。于是一句 LaunchUriAsync 就能解决大多数问题。 常用的 Windows 10 内置协议 ...