Ошибка или новое соглашение для объявления пространства имен в .Net 4.0 - PullRequest
2 голосов
/ 13 июля 2010

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>
    {......................

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

Ответы [ 4 ]

6 голосов
/ 13 июля 2010

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

Посмотрите на правило StyleCop SA1200 для получения более подробной информации.

UPDATE

Ответ немного неточен - размещение директивы using - это вещь C #, и поэтому она должна читать "возможно, поскольку C # 1.0" вместо "возможно с тех пор. NET 1,0 ".

3 голосов
/ 13 июля 2010

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

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

Это не скомпилируется (поскольку класс 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
    {

    }
}
3 голосов
/ 13 июля 2010

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

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

0 голосов
/ 13 июля 2010

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

...