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