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

C#为什么代码编译时不包含任何空格,c#,C#,我尝试了以下方法 // no using statements here, not even using System; class Program { static void Main(string[] args) { string[] arr = new string[3] { "A" , "B", "C" }; } } 我的问题很简单,即使没有任何USE语句,为什么编译器能够编译这个,更具体地说,不应该有编译时错误,因为

我尝试了以下方法

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

class Program
{
    static void Main(string[] args)
    {
        string[] arr = new string[3] { "A" , "B", "C" };
    }             
}
我的问题很简单,即使没有任何USE语句,为什么编译器能够编译这个,更具体地说,不应该有编译时错误,因为我试图构建一个数组和系统。数组是不可访问的


谢谢。

您没有直接引用
数组
类或其成员,因此编译器不会抱怨您试图引用未使用的命名空间或类型。您只是使用C语言本身的一部分表示法来生成数组。

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

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

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

  • 行动
  • Func
  • 控制台

由于您不想在命令提示符下写入内容,也不想使用
DateTime
创建操作,甚至不想请求日期,因此不需要导入任何内容。

您不需要按名称引用任何名称空间的类型,而是指您的类型(
程序
类)


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

使用语句不包含任何内容或提供任何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文档,您似乎对使用
的含义有误解。
using
指令用于在编译时确定简单名称在程序中的含义。当你用Foo说
这意味着“如果此程序的文本使用简单的名称
Bar
,并且名称
Bar
似乎不在使用该名称的范围内,那么请尝试检查命名空间
Foo
中是否有名为
Bar
的类型。”

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


使用
一点也不意味着“此程序使用需要在此程序集中找到类型的功能”,这就是您认为它的意思<代码>使用
指令只涉及(1)简单名称解析和(2)扩展方法名称解析。

我认为这不是问题所在。System.String如何访问?我将鼠标悬停在语句中的字符串[]部分上,它显示“class System.string”@Amit:
string
是一个关键字,而like
[]
是语言的一部分,所以原因相同。@Amit,它是语言的一部分,这是一个核心功能。他在问为什么代码编译时不使用字符串,即使他正在生成一个字符串数组。如果你使用
String
而不是
String
,你会得到你期望的错误。@Henk Holterman:他会得到一个错误,但我认为这不是他期望的错误。