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错误?
答案 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的部分类。