Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用不同的集合作为引用,而不使用不同的代码集_.net_Vb.net_Listview_Reference - Fatal编程技术网

.net 使用不同的集合作为引用,而不使用不同的代码集

.net 使用不同的集合作为引用,而不使用不同的代码集,.net,vb.net,listview,reference,.net,Vb.net,Listview,Reference,如何在不必复制代码的情况下在两组不同的集合之间进行选择?在我的程序中,如果我的用户使用复选框,我将对选中的项目执行与对复选框相同的操作。如何在不丢失对这些项的引用的情况下创建集合变量,以便仍能向它们写入属性?使用“提取方法”重构。下面是一个简单的示例,假设这两个代码块已经很简单了: If ListView1.CheckBoxes = True Then 'using check boxes For Each lvi As ListViewItem In ListView1.Che

如何在不必复制代码的情况下在两组不同的集合之间进行选择?在我的程序中,如果我的用户使用复选框,我将对选中的项目执行与对复选框相同的操作。如何在不丢失对这些项的引用的情况下创建集合变量,以便仍能向它们写入属性?

使用“提取方法”重构。下面是一个简单的示例,假设这两个代码块已经很简单了:

If ListView1.CheckBoxes = True Then
    'using check boxes
    For Each lvi As ListViewItem In ListView1.CheckedItems
        'whole bunch of code
    Next
Else
    'not using check boxes
    For Each lvi As ListViewItem In ListView1.SelectedItems
        'the exact same whole bunch of code
    Next
End If
  • 将“一大堆代码”转换为一个方法,该方法接受
    lvi
    作为参数。可能需要其他参数,但请确保
    lvi
    是其中之一

    If ListView1.CheckBoxes = True Then
        'using check boxes
        For Each lvi As ListViewItem In ListView1.CheckedItems
            MethodCall(lvi)
        Next
    Else
        'not using check boxes
        For Each lvi As ListViewItem In ListView1.SelectedItems
            MethodCall(lvi)
        Next
    End If
    
  • 将“完全相同的全部代码”转换为另一种方法,该方法将
    lvi
    作为参数。同样,可能需要额外的参数

    Private Sub ExtractedMethod1(lvi As ListViewItem)
        MethodCall(lvi)
    End Sub
    
    调用代码现在如下所示:

    Private Sub ExtractedMethod2(lvi As ListViewItem)
        MethodCall(lvi)
    End Sub
    
  • 如果您正确地认为两个代码块几乎相同,那么您将能够进行一系列小的更改,使它们实际上相同。这可能涉及重命名参数、更改参数顺序、添加参数等。一旦参数相同,请将对第二个方法的引用更改为对第一个方法的引用,然后删除第二个方法

  • 现在,您将有一个方法可用于
    If
    语句的两个分支

    If ListView1.CheckBoxes = True Then
        'using check boxes
        For Each lvi As ListViewItem In ListView1.CheckedItems
            ExtractedMethod1(lvi)
        Next
    Else
        'not using check boxes
        For Each lvi As ListViewItem In ListView1.SelectedItems
            ExtractedMethod2(lvi)
        Next
    End If
    

    像ReSharper这样的工具在这方面非常有用。

    您只需要在函数中放入类似的代码

        If ListView1.CheckBoxes = True Then
            'using check boxes
            For Each lvi As ListViewItem In ListView1.CheckedItems
                ExtractedMethod1(lvi)
            Next
        Else
            'not using check boxes
            For Each lvi As ListViewItem In ListView1.SelectedItems
                ExtractedMethod1(lvi)
            Next
        End If
    
    If ListView1.CheckBoxes = True Then
        'using check boxes
        For Each lvi As ListViewItem In ListView1.CheckedItems
            SimilarCode(lvi)
        Next
    Else
        'not using check boxes
        For Each lvi As ListViewItem In ListView1.SelectedItems
            SimilarCode(lvi)
        Next
    End If
    
    Sub SimilarCode(ByVal lvi As ListViewItem)
        'whole bunch of code
    End Sub