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

本文关键字:包含任 何名 空间 为什么 代码 编译 | 更新日期: 2023-09-27 18:01:24

我尝试了以下

// no using statements here, not even using System;
class Program
{
    static void Main(string[] args)
    {
        string[] arr = new string[3] { "A" , "B", "C" };
    }             
}

我的问题很简单,即使没有任何using语句,编译器如何能够编译这个,更具体地说,不应该有一个编译时错误,因为我试图建立一个数组和系统。数组不可访问?

谢谢。

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

你似乎对using的含义有误解。using指令用于确定在编译时程序中的简单名称的含义。当你说using Foo;时,这意味着"如果文本这个程序使用简单的名称Bar,并且似乎没有任何名为Bar的东西在使用该名称的范围内,然后尝试检查名称空间Foo内是否有一个名为Bar的类型"。

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

using根本不意味着"这个程序使用需要在这个程序集中找到的类型的特性",这似乎是你认为它的意思。using指令只涉及(1)简单的名称解析,(2)扩展方法的名称解析。

数组是语言的一部分。您不需要引用名称空间来使用它们。

string[]将在编译时转换为System.Array。因为它已经完全限定了,所以不需要任何using语句。

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

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

您没有直接引用Array类或其成员,因此编译器不会抱怨您试图引用未使用的名称空间或类型。你只是在使用c#语言本身的符号来创建数组

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

  • Func
  • <
  • 控制台/gh>
  • 和更多…

由于您没有尝试向命令提示符写入内容,创建操作或甚至使用DateTime请求日期,因此不需要导入任何内容。

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();
    }
}

名称空间不是必需的,您可以使用名称空间组织代码,但不是必须这样做。通用关键字将自动引用到适当的命名空间。

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