You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解耦代码段变更告警方法及VB.NET项目依赖解耦问题咨询

问题背景

我编写了A、B、C三个代码组件:A、B为类库,C为可执行文件。B*引用(references)A同时导入(imports)*A;C同时引用A和B,但仅导入B、不导入A,我特意同时标注“imports”和“references”,后续问题会涉及该点。

组件代码示例

组件A(编译为MyMathsLibrary.dll)

定义了MathOperations类,包含ADD方法:

Public Class MathOperations 'Part A
    Function ADD(ByVal a As Integer, ByVal b As Integer) As Integer
        Return (a + b)
    End Function
End Class

组件B(编译为FactoryMathsLibrary.dll)

定义Factory类,包含createMathsObject方法,返回MathOperations类型对象,B引用并导入A:

Imports MyMathsLibrary 'Part B
Public Class Factory
    Shared Function createMathsObject() As MathOperations
        Return New MathOperations()
    End Function
End Class

组件C(可执行文件)

同时引用A和B,但仅导入B:

Imports FactoryMathsLibrary 'Part C
Module Module1
    Sub Main()
        Dim a, b As Integer
        Dim m As Object = Factory.createMathsObject()
        Console.Write("Enter 1st value: ")
        a = Console.ReadLine()
        Console.Write("Enter 2nd value: ")
        b = Console.ReadLine()
        Console.WriteLine("a + b = {0}", m.ADD(a, b))
        Console.ReadLine()
    End Sub
End Module

问题解答

问题1:如何实现A类方法名变更时,C代码触发编译时报错?

运行时报错的核心原因是C中把createMathsObject的返回值声明为Object类型,VB.NET对Object类型的成员调用默认使用后期绑定,编译阶段不会校验成员是否存在,只有运行时才会动态解析。
实现编译时报错的方案如下:

  • 第一步:在C项目的属性页开启Option Strict On,或者在C代码文件的第一行添加Option Strict On(仅对当前文件生效),开启后所有后期绑定代码会直接触发编译错误。
  • 第二步:将C中Dim m As Object修改为强类型声明Dim m As MathOperations(需要在C中导入A的命名空间,或者写完整类名MyMathsLibrary.MathOperations)。
    修改完成后,如果A中的ADD方法重命名,C中调用m.ADD的位置会直接在编译阶段抛出错误,无需等到运行时。

问题2:C仅引用B不引用A的解耦结构,是C#独有特性吗?

这不是C#和VB.NET的语言差异,是你对教程实现逻辑的理解有误。
不管是C#还是VB.NET,只要B的公开API返回了A中定义的具体类类型,那么调用这个API的C项目必须直接引用A,这是.NET运行时的通用规则,两种语言没有区别。
你看到的C#教程能实现C仅引用B的结构,本质是用了接口抽象做了架构调整,调整方案对VB.NET同样生效:

  1. 新增一个公共接口类库,定义IMathOperations接口,包含ADD方法签名
  2. A中的MathOperations类实现这个公共接口
  3. B的createMathsObject方法返回值类型从具体的MathOperations改为IMathOperations
    调整完成后,C只需要引用B和公共接口类库,不需要直接引用A,即可实现完全解耦的结构。

内容的提问来源于stack exchange,提问作者Sougata

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:00:01