检查是否传入了可选的字节参数

时间:2017-04-09 22:26:34

标签: c# nullable optional-parameters

我想让用户通过传入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 个答案:

答案 0 :(得分:1)

在这种情况下,函数重载更加美观:

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);
}

当然可以在没有(如Micheal证明)的情况下完成它,但它(P.Kouverakis提到)不是很好的API设计。因为如果您让用户键入不允许的参数,则可能导致难以跟踪错误。永远不要为了获得更好的结果而担心更多工作 - 所以在这种情况下,请使用函数重载。

答案 1 :(得分:0)

我认为这是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());
    }
}

这是我自己的问题的答案 - 其他建议也值得赞赏。