Подтвердить что ты не робот

Является ли System.Collections "пространством имен пространства имен System"?

Хорошо, поэтому я читал книгу на С# и .NET и изучая структуру DateTime и следующий код:

DateTime dt = new DateTime(2015, 10, 17);

Я спросил себя: "Почему мне не пришлось ссылаться на него сверху, написав using System.DateTime"?

Итак, я понял, что поскольку DateTime является структурой, а ключевое слово "using" используется для ссылки типов (тип является общим термином для ссылки на элемент из набора {класс, интерфейс, структура, перечисление, делегат)), определенный в определенном пространстве имен (в этом случае DateTime имеет структуру типов из пространства имен систем).

Но я заметил, что в верхней части моего файла найдены следующие директивы (они были добавлены автоматически, когда я создал приложение консоли С#):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

Мне было интересно, зачем нужны директивы по использованию, которые следуют за using System, когда они не все находятся под пространством имен System, и поэтому они уже должны ссылаться?

Итак, я предполагаю, что все те, которые указаны ниже, являются пространствами имен, в отличие от типа из набора {class, interface, structure, enumeration, delegate}. Но было бы неверным ссылаться на них как на "пространства имен OF (или принадлежащие) к системе пространств имен", и если да, то почему вы должны явно ссылаться на пространства имен пространства имен, вместо того, чтобы они неявно включались в using System

Надеюсь, мой вопрос был ясен, но если нет, сообщите мне, чтобы я мог его редактировать.

4b9b3361

Ответ 1

Внутренне все типы .net всегда имеют полные имена типов;

System.DateTime
System.Collections.Generic.Dictionary<string, int>
System.Threading.Tasks.Task

то, что делают "употребления", это позволить вам "невидимо" ссылаться на все до ".". персонаж. Поэтому, когда вы пишете

DateTime

С# попробует

System.DateTime
System.Collections.Generic.DateTime
System.Linq.DateTime
System.Text.DateTime
etc...

Поскольку существует только один (System.DateTime), это однозначное совпадение, а С# знает, о чем вы говорите.

Если бы было два совпадения, вы получили бы ошибку компилятора об этой двусмысленности. Итак, если есть System.Threading.Task.DateTime, ваша программа не будет компилироваться.

Все это задает сцену для ответа на ваш вопрос. Если

using System;

включил все под ним, тогда было бы трудно обеспечить, чтобы вещи не были двусмысленными. Например, если вы хотите провести различие между двумя теоретическими классами

System.WebPages.Button
System.Desktop.Button

тогда простой старый using System не играл бы хорошо с new Button().

Ответ 2

Причина в том, что если бы это было не так, у вас не было бы способа избежать нежелательных конфликтов имен при определенных обстоятельствах. Например, если у вас есть пространство имен Baz в Foo и пространство имен Baz in Foo.Bar, вам всегда нужно полностью квалифицировать свои типы, например. Foo.Baz или Foo.Bar.Baz, в вашем коде, что делает директивы using бессмысленными.

Учитывая, что это так, вам нужно иметь дело только с конфликтами имен, если на самом деле есть директивы using для обоих пространств имен, которые содержат ваш тип.

Ответ 3

Вам не обязательно иметь другие директивы, например. если вы хотите Список, который вы могли бы просто объявить в своем коде:

System.Collections.Generic.List<String> listOfStrings = new System.Collections.Generic.List<String>;

Чтобы создать новый список, но оператор using позволяет просто объявить его как:

List<String> listOfStrings = new List<String>;

Причина, по которой вы не можете использовать последнее:

using System;

Это потому, что в System под названием List может быть класс, а также класс List в System.Collections.Generic. Если да, когда вы создаете новый объект списка, как он знает, к какому классу списка вы обращаетесь?

По сути, они используются для предотвращения конфликтов имен и для того, чтобы программисты могли группировать вещи в логически названные группы, например. классы ввода и вывода можно найти в System.IO

Ответ 4

Создайте директиву использования, чтобы использовать типы в пространстве имен без указания пространства имен. Директива using не дает вам доступа к любым пространствам имен, которые вложены в указанное пространство имен.

от https://msdn.microsoft.com/en-us/library/sf0df423.aspx

То же самое происходит, когда мне присваиваются пространства имен, вызывающие мою структуру папок, например projectName\Code\DBFiles, если я использую Code; на одном из моих контроллеров он не дает мне классы доступа в DBFiles, поэтому я задал все пространства имен классов в корневое пространство имен.