C#为什么代码编译时不包含任何名称空间

时间:2011-07-07 17:07:12

标签: c#

我尝试了以下

// no using statements here, not even using System;

class Program
{
    static void Main(string[] args)
    {
        string[] arr = new string[3] { "A" , "B", "C" };
    }             
}

我的问题很简单,即使没有任何使用语句,编译器如何能够编译它,更具体地说,不应该有编译时错误,因为我正在尝试构建一个数组并且System.Array无法访问?

感谢。

8 个答案:

答案 0 :(得分:32)

您似乎对using的含义存在误解。 using指令用于确定简单名称在编译时在程序中的含义。当您说using Foo;表示“如果此程序的文本使用简单名称Bar时,似乎任何名为Bar的内容都不在使用名称的范围然后尝试检查命名空间Bar内是否存在名为Foo的类型。“

您的程序不包含任何简单的名称! (string不是一个简单的名称;它是该语言的关键字。)因此,不需要任何using指令来解析不存在的简单名称。

using并不意味着“此程序使用需要在此程序集中找到类型的功能”,这就是您认为它的含义。 using指令仅涉及(1)简单的名称解析,以及(2)扩展方法名称解析。

答案 1 :(得分:14)

数组是该语言的一部分。您无需引用命名空间即可使用它们。

答案 2 :(得分:6)

编译时,

string[]会转换为System.Array。由于它已经完全合格,因此不需要任何using语句。

答案 3 :(得分:5)

您不是通过名称引用任何命名空间类型,而是您的(Program类)。

string[]分别是System.StringSystem.Array的别名,但使用它们并不需要将对应的名称空间拉入范围。

答案 4 :(得分:3)

您没有直接引用Array类或其成员,因此编译器不会抱怨您尝试引用未使用的命名空间或类型。你只是使用符号作为C#语言本身的一部分来制作数组。

答案 5 :(得分:1)

这是因为你正在使用核心内容,你甚至不需要System来编译它。 System命名空间具有扩展功能,系统命名空间中包含的一些类是:

由于您没有尝试使用DateTime向命令提示符创建内容,创建操作甚至询问日期,因此您无需导入任何内容。

答案 6 :(得分:0)

using语句不包含任何内容或提供任何ekstra代码。它只会使代码更简单,因为您不必每次都写入整个路径。

string会自动转换为System.String。

你可以这样写:

class Foo {
    string Bar() {
        return System.IO.File.Exists("path").ToString();
    }
}

或只是

using System.IO;
class Foo {
    string Bar() {
        return File.Exists("path").ToString();
    }
}

都编译到同一个程序。

答案 7 :(得分:0)

命名空间不是必需的,您可以使用命名空间组织您的代码,但您不必这样做。 常用关键字会自动引用到正确的命名空间。

为了更好地理解,请阅读此msdna文档http://msdn.microsoft.com/en-us/library/ms973231.aspx