Использование цвета в качестве дополнительного параметра в функции внутри класса

Как я могу объявить необязательный параметр цвета в какой-либо функции или подпрограмме, как будто я делаю это обычным способом (я имею в виду указать цвет по умолчанию для этого необязательного параметра), поскольку компилятор vb.net жалуется, что в этом есть какая-то ошибка код. Как мне решить эту проблему. Пример кода ниже:

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

        End Function

Компилятор не принимает '= Color.Black'


person Ahmed Nazmy    schedule 16.04.2013    source источник


Ответы (4)


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 будет истинным.

person Steve    schedule 16.04.2013
comment
Странно, что в C # компилятор не позволяет мне объявить Color c = null при объявлении параметра. Он жаловался на невозможность присвоить null типу значения. Мне пришлось сказать Color c = new Color (), а затем в моем тесте кода для c.IsEmpty. - person Bill Gregg; 02.09.2015
comment
@BillGregg добавил версию C # - person Steve; 02.09.2015

Вы можете перегрузить метод

''' <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
person dbasnett    schedule 16.04.2013

В цветовом мире .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

вы можете использовать функцию System.Drawing.Color.ToKnownColor () для обратного преобразования в значение в перечислении KnownColor, если Color создается из предопределенного цвета с помощью метода FromName (String) или метода FromKnownColor (KnownColor). В противном случае он вернет значение 0.

person V. Wheeler    schedule 14.05.2019

В Visual Basic решение, предложенное @Steve, почти работает, но установка Color на Nothing не дает того, чего вы обычно ожидаете; проверка должна быть на Пустой цвет, а не на Ничего. Вот пример. Он мигает BackColor элемента управления Windows Forms на 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

person Neil Dunlop    schedule 20.09.2018