C#系统命名空间 - 为什么需要导入它?

3
在C#中,如果我使用类型别名,比如string,而不是(System.String),那么我就不需要添加using System;指令——它可以编译通过。
然而,如果我将类型从别名更改为显式的别名类型-System.String,那么在没有using指令的情况下,它将无法编译。这似乎适用于所有基本类型(int/Int32bool/Boolean)等。
为什么当使用别名时编译器会为我导入System,但使用实际类型名称时却不会呢?

很可能是因为它们是别名和保留字,而clr知道它们是什么。还因为有人决定这样做。 - TheGeneral
1
问题提交给微软,这是他们开发框架的方式。也许你可以看一下这个问题:https://dev59.com/O3VD5IYBdhLWcg3wWaRh#48120399,它有很多关于相同主题的讨论(主要是关于string和System.String的区别)。 - Arunprasanth K V
2
编译器在使用别名时不会“导入”System。这就像你在写string时实际上是在写System.String(尽管你在第二段开头所说的话与此相反,但它确实可以在没有using的情况下编译)。没有System.前缀的String是不能编译的。 - Damien_The_Unbeliever
我已经想到这与本地类型和装箱类型有关。System.String是一个带有优化属性的类或结构,可以帮助编译器优化开销吗?而string则是语言定义的一部分。这类似于Java的工作方式。装箱和拆箱。但我不认为Java会优化/内联它们以使它们相同。.net core将帮助您确定是否是这种情况。 - TamusJRoyce
3个回答

1

实际上,stringSystem.String之间几乎没有区别,但是C#关键字String映射到.NET类型System.String - 它是一个保持语言命名约定的别名。

此外,string是一个关键字(在这种情况下是一个别名),而String是一种类型。

注意:如果您使用Visual Studio 2015或更高版本并尝试使用String,程序会建议您“简化代码”,将其转换为string

因此,您可以避免使用System.String并使用string,没有问题。

enter image description here


1

别名更像是每个文件的顶部,编译器插入的东西

using string = System.String;
using int = System.Int32;
using decimal = System.Decimal;

等等。

我不认为编译器实际上是这样实现内置别名的1,但这就是总体效果。当您使用using alias directives时,您不需要为其封闭命名空间也使用using指令,并且它不会将其封闭命名空间也引入作用域。


1我的Roslyn github存储库搜索技巧让我失望了。


这很有道理 - 它不是导入命名空间,而是给完全限定的类型名称取别名。注意! - thisextendsthat

0

只有在不使用类型的完整限定名称时,才需要导入命名空间:

namespace Test {
  class Cxx {
     public System.String _exampleField; 
  }
}

与:

using System;

namespace Test {
  class Cxx {
     public String _exampleField; 
  }
}

你可以使用别名从命名空间中导入单个类型。

内置的别名与您编写的别名类似; 如果您有自己的别名而不是内置别名string,则无需导入整个System命名空间:

using mystring = System.String;

namespace Test {
  class Cxx {
     public mystring _exampleField; 
  }
}

如果您只使用具有别名的 System 命名空间中的类型,则不需要导入。

namespace Test {
  class Cxx {
     public string _exampleField; 
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接