2013-10-31 32 views
2

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

这里是它获取颜色参数的方法的示例:

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. 

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

+0

难道你不能获得目前的颜色或缓存吗?也许你应该考虑将方法分成多个部分 –

+0

你可以使用'null'吗? – Sam

+11

你可以使它成为一个空的类型,'Color?' – SJuan76

回答

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) 

完全没有混淆。

+1

使用“= default”会导致创建重载,还是编译器在没有它的情况下调用方法时注入默认参数? –

+0

@JimRhodes编译器在调用方法的地方注入默认参数,所以实际上会有单参数最大的方法 –

+2

优秀。希望他采用这种解决方案,而不是“空”类型的解决方法。 – Beska

8

什么:

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

颜色在哪里?是空的,所以你可以传递null来检查你的方法中的值。如果颜色== null,然后保持原来的?

+2

+1。这正是Nullable 类的用途,以避免出现像Color.Ignore或Color.Transparent这样的魔术值。或者更糟糕的是,选择一种难看的颜色是没有人会想要的,并将其用作魔法价值。 –

+0

但你需要再次使用条件,并检查它的颜色为空或不空白,然后使用原来的颜色。你不觉得这是过度使用吗?为什么我们不能告诉元素使用自己的颜色? – akd

1

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

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

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

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

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

OR

使颜色参数为空,这样你可以传入null,并在方法中做一个空检查。

protected void myMethod(Color? color,other parameters...) {} 
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 (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值。

+0

是的,这是我做到的方式,但我仍然认为微软应该找到一个更好的方式来摆脱不必要的条件。 – akd

+0

不幸的是,值类型被设计为不像其他对象那样使用'null',因为它们必须并且始终具有其类型的有效非空值。目前,Nullable <>'类型是目前最适合您情况的解决方案。我很高兴看到这种情况是否能以任何方式改善未来 –

+0

@akdurmus,无论如何,我认为这种情况是必要的。如果Color是引用类型,那么您仍然需要检查是否为null,否则最终会产生一个好的'NullReferenceException'。 –

1

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

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

可以使用可空颜色参数,一个可选的参数或方法的重载:

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

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

那么你只是没有当你不使用它包括的参数。尽管都是代码味道。你真正做的是提供两种类型的API功能:

protected void MyMethodWithColorChange(... 

protected void MyMethodKeepColorUnchanged(... 

因此,创建了两个方法,与解释他们执行不同的功能的专有名称。

相关问题