【问题标题】:Using an optional parameter of type System.Drawing.Color使用 System.Drawing.Color 类型的可选参数
【发布时间】:2023-03-17 11:45:01
【问题描述】:

我开始利用 .Net 4.0 中的可选参数

我遇到的问题是当我尝试声明 System.Drawing.Color 的可选参数时:

public myObject(int foo, string bar, Color rgb = Color.Transparent)
{
    // ....
}

我希望 Color.Transparent 成为 rgb 参数的默认值。问题是,我不断收到这个编译错误:

'rgb' 的默认参数值必须是编译时常量

如果我只能将原始类型用于可选参数,那真的会破坏我的计划。

【问题讨论】:

标签: c# .net-4.0 optional-parameters


【解决方案1】:

可空值类型可用于在这种情况下提供帮助。

public class MyObject 
{
    public Color Rgb { get; private set; }

    public MyObject(int foo, string bar, Color? rgb = null) 
    { 
        this.Rgb = rgb ?? Color.Transparent;
        // .... 
    } 
}

顺便说一句,这是必需的原因是因为默认值在编译期间在调用点填充,static readonly 值直到运行时才设置。 (通过类型初始化器)

【讨论】:

  • 我在没有 Visual Studio 的情况下执行此操作,因此可能需要进行一些小调整。
  • @Neil N,类型名称 Color 后面的问号使该结构成为 Nullable<Color>
【解决方案2】:

对于这种情况,我根本不喜欢可选参数。 IMO 可选参数的最佳用例是与 COM 互操作,其中使用了相当多的可选参数。像这样的情况是(我猜想)可选参数直到 4.0 才进入语言的原因之一。

不要创建可选参数,而是像这样重载函数:

public myObject(int foo, string bar) : this (foo, bar, Color.Transparent) {};

public myObject(int foo, string bar, Color RGB) {
...
}

【讨论】:

  • 这实际上是我之前所拥有的,但就我而言,由于构造函数的重载太多,因此拥有一些可选参数并保留一个构造函数更有意义。
  • 我认为它没有,一个很好的反例是你现在遇到的问题。标准 .NET 库周围有相当多的函数,它们具有相当许多重载。以 Convert.ToInt32() 为例...定义多个重载还使您能够分别记录它们的用法。通常,某些可选参数的组合是有意义的,而另一些则没有。可选参数不能让您仅使用函数签名本身来传达这一点,而重载(在某种程度上)可以。
  • 除了颜色参数(我可能只用一个 int 替换)之外,可选参数允许我删除大约 100 行冗余代码。现在要维护的东西要少得多。
  • @Neil,别担心,可选参数很棒,主要是因为你指出的原因。它们是减少源代码中多余废话的绝佳方法。并且您没有的每一行代码都少了一行,不会导致错误,也不需要维护。
  • @DaveMarkle 编译器对可选参数做了什么?它是否将它们转换为重载,就像您在上面写的那样?另外,函数有重载还是可选参数对调用者有什么区别?
【解决方案3】:

使用 'default' 关键字更新,自 C# 7.1 起可用:

public myObject(int foo, string bar, Color rgb = default) {
    // ....
}

Color结构体的默认值为空结构体,相当于Color.Transparent

【讨论】:

    【解决方案4】:

    试试这个:

    public myObject(int foo, string bar, string colorName = "Transparent")
    {
        using (Pen pen = new Pen(Color.FromName(colorName))) //right here you need your color
        {
           ///enter code here
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 2019-04-21
      • 2022-09-28
      相关资源
      最近更新 更多