题
我的背景主要是作为一个Java开发,但最近我一直在做一些工作。网。所以我一直在试图做一些简单的项目,在家庭获得更好的工作。网。我已经能够转移我的Java的经验成工作。网(具体地C#),但唯一具有真正困扰我的是名字空间。
我知道名字空间的类似Java包,但是为什么我可以告诉的主要区别是,与Java包,他们使用的实际文件夹中的文件显示的分离,同时在。净它不和的所有文件存在于单个文件夹和空间是简单地宣布在每个类。
我找到这个奇怪的,因为我总是看到的软件包作为一种方式来组织和集团有关代码,使它更容易导航和理解。由于中。净它不工作,这项工作过这种方式,加班费,该项目将出现更多拥挤和不易于浏览。
我失去了一些东西在这里?我必须要。我应该打破东西成单独的项目内的解决办法?或者是有更好的办法来保持的类别和文件组织了内的一个项目?
编辑:因为布莱尔指出这是很多同样的问题 在这里,.
解决方案
我不能说这是一个最佳做法,但我经常看到的文件的组织目录中的层次结构,反映该名称空间。如果它符合您的心理模型的代码的更好的,那么这样做-我想不出任何伤害。只是因为。网模式不能强制执行之间的关系的名称空间、项目和目录的结构并不意味着你不可以有这种关系如果你想要的。
我会一点点猜疑破坏了代码进入更多的项目比你需要的,因为这可以减缓汇编,并添加一点小小的开销时需要管理多个组件。
编辑:注意这个问题几乎是重复的 应该文件夹中的一个解决方案相匹配的名字空间?
其他提示
是的,在。净的名字空间并不取决于文件系统或其他任何东西。这是一个很大的优势在我的意见。例如你可以把你的代码在不同组允许的灵活分配。
工作时Visual Studio,IDE倾向于引入新的名字空间时增加新的项目文件夹树。
这是一个有用的链路,从MSDN:
一般的规则的命名的命名空间 是用的公司名称后 技术名称和任选的 功能和设计如下。
公司名称.TechnologyName[.功能][.设计]
当然你也可以使用的名字空间的方式找到更加适合。但是如果你想分享你的代码,我会建议同接受的标准。
编辑:
我强烈推荐给任。网开发人员得到一个副本 框架的设计准则 这本书会帮你要了解 如何 和 为什么 .网络设计的。
VS解决方案通常包含一个或多个项目。这些项目已经默认的名称空间(通常是空间仅仅是名称的项目)。通常情况下,如果添加一个文件夹内的项目中,所有课程中,它将被命名如下:
DefaultNamespace.文件夹名称.ClassName
当然,你可以改变的默认的名字空间的项目,和你的课程被点名的任何方式你的愿望。
尽当/如何打破东西进入项目,这是一个问题的经验和/或偏好。但是,你绝对应该打破东西到项目的内的一个解决方案,以保持项目组织的。如果管理太多的组件变得麻烦(如布莱尔的建议),总是可以 ILMerge 你的集成一个单一的组装。什么是伟大的约ILMerge是即使你只是一个组件,所有的课程保持其原有的完全合格的名称。
同样重要的是要记住,一个VS解决方案没有关码-ie。他们没有得到建立。VS的解决方案是什么,但一个办法集团项目;这是该项目是建造和变成Dll。
最后,我们添加"虚拟"的文件夹中的任何地方的解决方案。这些文件夹不线图的一个文件夹中的文件系统,只是用作另一个的意思是帮助你组织项目和其他项目内的解决方案。
名称空间是一个合乎逻辑的分组,同时项目都是一个物理分组。
为什么这么重要?想想。网2.0、3.0和3.5..净3.0是基本上。网2.0的一些额外的程序集和3.5增加了几个议会。例如,.净增加了3.5 DataPager
控制,这是一个网络控制,并应以分组在 System.Web.UI.WebControls
.如果名字空间和地理位置是相同的,它不可能是因为它是在一个不同的组件。
所以有名字空间,作为独立的逻辑实体意味着你可以拥有成员的若干不同的组件,这是所有的逻辑分在一组,因为它们是结合使用。
(此外,还有什么错了你的物理和逻辑的布局相当类似。)
事实上,中。净环境允许你把你的代码在IDE/文件系统的喜欢意大利面对墙壁。
这并不意味着这意味着这种做法是健全的,但是。其通常最好坚持project.foldername.Class 办法就是前面提到的。它也是一个真正的好主意,以保持所有的类别从一个名字空间的进入同一类。
在爪哇,你可以不扭曲这样的事情,以及所有的"灵活性",但该工具的倾向,极力阻止它。老实说,一个最混乱的东西对我来说,在被介绍的。净的世界是如何草率/不一致,这可能是由于相对贫穷的指导。其易于组织事三立有一点点认为,虽然。:)
差异。净的名字空间有什么都没做java包。
.网名称空间是纯粹的管理声明的范围,并且没有任何与文件、项目或其位置。
这是非常简单的一切宣布的在特定名称空间是可访问的时候 你可包括'使用的',名称空间。
很容易的。
名称的选择和是否或不/多少'.'你分离器的使用是完全由你决定。
VS默认。foldernames到你的名字空间的只是试试和有帮助的。
这篇文章说明了名字空间的非常好:http://www.blackwasp.co.uk/Namespaces.aspx
它也有一个例子命名《公约》朝向结束,尽管你的名称《公约》是你的电话!;)
这就是说,大多数地方,我一直在和人们我已经开始用公司的名字,是明智的,因为它使typenames为,公司不同,(独立于其他图书馆、供应商、开放源代码projcts等)。
你可以添加的文件夹到你的解决方案的每个名字空间。虽然它仍将汇编到一个可执行的,它举办源文件和使(我认为是)预期的效果?
我通常会增加一个文件夹中的每个名字空间,在我的项目,并巢他们根据相同的层级(MyApp。图。对话框例如)
名字空间的纯粹是语义。虽然他们通常不反映一个文件夹结构,至少在使用Visual Studio IDE,他们不需要。
你可以有同样的名字空间所引用的多个图书馆,丑陋的,但真实的。
我一直认为源文件的组织和分配标识的课程,对象是两个单独的问题。我倾向于保留有关的类团体,但不是每个小组应该是一个名字空间。名字空间的存在(或多或少的)解决该问题的名称冲突中的平-的名字空间的语言,如C、你不能走两个的脚没有绊倒像标识符 mycompany_getcurrentdate
或 MYCGetCurrentDate
, 因为危险的冲突的另一个功能在一个第三方(或系统)图书馆的是,要小得多。如果你创建的一揽子或名字空间的用于每一个合乎逻辑的分离,就会(Java例)类的名字像 java.lang.primitivewrapper.numeric.Integer
, ,这是相当多的矫枉过正。