2010-07-04 75 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