C#名称空间如何与文件和文件夹中程序的物理表示相关?
当使用using指令时,例如:
using MyNameSpace;
C#编译器在哪里查找该命名空间?是否有一些文档涵盖逻辑实体(如命名空间和类与其物理表示形式)之间的关系?
我的.csproj文件只包含
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp1.1</TargetFramework>
</PropertyGroup>
</Project>
然而,它似乎编译了项目中的所有.cs文件。我正在使用Visual Studio Code并希望了解正在发生的魔术。
答案 0 :(得分:2)
“C#编译器在哪里查找该命名空间?” 在每个添加到项目中的Reference中。其中很多都是自动添加的。请记住,仅使用屏蔽使您不必为该命名空间中的每个类编写完全限定名称。它鼓励你写“myClass1”而不是“MyNameSpace.myClass1”(Every.Single.Time)。您有时甚至可能会编写完全限定的名称(例如,当您使用多个带有计时器类的命名空间时 - 在.NET中有3个)。
“是否有一些文档涵盖逻辑实体(如命名空间和类与其物理表示的关系)?” 您将一些MSIL编译的代码放入您的项目参考中。然后,您可以使用该compliation中定义的所有命名空间以及这些命名空间中定义的所有类。请注意,.NET dll和.NET可执行文件都是有效的引用。 .NET builddetable内部是一个.NET dll,带有清单,引导代码和代码中的“入口点”。
答案 1 :(得分:2)
与Java不同,编译器不要求文件遵循与命名空间相同的结构,也不要求文件名与类名匹配。
我认为将文件命名为类名称仍然是好样式,这是VisualStudio在使用新类向导时默认使用的。如果在项目的文件夹中创建类,VisualStudio也将默认使用将基本命名空间与文件夹名称组合在一起的命名空间。
答案 2 :(得分:0)
.NET核心指南中的页面Additions to the csproj format for .NET Core解释了.csproj文件中引用的SDK包含用于在项目中查找源文件的globbing表达式(即**/*.cs
)的定义