4

我只是想知道如何将空颜色传递给方法。

这是一个获取颜色参数的方法的示例:

protected void myMethod(Color color,other parameters...) {}

现在我正在使用显示的条件。根据这种情况,我想改变颜色。

if(1) {myMethod(Color.Red,....)}

if(2) {myMethod(Color.Black,...)}

if(3) {myMethod(Color.Ignore,...)} //so here just ignore this color parameter and keep the original.

我知道我可以做很多事情来克服这个问题,但正如我所说,我只是想知道是否有更好的方法来传递忽略值,所以它将使用元素的原始颜色。

4

7 回答 7

10

关于什么:

protected void myMethod(Color? color,other parameters...) {}

哪里颜色?可以为空,因此您可以传递 null 并检查方法中的值。如果 color == null 那么保留原来的?

于 2013-10-31T13:00:56.507 回答
6

创建一个不需要颜色的方法的重载,如果你想使用默认值就调用它(最好不要提供参数,如果你不打算在方法中使用它而不是传递null值给方法):

protected void myMethod(other parameters...)

另外我建议您将可选参数放在参数的末尾:

protected void myMethod(other parameters..,  Color color)

代码:

switch(value)
{
   case 1: myMethod(..., Color.Red); break;
   case 2: myMethod(..., Color.Black); break;
   case 3: myMethod(...); break;
}

你甚至可以要求编译器为你做“重载”(见评论):

protected void myMethod(other parameters..,  Color color = {DefaultColor})

注意:我喜欢避免任何令人困惑的代码。例如调用

DrawPoint(10, 20, null)

我看起来很困惑。是什么null?如果没有人能够在方法中使用它,为什么要传递 null?以下电话看起来更好

DrawPoint(10, 20) 

它不会让调用者传递不会使用的参数。我不需要考虑什么null意思。但即使在这种情况下,我们也知道一些其他开发人员仍然无法获得的信息——我们正在使用默认颜色绘制点,而方法并没有说明任何相关信息。所以,我会使用另一种方法

DrawPointWithDefaultColor(10, 20)

完全不会混淆。

于 2013-10-31T13:00:43.087 回答
2

如果myMethod是你写的,我推荐使用可空类型,System.Drawing.Color值类型也是如此。因此,您可以这样编写方法:

protected void myMethod(Color? color,other parameters...) 
{
    if (color == null) // or !Color.HasValue
    {
         // color-is-null logic
    }
    else
    {
         var col = color.Value; 
         // col is an instance of System.Drawing.Color
         // Use `col` instead of color from your current `myMethod` 
         // implementation
    }
}

或者,如果您无法更改它(例如myMethod实现一个强制您使用Color而不是 的接口Color?),那么您可以回退到传递该类型的无意义值Color。例如Color.Transparent可能有效,但这只是一个假设。此代码要求您更改myMethod上面的第一个 if 条件

    if (color == null) ...

    if (color == Color.Transparent) ...

更新

澄清问题后,我得到了更好的预期结果,假设您已将 重构myMethod为 acceptColor?而不是Color,您可以消除样板代码:

if (1) {myMethod(Color.Red,....)}

if (2) {myMethod(Color.Black,...)}

if (3) {myMethod(Color.Ignore,...)} so here just ignore this color parameter and keep the original.

像这样:

Color? color = Colour.Black;
// `color` can be set to `null` or a valid `System.Drawing.Color`
// the followin line will work for both
myMethod(color,...);

神奇的是,任何可为空的类型都可以从其基础类型的实例隐式转换。您不需要 if/else 语句或强制转换将Color实例传递给接受的方法,Color?运行时将为您完成此操作。这同样适用于传递null值。

于 2013-10-31T13:03:13.973 回答
2

您可以简单地拥有一个不带颜色对象的重载:

protected void myMethod(Color color,other parameters...) {}

protected void myMethod(other parameters...) {}

或者

使颜色参数可以为空,这样您就可以传入 null 并在方法中进行空检查。

protected void myMethod(Color? color,other parameters...) {}
于 2013-10-31T13:01:32.910 回答
1

我会颠倒你的参数的顺序,并使颜色参数可以为空和可选。像这样:

protected void myMethod(other parameters, Color? color = null)
{

    if (color != null)
    {
        // Do something with color
    }
}

那么当你不使用它时,你只是不包含参数:

if (3)
{
    myMethod(...);
}
于 2013-10-31T13:03:53.853 回答
1

颜色是一种结构(一种值类型)。所以你可以使用nullable来解决这个问题。

protected void MyMethod(Color? color, ...) {}
于 2013-10-31T13:01:09.480 回答
0

可以使用可为空的 Color 参数、可选参数或方法重载。不过,所有这些都是代码气味。您真正在做的是提供两种类型的 API 功能:

protected void MyMethodWithColorChange(...

protected void MyMethodKeepColorUnchanged(...

因此,创建这两种方法,并使用正确的名称来解释它们执行的不同功能。

于 2013-10-31T13:16:13.087 回答