我尝试了以下
// 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无法访问?
感谢。
答案 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.String
和System.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