.Net 4.0中名称空间声明的错误或新约定

时间:2010-07-13 10:49:44

标签: .net namespaces conventions

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 个答案:

答案 0 :(得分:6)

从.NET 1.0开始,可以在命名空间中放置using指令。这样做是为了避免名称空间污染,因为using指令包含的类型只在包含using语句的名称空间内可见。所以他们只是改变了代码生成器,以遵循建议的做法,将using指令放在最深的命名空间中。将using指令放在任何命名空间之外会在全局根命名空间中执行include。

有关详细信息,请查看StyleCop规则SA1200

<强>更新

答案有点不准确 - using指令的位置是C#的东西,因此它应该读取“是可能的,因为C#1.0”而不是“是从.NET 1.0开始“

答案 1 :(得分:3)

using指令放在namespace是内部Microsoft代码样式约定的一部分(由StyleCop强制执行)。我个人无法忍受,但事实就是这样。我认为我说的唯一情况是,如果你有相同的代码文件中定义的多个类(在不同的名称空间!),这是正确的,这被广泛认为一个禁忌。

我认为,自C#1.0以来,语法是可以接受的。

答案 2 :(得分:3)

在命名空间中使用语句(基于StyleCop规则)一直是惯例,但Visual Studio中的默认模板将它们放在外面,这已成为最常见的用法。

有一个很好的理由可以解释为什么自动生成的文件将using语句放在命名空间中:它会影响解析引用的顺序。如果您在MyCoolProject.Web命名空间中定义了一个类,该类与Columbus.Web.Data中使用的类共享名称,那么如果使用的是外部或Columbus.Web,则该类的使用将解析为MyCoolProject.Web.Class。如果使用内部,则为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 :(得分:0)

我不确定这是一个潜在的原因,但要注意,至少在.NET 3.5中,如果你在你的命名空间块之外声明你的使用块,那么就会导致Linq to SQL无法工作的错误DataContext的部分类。