使用Color作为可选参数在类中的函数中

时间:2013-04-16 19:28:43

标签: vb.net colors optional

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

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

        End Function

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

4 个答案:

答案 0 :(得分:19)

MSDN说明了Visual Basic的Optional Parameters

  

对于每个可选参数,您必须将常量表达式指定为   该参数的默认值。如果表达式求值为   没有,值数据类型的默认值用作   参数的默认值。

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

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#中,您无法针对空值测试值类型(如颜色,点,大小等...)。这些类型永远不会为null,但它们具有类型的默认值(对于整数类似0),因此,如果需要为值类型传递可选参数,则可以使用new关键字创建它您希望默认使用的值或使用default keyword并让框架决定哪个值是该类型的默认值。如果您让框架选择,那么 IsEmpty 属性将为true。

答案 1 :(得分: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

答案 2 :(得分:1)

.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。

答案 3 :(得分:0)

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

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