2010-07-04 71 views
2

有没有办法在VB.NET中传入运算符?我正在寻求减少我的代码行,并且对于两个函数,字面上只有一个不同的操作符。通过运算符

例如,我有两个功能,DarkenLighten。我希望尽可能使用尽可能少的代码来实现单个功能。唯一的区别是大于和小于运算符。

Function Darken(ByVal clr1 As Color, ByVal clr2 As Color) As Color 
    Dim newR = If(clr2.R < clr1.R, clr2.R, clr1.R) 
    Dim newG = If(clr2.G < clr1.G, clr2.G, clr1.G) 
    Dim newB = If(clr2.B < clr1.B, clr2.B, clr1.B) 
    Return Color.FromArgb(newR, newG, newB) 
End Function 
Function Lighten(ByVal clr1 As Color, ByVal clr2 As Color) As Color 
    Dim newR = If(clr2.R > clr1.R, clr2.R, clr1.R) 
    Dim newG = If(clr2.G > clr1.G, clr2.G, clr1.G) 
    Dim newB = If(clr2.B > clr1.B, clr2.B, clr1.B) 
    Return Color.FromArgb(newR, newG, newB) 
End Function 

我想什么是一样的东西(伪):

Function DarkenLighten(By Val Op As Operator, ByVal clr1 As Color, ByVal clr2 As Color) As Color 
    Dim newR = If(clr2.R Op clr1.R, clr2.R, clr1.R) 
    Dim newG = If(clr2.G Op clr1.G, clr2.G, clr1.G) 
    Dim newB = If(clr2.B Op clr1.B, clr2.B, clr1.B) 
    Return Color.FromArgb(newR, newG, newB) 
End Function 

这可能吗?如果可能,我找不到任何参考。

回答

4

您可以传入Func(Of Byte, Byte, Boolean)并使用lambda表达式。它在VB中仍然会比C#中更加冗长,但不是不好。

或者您可以使用Func方法,但为各个代表提供“伪常量”(只读字段)。那么你可以参考GreaterThanLessThan。我不相信将操作员本身转换为委托人有一种简单而简洁的方法。

+0

+1虽然在合并问题中的特定代码是不是那些'If(...)'表达式只是'Math.Min'和'Math.Max'的重新实现?为什么不使用它们呢?你可以把它们作为'Func(Byte,Byte,Boolean)''来传递。 – MarkJ 2010-07-04 15:04:47

+0

@MarkJ:你的意思是'Func(Byte,Byte,Byte)'? – 2010-07-04 15:08:11

+0

嗯......没关系,如果这样好,我想这是唯一的方法:( – 2010-07-04 17:05:54

1

我从来没有见过这样做。也没有运营商类型。至少我从来没有一个。有用于操作符重载的操作符关键字,但就是这样。

1

这并不短,但它确实结合了它们。它也应该更快,因为它不使用if运算符。

Function DarkenLighten(ByVal Op As String, ByVal clr1 As Color, ByVal clr2 As Color) As Color 

    Dim newR As Integer 
    Dim newG As Integer 
    Dim newB As Integer 

    If Op = ">" Then 
     If clr2.R > clr1.R Then newR = clr2.R Else newR = clr1.R 
     If clr2.G > clr1.G Then newG = clr2.G Else newG = clr1.G 
     If clr2.B > clr1.B Then newB = clr2.B Else newR = clr1.B 
    ElseIf Op = "<" Then 
     If clr2.R < clr1.R Then newR = clr2.R Else newR = clr1.R 
     If clr2.G < clr1.G Then newG = clr2.G Else newG = clr1.G 
     If clr2.B < clr1.B Then newB = clr2.B Else newR = clr1.B 
    Else 
     Throw New Exception("Bad OP") 
    End If 

    Return Color.FromArgb(newR, newG, newB) 

End Function 
+0

谢谢dbasnett。我曾看过这个,但是正在寻找一种方法来删除大多数重复的代码 – 2010-07-04 17:07:49

2

我不知道VB.net,所以我不知道这是可行的,但不能使用类似compare()?分别针对<==>比较返回-101。因此,您可以通过-101的功能,为compare_value,并在你的函数有

if compare(a,b) == compare_value 
    do something... 
+0

谢谢Jeriko。VB.NET也有这个,但它会刚刚创建一个'If/Else'语句。 – 2010-07-04 17:07:13

1

我会使用inline如果具有功能的λ

Function DarkenLighten(Darken as Boolean,clr1 As Color, clr2 As Color) As Color 
Dim Op = If(Darken, Function(clr1,clr2) Math.Max(clr1,clr2), Function(x,y) Math.Min(clr1,clr2)) 
Return Color.FromArgb(Op(clr1.R,clr2.R),Op(clr1.G,clr2.G),Op(clr1.B,clr2.B)) 
End Function