C# 为什么我们需要像在.NETCore中使用System那样不断声明基本包

C# 为什么我们需要像在.NETCore中使用System那样不断声明基本包,c#,.net-core,C#,.net Core,在开始学习.Net Core时,我无法理解为什么.cs文件需要继续导入系统包,而它们本来应该是.Net Core的一部分 我不必在ColdFusion中导入任何此类内容,因为系统操作和DB连接等都是框架的一部分。当然,System是.Net核心的一部分,那么为什么我必须不断地在我的文件中添加一些基本的东西,比如使用System 如果你想让你的代码使用一个类型,那么在编译成的IL(字节码)中,你需要提到它的全名。您不能说字符串,或控制台,因为这些类型不存在;它们的名称分别是System.Strin

在开始学习.Net Core时,我无法理解为什么.cs文件需要继续导入系统包,而它们本来应该是.Net Core的一部分

我不必在ColdFusion中导入任何此类内容,因为系统操作和DB连接等都是框架的一部分。当然,
System
是.Net核心的一部分,那么为什么我必须不断地在我的文件中添加一些基本的东西,比如使用System

如果你想让你的代码使用一个类型,那么在编译成的IL(字节码)中,你需要提到它的全名。您不能说
字符串
,或
控制台
,因为这些类型不存在;它们的名称分别是
System.String
System.Console

这就是.NET是如何从头开始设计的;使用部分名称进行分类。这转化为“名称空间”,请参阅

A使命名空间的一部分在使用它的文件中可用,因此不必重复整个名称:

using System;

class Foo
{
    String Bar;
}
现在,C编译器检查文件中的所有名称空间,并找到
System.String

但是
System.String
并不是一个很好的例子,因为C#有一个内置的别名:
String
(小写
s
)。以下代码等效:

class Foo
{
    string Bar;
}
您的部分困惑似乎也源于这样一种信念,即使用指令与引用相同,但这是一种常见的错误信念

默认情况下,如果编译一个C#项目,它已经引用了核心库(mscorlib、BCL,给它一个名称),因此代码可以访问其中的类型。否则,编译器会抱怨找不到
System.String
。它确实引用了它,所以它知道在哪里找到类型以及它的外观,但是您仍然需要添加一个using指令或使用它的全名


请参阅。

这不是导入!这只是一个速记。您可以简单地使用完全限定名,而不使用
计算器。向项目添加引用可以称为导入。但这是在项目级而不是文件级管理的。因为名称空间在多年后被侵入PHP,C#从一开始就拥有它们。使用
语句不会导入包,它使名称空间可用。这些东西是分开的。
System
中的大多数类都是.NET Core的一部分,从这个意义上讲,根本不需要添加任何包来使它们可用,但是您仍然需要显式地声明名称空间。为什么?考虑一个类,如<代码>定时器< /代码>。您想要
System.Threading.Timer
System.Timers.Timer
还是
System.Windows.Forms.Timer
?如果发生冲突,您是想负责重命名它们,还是将它们放在显式名称空间中是个好主意?如果您发现C#不适合您使用它进行的编程任务,幸运的是,它很容易切换到另一种语言。如果C#的设计者熟悉PHP,毫无疑问他们会想出类似的方法。对于字符串,这实际上是一个转移注意力的问题:最基本的类型在C#中有显式别名(
string
),因此实际上不需要导入名称空间。但对于比这更先进的东西,C#选择了一致性而不是简洁性。IDE支持主要使这成为一个问题。