是否可以指定使用指令的作用域?
我有一对夫妇的string
扩展方法在装配A
。在装配B
,我不能,除非我在每个的.cs文件汇编B
添加using A
指令使用这些扩展方法。 有没有一种方法,在B
组装项目配置指定使用的整个组件?类似于C++ stdafx.h
是否可以指定使用指令的作用域?
感谢
using
包括一个命名空间,而不是一个程序集。命名空间没有必要与其程序集具有相同的名称(即使它是通用约定)。
如果您希望在所有程序集中包含字符串扩展名是很自然的事情,因为它们代表了常用的功能,那么只需将它们放在顶级名称空间中即可。 MyCompanyName.MyApplication
。这些范围在同一个或子级名称空间中的任何其他类的范围内。
(这一点假设你所有的命名空间遵循一个共同的根源如MyCompanyName...
下降的普遍做法。)
这是一个grrrreeat解决方案。我没有把顶级命名空间(例如'MyCompanyName.MyApplication'中的'MyCompanyName')包含在内。谢谢! – Goldorak84
这很好澄清程序集vs命名空间,但是,我认为你是向后说明的:这是一个程序集的约定,它的_some_类型具有与程序集共享根名称的名称空间。 (这也是在程序集之后命名程序集清单文件(例如DLL)的约定。这就是为什么[docs](https://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext (v = vs.110).aspx)在描述类型时具有所有的细节。) –
@TomBlodget是的,你是对的。我无法完全想到如何简洁地获得这些信息,但如果您认为可以,请随时编辑。 –
using
导入一个命名空间到目前情况下使用完全合格的名称,以避免引用类等其他结构。
你可以(但一个坏主意)把在装配B中的一个命名空间中的所有构造,这样的话你就只需要一个using
。坏主意是因为代码组织不力等
根据你的程序集B包含,你的字符串扩展函数很可能被放在同一个命名空间(而不像模特其他的东西是单独一个)。这似乎是一个体面的组织。
并且请注意,所有这些扩展函数可以在单独的.cs文件中,并且仍位于同一个命名空间中,因此需要一个声明将其全部导入。
E.g.
ExtensionA.csnamespace AssemblyB.Strings.Extensions
{
public static string ExtensionA(this string source, ...) {...}
}
ExtensionB.cs
namespace AssemblyB.Strings.Extensions
{
public static string ExtensionB(this string source, ...) {...}
}
ExtensionC.cs
namespace AssemblyB.Strings.Extensions
{
public static string ExtensionC(this string source, ...) {...}
}
AssemblyA.cs
using AssemblyBStrings.Extensions;
...
var b = "Hello World".ExtensionA().ExtensionB().ExtensionC();
实际上,我的扩展已经在同一个程序集和命名空间中。我想消除的是需要为每个.cs文件添加'using'指令,因为我知道这些扩展名,但不一定全是我的同事 – Goldorak84
Damien建议我回答不相信有这样的特点。也就是说,RedGate的ReSharper可以帮助它并自动放置使用。因此,如果这是一个开发人员便利的问题,那么它会为您做到,当然还有$。 – LB2
不,目前没有这种功能。
看到组装/项目一级支持什么功能一个有用的方法是看帮助命令行编译器。
Visual Basic使用Import
语句与C#具有using
指令相同,并且具有Project Imports的概念。而且,事实上,当我们在看的vbc /?
的输出,我们可以看到:
- LANGUAGE -
/define:<symbol_list> Declare global conditional compilation
symbol(s). symbol_list:name=value,...
(Short form: /d)
/imports:<import_list> Declare global Imports for namespaces in
referenced metadata files.
import_list:namespace,...
/langversion:<number> Specify language version:
9|9.0|10|10.0|11|11.0|12|12.0|14|14.0
/optionexplicit[+|-] Require explicit declaration of variables.
/optioninfer[+|-] Allow type inference of variables.
/rootnamespace:<string> Specifies the root Namespace for all type
declarations.
/optionstrict[+|-] Enforce strict language semantics.
/optionstrict:custom Warn when strict language semantics are not
respected.
/optioncompare:binary Specifies binary-style string comparisons.
This is the default.
/optioncompare:text Specifies text-style string comparisons.
而且我们可以看到,有是/imports
选项。
如果我们看一下csc /?
相当于一节中,我们看到:
- LANGUAGE -
/checked[+|-] Generate overflow checks
/unsafe[+|-] Allow 'unsafe' code
/define:<symbol list> Define conditional compilation symbol(s) (Short
form: /d)
/langversion:<string> Specify language version mode: ISO-1, ISO-2, 3,
4, 5, 6, or Default
,我们可以看到,有没有相当于/using
//usings
。由此我们可以推断,在编译程序集时,无法通知C#编译器一套using
指令适用于每个文件。
这是一件很奇怪的事情,他们在VB中包含了这个特性,但在c#中却没有。谢谢! – Goldorak84
没有,每一个源代码文件需要自己'usings'从其他访问成员和类型命名空间。没有全局头文件来发布C++中的所有引用,至少在这个意义上并非如此。当您直接看到给定文件存在哪些依赖关系时,可以更轻松地查看成员的定义。 – HimBromBeere
我打算提及VB的项目导入(请参阅@ Damien的[answer](https://stackoverflow.com/a/44287428/2226988))。我将它们全部删除,并在每个文件中只放入该文件所需的Imports指令。一个好的IDE可以帮助管理和代码说明它的含义。 –
@Tom,我同意,但IDE不会检测到你的扩展方法在哪个程序集中就像它在类中所做的那样。 – Goldorak84