是否可以使用指令指定程序集范围?
Is it possible to specify an assembly scoped using directive?
我在一个程序集中有几个 string
扩展方法 A
。在程序集 B
中,我无法使用这些扩展方法,除非我在程序集 B
中的每个 .cs 文件中添加一个 using A
指令。
有没有办法在 B
程序集项目配置中为整个程序集指定一个 using ?类似于 c++ stdafx.h
谢谢
using
将命名空间导入当前上下文以避免通过完全限定名称引用 类 和其他其他结构。
您可以(但不是一个好主意)将所有结构放在程序集 B 的一个名称空间中,因此您只需要一个 using
。坏主意是因为代码组织不好等
根据您的程序集 B 包含的内容,您的字符串扩展函数可能会放在同一个命名空间中(而模型等其他东西则放在单独的命名空间中)。这似乎是一个体面的组织。
请注意,所有这些扩展函数都可以在单独的 .cs 文件中,并且仍然在同一个命名空间中,因此需要一个 using
声明来导入它们。
例如
ExtensionA.cs
namespace 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();
否,暂无此功能
查看 assembly/project 级别支持哪些功能的一个有用方法是查看命令行编译器的帮助。
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
指令应用于每个文件。
using
包括一个 命名空间 ,而不是程序集。命名空间不必与其程序集同名(即使这是一个通用约定)。
如果您自然而然地希望在所有程序集中包含您的字符串扩展,因为它们代表通用功能,那么只需将它们放在顶级名称空间中,例如MyCompanyName.MyApplication
。然后,它们在同一名称空间或子名称空间中的任何其他 class 的范围内。
(这确实假设您的所有名称空间都遵循从共同根下降的常见做法,例如 MyCompanyName...
。)
我在一个程序集中有几个 string
扩展方法 A
。在程序集 B
中,我无法使用这些扩展方法,除非我在程序集 B
中的每个 .cs 文件中添加一个 using A
指令。
有没有办法在 B
程序集项目配置中为整个程序集指定一个 using ?类似于 c++ stdafx.h
谢谢
using
将命名空间导入当前上下文以避免通过完全限定名称引用 类 和其他其他结构。
您可以(但不是一个好主意)将所有结构放在程序集 B 的一个名称空间中,因此您只需要一个 using
。坏主意是因为代码组织不好等
根据您的程序集 B 包含的内容,您的字符串扩展函数可能会放在同一个命名空间中(而模型等其他东西则放在单独的命名空间中)。这似乎是一个体面的组织。
请注意,所有这些扩展函数都可以在单独的 .cs 文件中,并且仍然在同一个命名空间中,因此需要一个 using
声明来导入它们。
例如
ExtensionA.cs
namespace 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();
否,暂无此功能
查看 assembly/project 级别支持哪些功能的一个有用方法是查看命令行编译器的帮助。
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
指令应用于每个文件。
using
包括一个 命名空间 ,而不是程序集。命名空间不必与其程序集同名(即使这是一个通用约定)。
如果您自然而然地希望在所有程序集中包含您的字符串扩展,因为它们代表通用功能,那么只需将它们放在顶级名称空间中,例如MyCompanyName.MyApplication
。然后,它们在同一名称空间或子名称空间中的任何其他 class 的范围内。
(这确实假设您的所有名称空间都遵循从共同根下降的常见做法,例如 MyCompanyName...
。)