【问题标题】:How do I use the C#6 "Using static" feature?如何使用 C#6“使用静态”功能?
【发布时间】:2015-10-29 09:39:52
【问题描述】:

我正在查看几个new features in C# 6,具体来说, “使用静态”

using static 是一种新的 using 子句,可让您将类型的静态成员直接导入作用域。
(博文底部)

根据我找到的几个教程,想法如下,
而不是:

using System;

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

您可以省略重复的 Console 语句,使用 C# 6 使用静态类的新特性:

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博客的例子不正确吗?为什么这不起作用?


博客文章现已更新以反映最新更新,但这里有一个屏幕截图,以防博客出现故障:

【问题讨论】:

    标签: c# visual-studio-2015 static using c#-6.0


    【解决方案1】:

    自从写了这些博客文章后,语法似乎略有变化。正如错误消息所示,将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>
    }
    

    using static System.Math时,你可以使用Abs();
    但是,您仍然必须添加前缀 PI,因为它不是静态成员:Math.PI;

    从 C# 版本 7.2 开始,不应该是这种情况,const 值如 PI 也可以使用。

    【讨论】:

    • 我遇到了类似的问题,但使用的是System.Math,特别是Math.PI。当我使用using static System.Math 时,像Sqrt() 这样的方法可以工作,但不能像PI 这样的常量。我必须继续写Math.PI 否则代码无法编译。我很好奇为什么这不起作用。我应该为此提交一个新问题吗?
    • @skwear:这听起来像是一个新问题的材料,是的。
    • 作为对@skwear 问题的快速回答:"using static 是一种新的 using 子句,可让您导入 static 成员 <...>"。 PI 不是 Math 类的 static 成员。这是一个常数。简单地说:成员必须声明为static
    • 听起来像是一个新语法的机会,例如:using const System.Math; :)
    • 微软文档中的示例声称 PI 可以不带前缀使用:docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
    【解决方案2】:

    using 语句中的 static 关键字将仅导入一个指定类型(并且它是嵌套类型)。此外,您不能再提供类型名称。因此,只需将静态添加到您的使用中即可。

    注意:请仅当两个类在逻辑上密切相关时才使用此功能,否则将很难阅读代码。

    【讨论】:

    • “你不能给类型名称” 你是什么意思?我在哪里做的?
    • Thobias,我不会在任何地方将两者结合起来。
    • @Cerbrus 哦,'as you did' 的上下文意外改变了,会解决这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    相关资源
    最近更新 更多