2015-07-28 37 views
0

修改参数值被认为是一种反模式,但我觉得它在C#中的可选参数有时是有用的:是否确定改变可选参数

public void Foo(int p1, MyClass fooObj = null) 
{ 
    if (fooObj == null) 
    { 
     fooObj = LoadFooObj(.... 
    } 

    . . . 
} 

是这里的东西可能有害的我可能会丢失?

谢谢。

+0

这是完全常见的,并确定。关于不改变参数值的想法可能是针对人们过去编写的100多行方法。如果你只有短的方法,这不会是一个问题。 –

回答

3

这绝对没问题。事实上,这是一个让参数可选的好方法,不需要将数值作为常量进行烘焙。

您可以使用空合并运算符,使其略微更具可读性,但:

public void Log(string message, DateTime? timestamp = null) 
{ 
    DateTime actualTimestamp = timestamp ?? DateTime.UtcNow; 
    ... 
} 

一个缺点:

fooObj = fooObj ?? LoadFooObj(); 

使用值类型相同的方法,你甚至可以考虑这是因为它可以防止null被用作“正常”有意义的值 - 虽然 - 考虑您是否会在特定情况下需要这样的值。

4

如果你觉得它有味道,那么简单的超载怎么样。

public void Foo(int p1, MyClass fooObj) 
{ 
    . . . 
} 

public void Foo(int p1) 
{ 
    var fooObj = LoadFooObj(....); 
    Foo(p1, fooObj); 
} 

这样就明确了每种方法的作用,并且不会改变调用中的参数。

+0

是的,你的代码看起来不错,谢谢。关键是我不知道是否原始代码味道) –

+0

唯一的问题是它很难筛选出我被称为没有选项的地方。如果你把它们分开,你可以很容易地找到ide中的所有引用 –

+0

如果你想拥有多个可选参数也很棘手 - 重载次数爆炸。 –

2

我要去争辩乔恩斯基特完全相反,并说这不是罚款,原因有二:

  1. 尽可能,所有变量(包括参数)应被视为是不可变的。如果你真的必须改变它们的价值。这导致更清晰,更易于理解的代码。
  2. 避免可选参数。一个带有可选参数的方法,然后立即测试该参数是一个清晰的代码味道:你有两条路径通过代码,所以使它有两种方法。

你可能只是重载Foo,但想想这些方法的作用:他们可能应该被赋予不同的名称来描述他们做不同事情的事实。不要依赖评论来解释这一点;用代码本身清楚说明。

+0

我不明白为什么(2)特别适用于可选参数。当然,同样的逻辑将适用于任何参数,无论它是否具有默认值? –

+0

它也适用于具有布尔参数的任何方法吗?我只能使用两种名称略有不同的方法。 –

+0

@ArturUdod,绝对这个规则应该应用于布尔参数。 –

相关问题