如何传递空值颜色

时间:2013-10-31 12:57:51

标签: c# null

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

以下是获取颜色参数的方法示例:

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.

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

7 个答案:

答案 0 :(得分:9)

怎么样:

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

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

答案 1 :(得分:6)

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

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

完全没有混淆。

答案 2 :(得分:2)

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

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

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

OR

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

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

答案 3 :(得分: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接受Color?而不是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值。

答案 4 :(得分:1)

Color是一种结构(值类型)。因此,您可以使用nullable来解决此问题。

protected void MyMethod(Color? color, ...) {}

答案 5 :(得分:1)

我会反转参数的顺序,并使颜色参数可以为空且可选。像这样:

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

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

然后你不要在不使用它时包含参数:

if (3)
{
    myMethod(...);
}

答案 6 :(得分:0)

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

protected void MyMethodWithColorChange(...

protected void MyMethodKeepColorUnchanged(...

因此,创建两个方法,使用适当的名称来解释它们执行的不同功能。