在C#语言中预定义了哪些名称空间?

时间:2015-04-07 15:40:35

标签: c#

我正在试图弄清楚在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.ConsoleSystem.Collections.List<T>类也可用。所以,我假设SystemSystem.Collections命名空间是用C#语言预定义的。

我一直在阅读C#语言规范,以确定预定义了哪些命名空间。它列出了一些预定义的类型,转换和运算符。但它没有列出所有预定义的命名空间。

在C#语言中预定义了哪些名称空间?

修改

Xanatos提供code that I placed into a fiddle。它演示了mscorlib包含56个名称空间。

2 个答案:

答案 0 :(得分:7)

您正在使用csc.exe编译器。基类库中的所有预定义类型都位于文件mscorlib.dll中,编译时默认引用该文件。

所以,你的问题就是那个dll中的定义。 一个开始的地方是:

http://referencesource.microsoft.com/#mscorlib,namespaces

答案 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所需的类,但我没有在规范中找到它们的任何参考。