Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
1
.NET 4.x

В чем разница между подключением пространства имен в начале файла и внутри другого пространства имен?

09.01.2018, 15:39. Показов 2305. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет!

Есть свой класс:

C#
1
2
3
4
5
6
7
namespace MyNamespace
{
    public class MyClass
    {
 
    }
}
Нужно в нем кое что поделать, например, с использованием регулярных выражений. Для этого нужно подключить соответствующее пространство имен. Сделать это можно вот так:

C#
1
2
3
4
5
6
7
8
9
using System.Text.RegularExpressions;
 
namespace MyNamespace
{
    public class MyClass
    {
 
    }
}
или же вот так:

C#
1
2
3
4
5
6
7
8
9
namespace MyNamespace
{
    using System.Text.RegularExpressions;
 
    public class MyClass
    {
 
    }
}
В чем разница?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2018, 15:39
Ответы с готовыми решениями:

Псевдонимы пространства имён из другого файла
Здравствуйте, помогите разрешить синтаксическую несправедливость. Есть два файла: Файл 1: ...

Как получить доступ к именам пространства имен из другого файла
Помогите мне разобраться: Если определено пространство имен в одном cpp файле, как использовать...

Получить список имен внутри пространства по уровням
Приветствую. Подскажите, пожалуйста, как получить список имен внутри пространства по уровням. ...

Имя типа или пространства имен отсутствует в пространстве имен
Подскажите решение проблемы. Целиком код:

16
Эксперт .NET
6507 / 4084 / 1605
Регистрация: 09.05.2015
Сообщений: 9,548
09.01.2018, 15:43 2
Разница в области видимости... Сравните 2 варианта ниже, один компилится, другой нет...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    using System.Text.RegularExpressions;
 
    namespace MyNamespace1
    {
        public class MyClass
        {
            Regex regex;
        }
    }
 
    namespace MyNamespace1
    {
        public class MyClass
        {
            Regex regex;
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    namespace MyNamespace1
    {
        using System.Text.RegularExpressions;
 
        public class MyClass
        {
            Regex regex;
        }
    }
 
    namespace MyNamespace1
    {
        public class MyClass
        {
            Regex regex; // ошибка...
        }
    }
1
8942 / 4854 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
09.01.2018, 15:49 3
Если вдруг у тебя в файле несколько пространств имён, то юзинги из одного не будут видны в другом.
0
Wanna be serious
587 / 474 / 186
Регистрация: 31.07.2013
Сообщений: 1,693
09.01.2018, 16:26 4
Как сказали выше - разница в области видимости. Но при этом, при компиляции, компилятор подставит полные пути до класса:
C#
1
2
3
4
5
6
7
namespace MyNamespace1
{
    public class MyClass
    {
        System.Text.RegularExpressions.Regex regex;
    }
}
1
Эксперт .NET
17790 / 12941 / 3381
Регистрация: 17.09.2011
Сообщений: 21,215
09.01.2018, 16:36 5
Цитата Сообщение от V0fka Посмотреть сообщение
В чем разница?
Типы ищутся "изнутри", начиная с наибольшей вложенности (с некоторыми исключениями).
Пространство, подключенное "ближе" к месту использования будет просканировано на наличие типа раньше, чем пространство, подключенное "дальше".
1
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
09.01.2018, 17:11  [ТС] 6
Спасибо всем за ответы! Задам уточняющий вопрос: когда может появиться необходимость подключать пространство имен внутри другого пространства имен? Ведь можно подключать в начале файла, тогда проблем с видимостью вроде быть не должно ни у кого.
0
Эксперт .NET
17790 / 12941 / 3381
Регистрация: 17.09.2011
Сообщений: 21,215
09.01.2018, 17:46 7
Цитата Сообщение от V0fka Посмотреть сообщение
когда может появиться необходимость подключать пространство имен внутри другого пространства имен?
Когда два класса с одинаковыми именами объявлены в двух разных пространствах, оба пространства подключены, но использовать нужно класс из какого-то конкретного пространства.
Как вариант для такого типа можно создать алиас.
3
8942 / 4854 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
09.01.2018, 18:13 8
Цитата Сообщение от kolorotur Посмотреть сообщение
Когда два класса с одинаковыми именами объявлены в двух разных пространствах, оба пространства подключены, но использовать нужно класс из какого-то конкретного пространства.
Да-да-да. Пример из жизни: структура Point из System.Drawing (System.Drawing.dll) и из System.Windows (WindowsBase.dll). Для рисования используется System.Drawing, а для вычисления векторов нужно System.Windows. И чтобы не возникало проблем, System.Drawing подключается внутри твоего пространства имён, а System.Windows — снаружи:
C#
1
2
3
4
5
6
7
8
9
10
using System.Windows;
namespace MyNameSpace
{
    using System.Drawing;
    class MyClass
    {
        Point pt = new Point();//Это возьмёт из System.Drawing и не перепутает с System.Windows.Point
        Vector v = new Vector();
    }
}
4
2355 / 1773 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
09.01.2018, 19:44 9
Цитата Сообщение от Someone007 Посмотреть сообщение
C#
1
2
3
4
namespace MyNamespace1
  {
           using System.Text.RegularExpressions;
  }
Так писать вообще нельзя
0
Эксперт .NET
6507 / 4084 / 1605
Регистрация: 09.05.2015
Сообщений: 9,548
09.01.2018, 19:49 10
Цитата Сообщение от zewer Посмотреть сообщение
Так писать вообще нельзя
Да ладно, с чего бы это?
Там конечно ошибка была в примере, второе пространство имен по задумке должно было называться MyNamespace2 (отредактировать не получилось из-за тупых ограничений форума на редактирование постов в 5 минут), а в остальном все верно.
0
2355 / 1773 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
09.01.2018, 19:58 11
Someone007, если не ошибаюсь, Code Convention запрещает такую конструкцию.
Нельзя подключать директивы под пространством имен, только над!
0
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
09.01.2018, 20:18 12
Цитата Сообщение от zewer Посмотреть сообщение
Someone007, если не ошибаюсь, Code Convention запрещает такую конструкцию.
Нельзя подключать директивы под пространством имен, только над!
нишо не знаю, по дефолту решарпер предлагает заменить

C#
1
2
3
4
5
6
using System;
 
namespace ConsoleApp
{
 /* ... */
}
на
C#
1
2
3
4
5
namespace ConsoleApp
{
    using System;
 /* ... */
}
и я как-то больше верю решарперу, нежели ноунеймам

Добавлено через 2 минуты
кстати, тут более годное обсуждение --> https://stackoverflow.com/ques... -namespace
0
2355 / 1773 / 212
Регистрация: 07.01.2011
Сообщений: 10,342
09.01.2018, 20:19 13
dailydose, у меня так же стоит StyleCop, и он так же мне предлагает вставить под.
Уточнял у людей, "которые не ноунеймы", они сказали - "низзя".
1
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
09.01.2018, 21:13 14
Цитата Сообщение от zewer Посмотреть сообщение
они сказали - "низзя".
ну хорошо, пойду стайлгайд почитаю

Цитата Сообщение от zewer Посмотреть сообщение
у меня так же стоит StyleCop, и он так же мне предлагает вставить под.
зачастую он и не правильно подсказывает некоторые моменты, я их отключаю чтобы впредь не отвлекаться на них
0
Эксперт .NET
12309 / 8682 / 1310
Регистрация: 21.01.2016
Сообщений: 32,612
10.01.2018, 05:52 15
Цитата Сообщение от zewer Посмотреть сообщение
Уточнял у людей, "которые не ноунеймы", они сказали - "низзя".
Вы бы сами попробавали, что ли...
1
Эксперт .NET
11070 / 6987 / 1571
Регистрация: 25.05.2015
Сообщений: 21,072
Записей в блоге: 14
10.01.2018, 06:14 16
Using namespace directives

A using_namespace_directive imports the types contained in a namespace into the immediately enclosing compilation unit or namespace body, enabling the identifier of each type to be used without qualification.
Код
using_namespace_directive
    : 'using' namespace_name ';'
    ;
Within member declarations in a compilation unit or namespace body that contains a using_namespace_directive, the types contained in the given namespace can be referenced directly. For example:
C#
1
2
3
4
5
6
7
8
9
10
11
namespace N1.N2
{
    class A {}
}
 
namespace N3
{
    using N1.N2;
 
    class B: A {}
}
C# 6.0 draft specification - Namespaces
1
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
10.01.2018, 15:10  [ТС] 17
Всем спасибо за ответы! Теперь вроде понятно.
0
10.01.2018, 15:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2018, 15:10
Помогаю со студенческими работами здесь

Имя типа или пространства имен отсутствует в пространстве имён
Доброго времени суток. Делаю пример SportsStore из книги "ASP.NET MVC 3 Framework с примерами на...

Обращение к приватному члену класса внутри пространства имён
Здравствуйте. Вот у меня есть код: #include <iostream> #include <conio.h> #include <vector>...

Не возникает ли коллизия имен, если использовать два пространства имен, и в каждом из них будут одноименные?
Вот например namespace nms1 { int gh; } namespace nms2 { int gh;

Имя типа или пространства имен "ProtectedData" отсутствует в пространстве имен System.Security.Cryptography
Такая проблема, пытаюсь собрать проект , но дает ошибки : по идее, они должны идти в комплекте...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru