我正在试图弄清楚在C#中预定义了哪些命名空间(而不是程序集)。
开始修改
定义术语预定义。
术语预定义(或预定义)在C#语言规范中使用超过100次。不幸的是,规范从未给出该术语的正式定义。对我来说,如果语言规范定义(即指定)它并保证它将存在,则预定义了某些东西。
结束修改
例如,我创建了以下程序。
class Program
{
static void Main(string[] args)
{
var strings = new System.Collections.Generic.List<string> {
"Foo",
"Bar"
};
strings.ForEach((s) =>
{
System.Console.WriteLine(s);
});
System.Console.ReadKey();
}
}
这是它的.csproj文件。
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<OutputPath>bin\</OutputPath>
</PropertyGroup>
<ItemGroup>
<Compile Include="Program.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
Visual Studio根本没有参与。上面的项目只有两个文件。它在命令行上使用msbuild构建,并作为控制台应用程序运行。
即使我没有引用任何程序集,System.Console
和System.Collections.List<T>
类也可用。所以,我假设System
和System.Collections
命名空间是用C#语言预定义的。
我一直在阅读C#语言规范,以确定预定义了哪些命名空间。它列出了一些预定义的类型,转换和运算符。但它没有列出所有预定义的命名空间。
在C#语言中预定义了哪些名称空间?
修改
Xanatos提供code that I placed into a fiddle。它演示了mscorlib包含56个名称空间。
答案 0 :(得分:7)
您正在使用csc.exe
编译器。基类库中的所有预定义类型都位于文件mscorlib.dll中,编译时默认引用该文件。
所以,你的问题就是那个dll中的定义。 一个开始的地方是:
答案 1 :(得分:3)
您正在混合名称空间和程序集。程序集是已编译代码的容器。 .NET有许多由Microsoft构建的程序集( mscorlib , System , System.Core , System.Data .. 。)是公共语言运行时的一部分。
每个程序集内部都有一些类/结构。通常,这些类按名称空间分组。这不是绝对必要的,但微软,做得好,做到了。现在,这些名称空间通常具有相同的程序集名称( System , System.Data )(但请注意,没有名称空间 System.Core 或 mscorlib )。程序集的命名与内部定义的名称空间之间没有严格的关系。
可以在多个程序集中定义名称空间(系统例如存在于 mscorlib ,系统, System.Core中 ...)。程序集可以包含具有多个名称空间的类( mscorlib 具有 System , System.Collections , System.IO 的类,...)
编译C#程序时, mscorlib 程序集会自动引用为程序集(我不认为可以编译而不引用它)。 C#中没有默认命名空间(您必须使用using
来使用它们,或者使用类的全名,例如System.Console
)
我建议您安装ILSpy并查看各种程序集,以了解它们的组织方式。
在MSDN上,如果你看一下.NET的任何一个类/结构(例如System.Int32),你会看到:
命名空间:系统
程序集:mscorlib(在mscorlib.dll中)
(我会说顺序在概念上是错误的,因为大会应该是第一个,但它并不重要)
如果你真的想要一个由mscorlib“导出”的命名空间列表:
Assembly mscorlib = typeof(int).Assembly;
var hs = new SortedSet<string>();
foreach (Type type in mscorlib.ExportedTypes)
{
hs.Add(type.Namespace);
}
foreach (string ns in hs)
{
Console.WriteLine(ns);
}
现在......如果你想知道哪些类/结构是必要的基于C#规范5.0 ......
通过寻找System.
我找到了这些
System.Object, System.ValueType, System.Array, System.Enum, System.Delegate
System.Exception, System.Type, System.Attribute
System.SByte, System.Byte, System.Int16, System.UInt16, System.Int32, System.UInt32, System.Int64, System.UInt64, System.Char, System.Single, System.Double, System.Decimal, System.Boolean, System.Object, System.String
System.MulticastDelegate (not sure)
System.Void
System.IDisposable
System.Nullable<T>
System.Linq.Expressions.Expression<D>,
System.Collections.Generic.IList<T> (implicit cast from System.Array, not sure)
System.Threading.Tasks.Task (for async/await)
System.Threading.Tasks.Task<T> (for async/await)
System.Runtime.CompilerServices.INotifyCompletion (for async/await)
System.Runtime.CompilerServices.ICriticalNotifyCompletion (for async/await)
System.Action (for await, resumption delegate)
System.Collections.IEnumerable (for collection initializer and foreach)
System.Collections.IEnumerable<T> (for foreach)
System.Threading.Monitor (for lock)
System.IntPtr/System.UIntPtr (specific type for volatile fields)
// These attribute are directly recognized by C#
System.AttributeUsageAttribute
System.Diagnostics.ConditionalAttribute
System.ObsoleteAttribute
System.Runtime.CompilerServices.CallerLineNumberAttribute
System.Runtime.CompilerServices.CallerFilePathAttribute
System.Runtime.CompilerServices.CallerMemberNameAttribute
System.Runtime.CompilerServices.CSharp.IndexerNameAttribute
// These exceptions seems to be "important" for C#
System.OverflowException
System.InvalidOperationException
System.NullReferenceException
System.OutOfMemoryException
System.DivideByZeroException
System.ArrayTypeMismatchException
System.ArithmeticException
System.TypeInitializationException
System.IndexOutOfRangeException
System.StackOverflowException
请注意,除此之外,还有dynamic
所需的类,但我没有在规范中找到它们的任何参考。