11

如何在某些函数或子函数中声明可选颜色参数,就像我以正常方式那样(我的意思是为该可选参数提供一些默认颜色),因为 vb.net 编译器抱怨其中存在一些错误代码。我该如何解决这个问题。下面的示例代码:

Public Shared Function SomeFunction(ByVal iParam As Integer, Optional ByVal oColor As Color = Color.Black)

        End Function

编译器不接受 '=Color.Black'

4

4 回答 4

21

MSDN 说关于Visual Basic 的可选参数

对于每个可选参数,您必须指定一个常量表达式作为该参数的默认值。如果表达式的计算结果为 Nothing,则使用 value 数据类型的默认值作为参数的默认值。

所以你不能使用那种语法,而是你可以写这样的东西

Private Sub Test(a As Integer, Optional c As Color = Nothing)
    If c = Nothing Then
        c = Color.Black ' your default color'
    End If
    ......
End Sub

用 C# 编写的相同代码如下

private void Test(int a, Color c = default(Color))
{
    if (c.IsEmpty)
        c = Color.Black;
}

在 C# 中,您不能针对空值测试值类型(如颜色、点、大小等)。这些类型永远不会为空,但它们具有类型的默认值(如整数的 0),因此,如果您需要为值类型传递可选参数,您可以使用new带有您想要的值的关键字创建它用作默认值或使用default关键字并让框架决定哪个值是该类型的默认值。如果您让框架选择,那么IsEmpty属性将为真。

于 2013-04-16T19:44:01.577 回答
6

您可以重载该方法

''' <summary>
''' requires two parameters
''' </summary>
''' <param name="a">an integer</param>
''' <param name="c">a color</param>
''' <remarks></remarks>
Private Sub Test(a As Integer, c As Color)
    'Your function
End Sub

''' <summary>
''' one parameter, uses default color of black
''' </summary>
''' <param name="a">an integer</param>
''' <remarks></remarks>
Private Sub Test(a As Integer)
    Test(a, Color.Black)
End Sub
于 2013-04-16T21:24:46.167 回答
3

.NET 颜色世界中还有另一个功能可以让您实现您的初衷。该功能是一个名为“KnownColor”的枚举,它可以自由地来回转换为 System.Drawing.Color 对象。虽然它没有所有可能的颜色,但它拥有我曾经需要的所有颜色。并且因为它是一个枚举,所以它有“常量”作为可选参数中的默认值说明符。例子:

Private Sub Test(a As Integer, Optional kc As KnownColor = KnownColor.Black)
    Dim MyColor As System.Drawing.Color = Color.FromKnownColor(kc)
    ......
End Sub

根据

https://docs.microsoft.com/en-us/dotnet/api/system.drawing.color.toknowncolor

如果使用 FromName(String) 方法或 FromKnownColor(KnownColor) 方法从预定义的颜色创建颜色,则可以使用 System.Drawing.Color.ToKnownColor() 函数将其转换回 KnownColor 枚举中的值。否则它将返回值 0。

于 2019-05-14T15:48:18.977 回答
0

在 Visual Basic 中,@Steve 提出的解决方案几乎可行,但将 Color 设置为 Nothing 并不能达到您通常期望的效果;检查需要针对空颜色,而不是针对无。这是一个例子。它使 Windows 窗体控件的背景色闪烁 50 毫秒,只要它具有 .ForeColor:

Sub Flash(c As Control, Optional FlashColor As Color = Nothing,
          Optional Duration As Integer = 50)
    If FlashColor.Equals(System.Drawing.Color.Empty) Then FlashColor = Color.Red
    Try
        Dim CurrColor = c.BackColor
        c.BackColor = FlashColor
        c.Refresh()
        System.Threading.Thread.Sleep(Duration)
        c.BackColor = CurrColor
        c.Refresh()
    Catch ex as Exception
    End Try
End Sub

于 2018-09-20T02:23:54.517 回答