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

时间:2019-01-16 09:26:42

标签: c#

在C#中,如果我使用诸如string之类的类型别名而不是(System.String),则无需添加using System;指令-它可以正常编译。

但是,如果我将类型从别名显式更改为别名类型-System.String-如果没有using指令,它将无法编译。所有原始类型(int / Int32bool / Boolean)等似乎都是如此。

为什么使用别名但不使用实际类型名称时,编译器为什么会为我导入System

3 个答案:

答案 0 :(得分:0)

仅当不使用类型的完整合格名称时,才需要导入名称空间:

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

vs:

using System;

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

您可以使用别名从名称空间导入单个类型。

内置别名的工作方式与您编写的别名相似。 如果您拥有自己的别名而不是内置别名string,则无需导入整个系统名称空间:

using mystring = System.String;

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

如果您使用的系统名称空间中仅有的类型是具有别名的类型,则不需要导入。

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

答案 1 :(得分:0)

在编译器正在插入的每个文件的顶部,别名更像“好像”一样

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

等等。

我不相信编译器实际上是如何实现内置别名的 1 ,但这只是整体效果。当您使用using alias directives时,您也不需要为其封闭的名称空间使用using指令,并且也不会将其封闭的名称空间引入作用域。


1 我在Roslyn github存储库中的search-foo让我失望了。

答案 2 :(得分:0)

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

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

注意:如果您使用Visual Studio 2015或+并尝试使用String,则该程序建议您“简化代码”,并将其携带到string

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

enter image description here