【发布时间】:2015-11-03 21:04:54
【问题描述】:
假设我们的 Visual Studio 解决方案中有 3 个项目。项目 A、B 和 C。
项目A代码:
public class A
{
public void someMethodA()
{
B b = new B();
b.someMethodB(new C());
}
}
项目B代码:
public class B
{
public void someMethodB(C c)
{
c.foo(); // we do something with C, call C's method
}
}
项目C代码:
public class C
{
public void foo()
{
return; // just for testing
}
}
项目 B 有一个对项目 C 的引用,因为它需要它(在 someMethodB 中需要类 C)。项目 A 在创建新对象 B 并调用 B 的方法 - someMethodB() 时引用了项目 B。
此时我们的解决方案将无法编译,因为项目 A 需要引用项目 C - 它调用需要项目 C 的 b.someMethodB(new C())。项目 A 真的需要引用项目 C 吗?它不能从也引用它的项目 B 中获取它。我知道每个项目都会生成自己的 dll 文件,并且在 bin 目录中有 3 个文件,但它仍然可以从项目 B 中获取所需的内容。
项目 C 不是 B 域,但我们可以通过 B 获得对 C 的引用。
【问题讨论】:
-
"我们可以通过 B 得到对 C 的引用",没错,你可以通过汇编
B得到一个C的实例(虽然你不会可以用它做很多事情,除了将它传递给程序集B的其他部分。但是您正尝试使用new关键字在程序集A中实例化它。 -
根据我的经验,即使在 C# 编译器不需要它的情况下,添加直接引用也是一个好主意。虽然这很丑陋,但 .net 构建系统有时不会重建它需要重建的东西。
-
@CodesInChaos 这是否与有时删除 bin/ 和 obj/ 目录有关。有时会发生异常,当我们删除 bin/ 和 /obj 目录时一切正常(当然删除目录后需要重建)
-
@Groo 我只是认为程序集 B 可以在没有 A 引用 C 的情况下返回 C(以及所有 C 的元数据和所需的任何信息)。我只是尝试 B 返回新的 C(),但 A 仍然需要一个参考 C,因为 A 需要知道如何使用 C。我相信 James Thorpe 的回答有一定的道理。
-
@broadband:它需要引用,因为它需要知道
C类型有哪些成员。 但是,如果三个程序集都引用了一个定义了某个接口的通用程序集(例如IC),那么A可以通过接口IC获取C的实例,只要因为C实现IC并且B方法的返回类型是IC而不是C。这是我的想法,但应该更明确。