global using 的另类用法

前言

global using 指令在 C# 10 中被引入,意味着 using 将应用于编译中的所有文件(通常是一个项目)。.

比如:

global using System.Text;

则在同一项目的其他位置,可以直接使用 System.Text 下的所有类型而无需再次声明 using

另外,可以创建using 别名指令,以便更易于将标识符限定为命名空间或类型。

比如:

using dt = System.DateTime;

则可以直接使用 dt.Now 来代替 System.DateTime.Now 。

并且,上述 2 个指令可以结合在一起使用:

global using dt = System.DateTime;

使用别名要小心,如果别名是一个已使用的名称,则容易造成错误:

global using DateTime = System.Text.Encoding;

global using 的另类用法

但是,反过来想:

如果上面的 Encoding 包含了 Now 的定义,是不是就可以替换掉现有的 DateTime.Now 实现呢?

Demo

新建一个 .cs 文件,在顶部使用 global using 设置 DateTime 为别名:

global using DateTime = ConsoleApp1.MyIODateTime;

在 MyIODateTime 中同样实现 Now 属性:

public static class MyIODateTime
{
    public static System.DateTime Now 
    { 
        get 
        {
            Console.WriteLine("Call from MyIODateTime");
            return new System.DateTime(2022, 1, 1); 
        } 
    }
}

在 ConsoleApp1 中执行 Console.WriteLine(DateTime.Now);,可以发现 DateTime.Now 确实被替换了:

global using 的另类用法

结论

这个另类用法可以用于,代码中已经使用了大量某个第三方类库,但是需要进行紧急替换的场景。