如何使用C#6的"Using static"特性?

170

我正在查看C# 6中的一些新功能,具体来说是"using static"

using static是一种新的using子句,它使得您可以直接将类型的静态成员导入到作用域中。
(博客文章底部)

根据我找到的几个教程所述,其想法如下:
不再是:

using System;

class Program 
{ 
    static void Main() 
    { 
        Console.WriteLine("Hello world!"); 
        Console.WriteLine("Another message"); 
    } 
}

通过使用C# 6的静态类功能,您可以省略重复的Console语句:

using System.Console;
//           ^ `.Console` added.
class Program 
{ 
    static void Main() 
    { 
        WriteLine("Hello world!"); 
        WriteLine("Another message"); 
    } // ^ `Console.` removed.
}

然而,这对我似乎并没有起作用。在using语句上出现了错误,提示:

"'using namespace'指令只能应用于命名空间;'Console'是一种类型,而不是命名空间。考虑使用'using static'指令。"

我正在使用Visual Studio 2015,并将构建语言版本设置为"C# 6.0"

怎么回事?Msdn博客的示例有误吗?为什么不能正常工作?


该博客文章现已更新以反映最新的更新情况,但以下是一张截图,以防博客失效:

blog

2个回答

238

看起来自那些博客文章以来,语法已经稍微改变了。正如错误信息所示,将 static 添加到您的包含语句中:

using static System.Console;
//      ^
class Program 
{ 
    static void Main() 
    { 
        WriteLine("Hello world!"); 
        WriteLine("Another message"); 
    } 
}

然后,您的代码将被编译。


请注意,在C# 6.0中,这仅适用于声明为static的成员。

例如,考虑System.Math

public static class Math {
    public const double PI = 3.1415926535897931;
    public static double Abs(double value);
    // <more stuff>
}

使用static System.Math时,您可以直接使用Abs();。但是,您仍然需要为PI添加前缀,因为它不是静态成员:Math.PI;

从C#版本7.2开始,这不再是必需的,像PI这样的const值也可以使用。


3
我也遇到了类似的问题,但是是和 System.Math 中的 Math.PI 常量有关。当我使用 using static System.Math 时,Sqrt() 这样的方法可以正常工作,但是像 PI 这样的常量却不能用,必须继续写 Math.PI 才行,否则代码就编译不过。我很好奇为什么会出现这种情况,是否应该提一个新问题来询问? - skwear
6
@skwear:听起来像是一个新问题的素材,没错。 - Cerbrus
2
作为对@skwear问题的快速回答:“使用static是一种新的使用从句,它允许您导入静态成员<...>”。PI不是Math类的静态成员,而是一个常量。简单来说:该成员必须声明为static - Cerbrus
3
听起来像是一个引入新语法的机会,例如:using const System.Math; :) - Filip Skakun
1
Microsoft文档中的示例声称PI可以无需前缀使用:https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-static - Guney Ozsan
显示剩余10条评论

4
using语句中的static关键字仅导入一个指定类型(及其嵌套类型)。此外,您不再需要给出类型名称。只需将static添加到using中即可。
注意:请仅在两个类在逻辑上密切相关时使用此功能,否则会使代码阅读起来很困难。

“你不应该给出类型名称。”这是什么意思?我在哪里做了这件事? - Cerbrus
Thobias,我没有在任何地方将它们结合起来。 - Cerbrus
@Cerbrus 噢,“as you did”的上下文意外地改变了,我会修复它。 - Tobias Brohl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接