Ошибка или новое соглашение для объявления пространства имен в .Net 4.0

Visual Studio 2010, .Net 4.0

Я создаю несколько классов доменных служб, и вот как Visual Studio включает пространства имен:

namespace MyCoolProject.Web.Services
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    using System.Data.Linq;
    using System.Linq;
    using System.ServiceModel.DomainServices.Hosting;
    using System.ServiceModel.DomainServices.Server;
    using Columbus.Web.Data;
    using Microsoft.ServiceModel.DomainServices.LinqToSql;


    // Implements application logic using the JanDoetsDataContext context.
    // TODO: Add your application logic to these methods or in additional methods.
    // TODO: Wire up authentication (Windows/ASP.NET Forms) and uncomment the following to disable anonymous access
    // Also consider adding roles to restrict access as appropriate.
    // [RequiresAuthentication]
    [EnableClientAccess()]
    public class AnnouncementService : LinqToSqlDomainService<MydataDataContext>
    {......................

пространства имен, необходимые этому классу, включены в объявление пространства имен, другими словами, строки using bla bla bla находятся внутри объявления пространства имен MyCoolProject.Web.Services, а не снаружи. Это новое соглашение или ошибка vs2010?


person Community    schedule 13.07.2010    source источник
comment
Юваль рекомендовал против этой практики в программировании компонентов .NET, но я не помню, почему. Эта ссылка выступает против него, однако: .emc.com/anthonysteele/archive/2007/10/12/   -  person kenny    schedule 13.07.2010
comment
Спасибо всем за быстрые ответы и за разъяснение этого вопроса.   -  person    schedule 13.07.2010


Ответы (4)


Размещение директив using внутри пространства имен возможно, начиная с .NET 1.0. Это делается для того, чтобы избежать загрязнения пространства имен, поскольку типы, включенные в директивы using, видны только внутри пространства имен, содержащего операторы using. Поэтому они просто изменили генератор кода, чтобы придерживаться рекомендуемой практики размещения директив using в максимально глубоком пространстве имен. Размещение директив using за пределами любого пространства имен приводит к включению в глобальное корневое пространство имен.

Подробнее см. в правиле StyleCop SA1200.

ОБНОВЛЕНИЕ

Ответ немного неточен — размещение директивы using относится к C#, и поэтому следует читать "возможно, начиная с C# 1.0" вместо "возможно, начиная с .NET 1.0"< /эм>.

person Daniel Brückner    schedule 13.07.2010

Всегда было принято размещать операторы using внутри пространств имен (на основе правил StyleCop), но в шаблоне по умолчанию в Visual Studio они размещаются снаружи, так что это стало наиболее распространенным использованием.

Однако есть веская причина, по которой автоматически сгенерированные файлы помещают операторы использования внутри пространства имен: это влияет на порядок разрешения ссылок. Если вы определили класс в пространстве имен MyCoolProject.Web, который имеет общее имя с классом, используемым в Columbus.Web.Data, то использование этого класса будет разрешаться в MyCoolProject.Web.Class, если использование находится снаружи, или в Columbus.Web. Data.Class, если использование находится внутри. Таким образом, сохраняя операторы использования внутри пространства имен, автоматически сгенерированный код более устойчив к изменениям, которые вы можете внести в проект.

Это не скомпилируется (поскольку класс MyCoolProject.Web.Console не определяет WriteLine):

using System;    
namespace MyCoolProject.Web.Services
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello there");
        }
    }
}

namespace MyCoolProject.Web
{
    public static class Console
    {

    }
}

В то время как это будет:

namespace MyCoolProject.Web.Services
{
    using System;
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello there");
        }
    }
}

namespace MyCoolProject.Web
{
    public static class Console
    {

    }
}
person Martin Harris    schedule 13.07.2010

Размещение директив using внутри namespace является частью внутреннего соглашения Microsoft о стиле кода (в соответствии с требованиями StyleCop). Лично я этого терпеть не могу, но это то, что есть. Я думаю, что прав, говоря, что единственные обстоятельства, при которых это действительно может иметь значение, - это если у вас есть несколько классов (в разных пространствах имен!), Определенных в одном и том же кодовом файле, что широко считается нет-нет.

Я считаю, что это приемлемый синтаксис, начиная с C # 1.0.

person AakashM    schedule 13.07.2010

Я не уверен, что это основная причина, но будьте осторожны, по крайней мере, в .NET 3.5 есть ошибка, из-за которой Linq to SQL не работает, если вы объявляете свой блок использования вне вашего блока пространства имен в вашем частичном классе для ваш Контекст данных.

person Dave Markle    schedule 13.07.2010
comment
Хорошо, это совершенно не по теме, но я просто хочу прокричать это предупреждение с крыш, это чертовски раздражает... - person Dave Markle; 13.07.2010