我们知道Modifier为Internal的类型成员仅限于当前程序集能够访问,但是在某些情况下,我们希望将它们暴露给另一个程序集。比较典型的应用场景包括如下两种:
- 将一个组件或者模块定义成两个或者两个以上程序集,一个程序集需要访问另一个程序集的Internal成员。比如将一个Logging组件定义成三个程序集:Logging.dll、Logging.Client.dll和Logging.Server.dll。其中后两个分别用于客户端和服务端的日志记录,而它们共同依赖的功能定义在Logging.dll中。定义在Logging.dll的API以共有成员的形式公布出来,而一些仅仅需要被Logging.Client.dll和Logging.Server.dll使用的API在定义成Interna成员。
-
对一个组件或者模块进行单元测试时候,单元测试用例需要调用定义在被测试组件或者模块的Internal成员。
举个例子,如右图所示,我将某个组件定义在Lib项目中,而Test是与之对应的单元测试项目。定义在Lib中组建成员的可见性依赖于具体的设计,但是在很多情况下,单元测试用例为了尽可能覆盖较多的分支,需要调用一些Internal成员。比如,设置一些Internal属性,或者调用一些Internal方法。
我在Lib中定义了如下一个表示二维向量的Vector类,其中X和Y属性的Set方法为Internal。
class Vector
2: {
string parameterName)
4: {
value)
6: {
new ArgumentNullException(parameterName);
8: }
9: }
internal set; }
internal set; }
12:
double y)
14: {
this.X = x;
this.Y = y;
17: }
18:
object obj)
20: {
as Vector;
null == vector)
23: {
false;
25: }
26:
this.Y == vector.Y;
28: }
29:
operator + (Vector v1, Vector v2)
31: {
);
);
new Vector(v1.X + v2.X, v1.Y+ v2.Y);
35: }
36:
int GetHashCode()
38: {
this.Y.GetHashCode();
40: }
41: }