Проверьте, был ли передан необязательный аргумент байта

Я хочу позволить пользователю указать собственный цвет для класса в конструкторе путем передачи байтов RGBA. Если они не задают пользовательский цвет, будет использоваться цвет по умолчанию из настроек приложения. Однако, если Alpha не указан, предположим, что он полностью непрозрачен.

Что бы я хотел:

public MyClass(byte r_col = -1, byte g_col = -1, byte b_col = -1, byte a_col = 255)
{
    if (r_col == -1 | g_col == -1 | b_col == -1)
    {
        // use default color
    }
    else
    {
        this.color = System.Windows.Media.Color.FromArgb(a_col, r_col, g_col, b_col); 
    }
}

Однако для байта не существует "неправильного" значения (-1 недопустимо), поэтому я не могу определить, действительно ли байт был передан в функцию. Какие варианты у меня есть? Я хотел бы избежать перегрузки функций, если это возможно.

2 ответа

Решение

Перегрузка функций намного красивее в этом случае:

public MyClass()
{
    //Default color
}
public MyClass(byte r_col, byte g_col, byte b_col)
{
    color = Color.FromArgb(r_col, g_col, b_col);
}
public MyClass(byte a_col, byte r_col, byte g_col, byte b_col)
{
    color = Color.FromArgb(a_col, r_col, g_col, b_col);
}

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

Я полагаю, что это одна из причин, почему C# имеет обнуляемые типы. Следующий код хорошо работал, используя обнуляемый тип, чтобы проверить, были ли переданы используемые аргументы.

public MyClass(byte? r_col = null, byte? g_col = null, byte? b_col = null, byte a_col = 255)
{
    if (r_col == null | g_col == null | b_col == null)
    {
        // use default color
    }
    else
    {
        System.Windows.Media.Color.FromArgb(a_col,
                                            r_col.GetValueOrDefault(),
                                            g_col.GetValueOrDefault(),
                                            b_col.GetValueOrDefault());
    }
}

Это ответ на мой собственный вопрос - другие предложения также приветствуются.

Другие вопросы по тегам