与System.ApplicationId混淆;

时间:2016-04-08 04:50:24

标签: c#

阅读并弄乱了解静态类和静态方法以及它们与非静态方法的区别以及它们的用法,除了主要方法之外我可能还没有得到它们,而不能将其作为实例(对象)一堂课。

为什么我尝试使用:

using static System.ApplicationId;

public class Program
{
    static void Main()
    {
        Copy(SOMETHING)// Copy method doesn't exist
    }
}

然后尝试使用 ApplicationId 中的方法,例如Copy();

IDE?无法找到方法?

做同样的事情:

using static System.Console;

public class Program
{
    static void Main()
    {
        Writeline("Hello"); // OK
    }
}

然后尝试从控制台中找到一种方法,例如WriteLine();

它可以找到它,我可以使用它。

为什么会这样?

我的理解是那些都是静态成员?难道我之所以不能创造这两个类的实例吗?然而,我可以使用第二个例子中的方法而不是第一个例子中的方法,因为它似乎不允许我(错误:copy()在当前上下文中不存在......)。 / p>

3 个答案:

答案 0 :(得分:3)

简短的回答是,您不会在static语句中使用using关键字来表示System.ApplicationId等非静态命名空间。 要在非静态(实例)类上使用方法,您必须首先使用new创建它的实例。

tl; dr部分跟随为了避免每次要引用System.时都必须写出命名空间前缀ApplicationId,你可以添加

using System;

然后在课堂上,您可以使用:

访问someMethod()方法
new ApplicationId().someMethod();


现在让我们谈谈静态:
在C#版本6之前,您无法在静态类上使用using语句,因此可以访问静态方法,如

System.Console.WriteLine()

首先使用

添加非静态父(System
using System

然后使用命名空间

引用静态方法
Console.WriteLine

使用using static语法,您可以在Console.语句中为每个类添加命名空间的“using”部分,如下所示:

`using static System.Console;`

然后您可以使用WriteLine()代替Console.WriteLine。我不得不猜测WriteLine()方法必须是此功能的最常见用例。

如果您查看https://msdn.microsoft.com/en-us/library/system.console%28v=vs.110%29.aspx,则表明System.Console是静态类,因此using static是合适的。

但是,System.ApplicationId是非静态的(请参阅https://msdn.microsoft.com/en-us/library/system.applicationid%28v=vs.110%29.aspx),因此您无法使用using static

答案 1 :(得分:2)

答案很简单,ApplicationId中的方法标记为static

让我们看看静态和实例方法之间的区别:

静态方法:

Console.WriteLine();
******* *********
 ^         ^
class    method
name     name

实例方法:

Random aRandomObject = new Random();
aRandomObject.Next();
************* ****
      ^        ^
name of an    method
instance of   name
Random

正如您在此处所看到的,您需要该类的实例才能使用非静态方法。但对于静态方法,您不需要实例。

using static指令允许您在调用静态方法时省略类名。

“但是为什么它不允许我们这样调用实例方法呢?”您询问。如上所述,您需要一个实例来调用实例方法。如果只编写方法名称来调用方法,那么编译器如何知道你要在哪个实例上调用它?

答案 2 :(得分:0)

ApplocationId不是静态类,因此您需要创建它的实例。