【问题标题】:Can I specify a default Color parameter in C# 4.0?我可以在 C# 4.0 中指定默认颜色参数吗?
【发布时间】:2011-05-26 03:45:21
【问题描述】:

这是一个示例函数:

public void DrawSquare(int x, int y, Color boxColor = Color.Black)
{
    //Code to draw the square goes here 
}

编译器不断给我错误:Default parameter value for 'boxColor'must be a compile-time constant

我试过了

Color.Black, 
Color.FromKnownColor(KnownColor.Black), and 
Color.FromArgb(0, 0, 0)

如何使 Color.Black 成为默认颜色?另外,我不想使用字符串Black 来指定它(我知道这会起作用)。我想要Color.Black 值。

【问题讨论】:

    标签: c# parameters c#-4.0 colors default-value


    【解决方案1】:

    这样做:

    void foo(... Color boxColor = default(Color))
    {
       if(object.Equals(boxColor, default(Color))) boxColor = Color.Black;
    
      // ...
    }
    

    顺便说一句:我喜欢使用object.Equals 静态方法,因为它是编写相等比较的一致方法。对于 string 等引用类型,str.Equals("abc") 可以抛出 NRE,而 string.Equals(str, "abc"[,StringComparison.___]) 不会。 Color 是一种值类型,因此永远不会为空,但最好在代码风格上保持一致,尤其是在零额外成本的情况下。显然,这不适用于 int 甚至 DateTime 等原语,其中 == 清楚地声明/传达了数学相等比较。

    或者,带有可空值(归功于 Brian Ball 的回答):

    void foo(... Color? boxColor = null)
    {
       if(boxColor == null) boxColor = Color.Black;
    
      // ...
    }
    

    【讨论】:

    • 为什么不只是if (boxColor == default(Color))
    • 没什么区别。我更喜欢 Equals 表示法,但对于值类型,'==' 是相同的。
    • @Mr. TA:嗯,在这种情况下,最好使用Color.Equals 而不是object.Equals。或者更好的default(Color).Equals(boxColor) 以便您使用虚函数。在我看来,== 更具可读性,但这是个人品味的问题。
    • 也许这是算法如何检查相等性的性能问题,如果我没记错的话,我注意到 someString == "abc" 与 someString.Equal("abc") 的性能不同,使用 Equal() 的最佳实践。颜色是值类型,大多数 == 和 Equal() 产生相同的结果,但是对于引用类型(字符串除外),== 和 Equal() 给出了很多不同的含义,== 用于检查引用是否相等,而 Equal() 是依赖如果 Equal() 方法被覆盖,则在类型上。
    • @Vlad:值类型中没有虚函数,Color.Equals和object.Equals一样,和default(Color).Equals(boxColor)一样。 IMO 使用 object.Equals 或 Color.Equals 而不是 default(Color).Equals(boxColor) 的唯一好处是,您强调的是您正在比较两个值,这与“==”的方式大致相同书面 - 这是一个可读性问题。此外,为了保持一致性,object.Equals(x,y) 比 x.Equals(y) 更好,因为对于引用类型,x.Equals(y) 可以抛出 NRE,而对于 object.Equals(x,y) 你'再安全。
    【解决方案2】:

    Color.Black 是静态的,而不是常量,所以不,你不能这样做。

    要使用默认值,您可以将参数设为可空(Color?),如果为空,则将其设置为黑色。

    【讨论】:

    • 我的回答中有这个,但如果您要指定一个空参数,为什么不只指定 Color.Black? :)
    • @George:“Color.Black 是静态的,而不是常数”。
    • Color 是一个结构体,因此如果您使用 Nullable 作为类型(或简称为 C# Color?),那么它可以为 null。
    • 确实,您明确引用了Color?,收回了我的评论。
    【解决方案3】:

    保持简单有什么问题?

    public void DrawSquare(int x, int y)
    {
        DrawSquare(x,y,Color.Black);
    }
    
    public void DrawSquare(int x, int y, Color color)
    {
       // Do your thing.
    }
    

    【讨论】:

    • 实际功能没那么简单。它有大约 10 个参数(其中大部分是可选的,可以指定为可选)。此外,这些参数还有 5 或 6 个不同的函数,每个函数有两种变体。这样做会增加太多的功能。不过,谢谢你的建议。
    猜你喜欢
    • 2011-12-28
    • 2017-03-09
    • 2011-01-11
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    相关资源
    最近更新 更多