Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
85 / 12 / 1
Регистрация: 24.05.2010
Сообщений: 589
1
.NET 4.x

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

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

Привет!

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

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
5194 / 3409 / 1428
Регистрация: 09.05.2015
Сообщений: 8,326
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
8314 / 4537 / 1772
Регистрация: 11.02.2013
Сообщений: 9,614
09.01.2018, 15:49 3
Если вдруг у тебя в файле несколько пространств имён, то юзинги из одного не будут видны в другом.
0
Wanna be serious
580 / 469 / 184
Регистрация: 31.07.2013
Сообщений: 1,691
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
15369 / 11652 / 3056
Регистрация: 17.09.2011
Сообщений: 19,503
09.01.2018, 16:36 5
Цитата Сообщение от V0fka Посмотреть сообщение
В чем разница?
Типы ищутся "изнутри", начиная с наибольшей вложенности (с некоторыми исключениями).
Пространство, подключенное "ближе" к месту использования будет просканировано на наличие типа раньше, чем пространство, подключенное "дальше".
1
85 / 12 / 1
Регистрация: 24.05.2010
Сообщений: 589
09.01.2018, 17:11  [ТС] 6
Спасибо всем за ответы! Задам уточняющий вопрос: когда может появиться необходимость подключать пространство имен внутри другого пространства имен? Ведь можно подключать в начале файла, тогда проблем с видимостью вроде быть не должно ни у кого.
0
Эксперт .NET
15369 / 11652 / 3056
Регистрация: 17.09.2011
Сообщений: 19,503
09.01.2018, 17:46 7
Цитата Сообщение от V0fka Посмотреть сообщение
когда может появиться необходимость подключать пространство имен внутри другого пространства имен?
Когда два класса с одинаковыми именами объявлены в двух разных пространствах, оба пространства подключены, но использовать нужно класс из какого-то конкретного пространства.
Как вариант для такого типа можно создать алиас.
3
8314 / 4537 / 1772
Регистрация: 11.02.2013
Сообщений: 9,614
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
2347 / 1768 / 209
Регистрация: 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
5194 / 3409 / 1428
Регистрация: 09.05.2015
Сообщений: 8,326
09.01.2018, 19:49 10
Цитата Сообщение от zewer Посмотреть сообщение
Так писать вообще нельзя
Да ладно, с чего бы это?
Там конечно ошибка была в примере, второе пространство имен по задумке должно было называться MyNamespace2 (отредактировать не получилось из-за тупых ограничений форума на редактирование постов в 5 минут), а в остальном все верно.
0
2347 / 1768 / 209
Регистрация: 07.01.2011
Сообщений: 10,342
09.01.2018, 19:58 11
Someone007, если не ошибаюсь, Code Convention запрещает такую конструкцию.
Нельзя подключать директивы под пространством имен, только над!
0
667 / 213 / 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
2347 / 1768 / 209
Регистрация: 07.01.2011
Сообщений: 10,342
09.01.2018, 20:19 13
dailydose, у меня так же стоит StyleCop, и он так же мне предлагает вставить под.
Уточнял у людей, "которые не ноунеймы", они сказали - "низзя".
1
667 / 213 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
09.01.2018, 21:13 14
Цитата Сообщение от zewer Посмотреть сообщение
они сказали - "низзя".
ну хорошо, пойду стайлгайд почитаю

Цитата Сообщение от zewer Посмотреть сообщение
у меня так же стоит StyleCop, и он так же мне предлагает вставить под.
зачастую он и не правильно подсказывает некоторые моменты, я их отключаю чтобы впредь не отвлекаться на них
0
Эксперт .NET
9215 / 6589 / 1072
Регистрация: 21.01.2016
Сообщений: 24,903
10.01.2018, 05:52 15
Цитата Сообщение от zewer Посмотреть сообщение
Уточнял у людей, "которые не ноунеймы", они сказали - "низзя".
Вы бы сами попробавали, что ли...
1
Эксперт .NET
7603 / 5084 / 1213
Регистрация: 25.05.2015
Сообщений: 15,487
Записей в блоге: 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
85 / 12 / 1
Регистрация: 24.05.2010
Сообщений: 589
10.01.2018, 15:10  [ТС] 17
Всем спасибо за ответы! Теперь вроде понятно.
0
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® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.