C# 4.0:我可以将Color用作带有默认值的可选参数吗?

74
    public void log(String msg, Color c = Color.black)
    {
        loggerText.ForeColor = c;
        loggerText.AppendText("\n" + msg);

    }

这会导致一个错误,即c必须是编译时常量。我稍微了解了一下,大部分的例子都涉及到字符串和整数。我已经想出可以使用colorconverter类,但我不确定它是否非常高效。有没有一种方法可以将基本颜色作为可选参数直接传递?

    public void log(String msg, String c = "Black")
    {
        ColorConverter conv = new ColorConverter();
        Color color = (Color)conv.ConvertFromString(c);

        loggerText.ForeColor = color;
        loggerText.AppendText("\n" + msg);
    }
4个回答

143

我也遇到过这个问题,唯一的解决方法是使用可空类型。

public void log(String msg, Color? c = null)
{
    loggerText.ForeColor = c ?? Color.Black;
    loggerText.AppendText("\n" + msg);
}

其他可能的语法是:

loggerText.ForeColor = c.GetValueOrDefault(Color.Black);

7
您也可以使用 default(Color) 作为默认值,但有时这会使得无法区分默认值与有效参数值。在这种情况下,Nullable 更好一些。 - LBushkin
@Bushkin:我完全同意这个观点! - Simon
谢谢,解决了我的颜色问题。+1 - kplshrm7
运行得非常好! - oetoni

9

你可以检查颜色是否为颜色空值(默认值为default(Color)),或者使用可空值并检查是否为null。

public void log(String msg, Color? c = null) { ... }

4

不要指定颜色。相反,提供一个“错误级别”,并将每个错误级别与一个颜色值进行映射。这样,0及以下可以是黑色,然后1 = 琥珀色,>2 = 红色。无需担心默认值和/或未指定值。


强调“什么”,而不是“如何”。 - Bryan Watts
5
完全不同意 - 除了没有回答问题之外,这还引入了一个新的语义“错误级别”,从而使得该方法在不同的应用程序中变得不太实用(如果我想让警告在一个应用程序中为橙色,在另一个应用程序中为黄色怎么办)。 - Justicle
@Justicle 我明白你的意思,但实际颜色应该是一个表现层面的问题,这样每个应用程序的语义都是相同的,即使每个应用程序的呈现方式可能不同(日志文件中的列,UI元素的颜色,发送电子邮件或不发送等)。 - Neil Barnwell

2

使用建议:


public GraphicsLine(Point startPoint, Point endPoint, Color? color = null, double width = 1.0)
{
    StartPoint = startPoint;
    EndPoint = endPoint;
    Color = color ?? Colors.Black;
    Width = width;
}

2
Color.Black,不是Colors.Black。 - Emanuele

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接