我创建了一个程序集,该程序集有一个子类,该子类派生自另一个程序集中定义的父类。
当我添加对子项的引用时,Visual Studio 还要求将引用添加到父项。
为什么会这样?如何在不丢失任何功能的情况下防止它?
你所描述的情况是部分可能的。您可以消除它们显式引用隐藏程序集的需要,但该程序集仍然会在编译时被拉入,并在运行时需要。
假设您定义了这些类:
// in assembly 1:
public class A
{
public virtual void Foo() { }
}
// and in assembly 2:
// requires explicit reference to assembly 1 to use
public class B : A
{
public override void Foo() { }
public A Value { get; set; }
public void Foo(A value) { }
}
// has implicit reference to assembly 1, but end user can ignore
public class C
{
private A Value { get; set; }
internal void Foo(A value) { }
protected internal A Bar() { return new A(); }
}
// usable at runtime even if assembly 1 is missing, as long as you don't call Foo()
public class D
{
public void Foo() { A blah = new A(); }
public void Bar() { }
}
如果最终用户使用类 B,他们将需要对程序集 1 的显式引用。由于 A 是 B 公共接口的一部分,因此为了使用 B,您必须了解 A。对 A 有 3 种不同的公共引用,并且他们中的任何一个都需要了解 A 才能使用 B。
然而,类 C 引用了 A,但所有引用都是私有/内部/本地的。由于对 A 的每个引用都是从外部隐藏的,因此最终用户不必显式了解程序集 1。运行时仍然需要它,但您不必将其添加为引用,它是间接引用。
如果最终用户使用类 D,而不使用 B 或 C,则只有调用 D.Foo()(它具有 A 类型的局部变量)时才会加载程序集 1。实际上,您可以自由地使用 D.Bar()即使程序集 1 在运行时完全丢失。尽管如果您调用 D.Foo() 并且程序集 1 丢失,您将得到一个异常。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)