Vb.net 接线员

Vb.net 接线员,vb.net,operators,Vb.net,Operators,有没有办法在VB.NET中传入运算符?我希望减少我的代码行,对于两个函数,实际上只有一个不同的操作符 例如,我有两个函数,变暗和变亮。我希望使用尽可能少的代码实现单个函数。唯一的区别是大于运算符和小于运算符 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

有没有办法在VB.NET中传入运算符?我希望减少我的代码行,对于两个函数,实际上只有一个不同的操作符

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

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

这可能吗?如果可能的话,我找不到任何引用。

您可以传入一个
Func(Byte,Byte,Boolean)
并使用lambda表达式。在VB中仍然比在C#中更详细,但也不太糟糕


或者您可以使用
Func
方法,但为各种委托提供“伪常量”(只读字段)。然后您可以只参考
大于
小于
。我不相信有一种简单而简洁的方法可以将运算符本身转换为委托。

我从未见过这样做。也没有运算符类型。至少我从来没有过。有一个运算符关键字用于运算符重载,但仅此而已。

这并不短,但它将它们结合起来。它也应该更快,因为它不使用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
函数变暗拧紧(ByVal Op作为字符串,ByVal clr1作为颜色,ByVal clr2作为颜色)作为颜色
作为整数的Dim newR
Dim newG作为整数
作为整数的Dim newB
如果Op=“>”则
如果clr2.R>clr1.R,则newR=clr2.R,否则newR=clr1.R
如果clr2.G>clr1.G,则newG=clr2.G,否则newG=clr1.G
如果clr2.B>clr1.B,则newB=clr2.B,否则newR=clr1.B

ElseIf Op=“我不知道VB.net,所以我不确定这是否可行,但您不能使用类似于
compare()的东西吗
?分别比较
-1
0
1
返回值。因此,您可以将
-1
0
1
传递给函数,就像
比较u值
一样,并且在函数中

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

如果与函数lambda结合使用,我将使用内联函数

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

+1尽管在问题的特定代码中,那些
If(…)
表达式不是只是重新实现了
Math.Min
Math.Max
?为什么不使用它们呢?你可以将它们作为
Func(字节,字节,布尔)传递
@MarkJ:你是说
Func(字节,字节,字节)
?嗯……好吧,如果这是最好的,我想这是唯一的方法:(是的,应该是
Func(字节,字节,字节)
。谢谢Jeriko.VB.NET也有这个,但它会创建一个
if/Else
语句。谢谢dbasnett。我已经看过了,但正在寻找一种方法来删除大部分重复的代码。
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