Я пытаюсь выяснить, какие пространства имен (а не сборки) предопределены в С#.
Начать редактирование
Определите предопределенный термин.
Термин предопределенный (или заранее определенный) используется более 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 пространств имен.
Вы используете компилятор csc.exe
. Все предопределенные типы в библиотеке базового класса находятся в файле mscorlib.dll, который по умолчанию упоминается при компиляции.
Итак, ваши вопросы - это то, что определено в этой DLL. Одно место для начала:
Вы смешиваете пространства имен и сборки. Ассембли являются контейнерами скомпилированного кода. .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
но я не нашел в них никаких ссылок.
using
или с полным именем класса?