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

Check if optional byte argument was passed in

我想让用户通过传入 RGBA 字节为构造函数中的 class 指定自定义颜色。如果他们没有指定自定义颜色,将使用应用程序设置中的默认颜色。但是,如果省略了 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); 
    }
}

但是,字节没有 "wrong" 值(-1 无效),因此我无法检测到字节是否实际传递给了函数。我有什么选择?我想尽可能避免函数重载。

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

这是对我自己问题的回答 - 也欢迎其他建议。

这种情况下函数重载就漂亮多了:

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 设计。因为如果让用户输入不允许的参数,这可能会导致难以跟踪错误。不要害怕为了更好的结果而做更多的工作 - 所以在这种情况下,使用函数重载。