VB.NET中基于接口的列表深拷贝实现是否可优化?
VB.NET深拷贝构造函数的优化实现
问题根源解析
你当前代码里第二个Select的核心作用是把IEnumerable(Of X)向上转型为IEnumerable(Of IX),原因在于:
Select(Of X)(...)返回的是IEnumerable(Of X),而mR的类型应该是List(Of IX)- 泛型协变仅支持
IEnumerable(Of T)这类接口(且T为引用类型),但List(Of X)无法直接转换为List(Of IX),所以移除第二个Select后,编译器会因类型不匹配报错。
更优实现方式
无需两次Select,可以通过以下两种方式简化代码:
方式1:显式指定Select的返回类型为IX
直接在Select中声明泛型参数为IX,让编译器自动将New X转型为接口类型:
mR = r.Select(Of IX)(Function(a As IX, i As Integer) New X).ToList()
方式2:使用Cast()方法完成转型
如果更倾向于保留Select的X类型返回逻辑,可以在后续用Cast统一转型:
mR = r.Select(Of X)(Function(a As IX, i As Integer) New X).Cast(Of IX).ToList()
关键注意点:深拷贝的正确性
当前代码里New X只是创建X的空实例,没有复制传入的a As IX的属性值,这并不符合深拷贝的核心需求。你需要给X类添加支持深拷贝的构造函数,比如:
Public Class X Implements IX ' 示例属性 Public Property Name As String Public Property Count As Integer ' 深拷贝构造函数 Public Sub New(source As IX) Dim src = DirectCast(source, X) Me.Name = src.Name ' 值类型直接复制,引用类型需递归处理深拷贝 Me.Count = src.Count End Sub ' 默认构造函数(按需保留) Public Sub New() End Sub End Class
此时构造函数中的Select应改为:
mR = r.Select(Of IX)(Function(a As IX) New X(a)).ToList()
实例数量验证
按照优化后的代码执行你给出的测试逻辑:
Dim a As New List(Of IX) From {New X, New X} ' 2个X实例 Dim b As New Y(a) ' 创建2个新X实例(累计4个),1个Y实例 Dim c As New Y(b.R) ' 创建2个新X实例(累计6个),1个Y实例
完全符合你预期的6个X实例、2个Y实例的结果。
内容的提问来源于stack exchange,提问作者periblepsis
相关产品推荐
相关产品推荐

