我想让用户通过传入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无效),所以我无法检测到一个字节是否实际传入该函数。我有什么选择?如果可能的话,我想避免函数重载。
答案 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());
}
}
这是我自己的问题的答案 - 其他建议也值得赞赏。