Vb.net 接线员
有没有办法在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
变暗
和变亮
。我希望使用尽可能少的代码实现单个函数。唯一的区别是大于运算符和小于运算符
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