Какие пространства имен предопределены в языке C #?

1

Я пытаюсь выяснить, какие пространства имен (а не сборки) предопределены в С#.

Начать редактирование

Определите предопределенный термин.

Термин предопределенный (или заранее определенный) используется более 100 раз в спецификации языка С#. К сожалению, спецификация никогда не дает формального определения термина. Для меня что-то предопределено, если спецификация языка определяет (то есть указывает) его и гарантирует, что он будет присутствовать.

End Edit

Например, я создал следующую программу.

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 предопределены на языке С#.

Я читал спецификацию языка С#, чтобы определить, какие пространства имен предопределены. Он перечисляет некоторые предопределенные типы, преобразования и операторы. Тем не менее, он не перечисляет все предопределенные пространства имен.

Какие пространства имен предопределены на языке С#?

редактировать

Xanatos предоставил код, который я разместил в скрипке. Он демонстрирует, что mscorlib содержит 56 пространств имен.

  • 7
    Visual Studio связывает множество библиотек при создании нового проекта, такого как system.dll, system.core.dll и т. Д., Которые будут иметь эти типы. Вы можете написать программу на C #, которая не связана с этими библиотеками. Также обратите внимание, что пространства имен и сборки очень разные; вы путаете эти два термина.
  • 1
    @Servy Я не использую Visual Studio. У меня есть только .csproj и один файл .cs. Я строю с помощью командной строки msbuild.
Показать ещё 16 комментариев
Теги:

2 ответа

7
Лучший ответ

Вы используете компилятор csc.exe. Все предопределенные типы в библиотеке базового класса находятся в файле mscorlib.dll, который по умолчанию упоминается при компиляции.

Итак, ваши вопросы - это то, что определено в этой DLL. Одно место для начала:

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

3

Вы смешиваете пространства имен и сборки. Ассембли являются контейнерами скомпилированного кода. .NET имеет множество сборок, созданных Microsoft (mscorlib, System, System.Core, System.Data...), которые являются частью Common Language Runtime.

Каждая сборка имеет несколько классов/структур внутри. Обычно эти классы группируются в пространствах имен. Это не является строго необходимым, но Microsoft, будучи хорошим, сделала это. Теперь эти пространства имен часто имеют одинаковое имя сборок (System, System.Data) (но обратите внимание, что нет пространства имен System.Core или mscorlib). Существует строгая связь между именами сборок и пространствами имен, определенными внутри.

Пространство имен может быть определено в нескольких сборках (например, система присутствует как в mscorlib, System, System.Core...). Сборка может иметь классы с несколькими пространствами имен (mscorlib имеет классы System, System.Collections, System.IO,...)

Когда вы компилируете программу С#, сборка mscorlib автоматически ссылается как сборка (и я не думаю, что ее можно компилировать без ссылки на нее). В С# нет пространства имен по умолчанию (вы должны использовать 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); 
}

Теперь... если вы хотите узнать, какие классы/структуры необходимы на основе спецификаций С# 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 но я не нашел в них никаких ссылок.

  • 0
    То, что мне интересно, не то, что пространство имен по умолчанию. Вместо этого меня интересует, какие пространства имен доступны, когда я не ссылаюсь ни на какие сборки. Под доступным я имею в виду, какие из них можно использовать с оператором using или с полным именем класса?
  • 1
    @Shaun Список очень длинный. System, System.Collection, System.Collections.Generic, System.Collections.ObjectModel, System.Diagnostics, System.IO, System.Reflection, ... Используйте ILSpy, чтобы посмотреть на mscorlib и убедиться в этом сами.
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню