修改参数值被认为是一种反模式,但我觉得它在C#中的可选参数有时是有用的:是否确定改变可选参数
public void Foo(int p1, MyClass fooObj = null)
{
if (fooObj == null)
{
fooObj = LoadFooObj(....
}
. . .
}
是这里的东西可能有害的我可能会丢失?
谢谢。
修改参数值被认为是一种反模式,但我觉得它在C#中的可选参数有时是有用的:是否确定改变可选参数
public void Foo(int p1, MyClass fooObj = null)
{
if (fooObj == null)
{
fooObj = LoadFooObj(....
}
. . .
}
是这里的东西可能有害的我可能会丢失?
谢谢。
这绝对没问题。事实上,这是一个让参数可选的好方法,不需要将数值作为常量进行烘焙。
您可以使用空合并运算符,使其略微更具可读性,但:
public void Log(string message, DateTime? timestamp = null)
{
DateTime actualTimestamp = timestamp ?? DateTime.UtcNow;
...
}
一个缺点:
fooObj = fooObj ?? LoadFooObj();
使用值类型相同的方法,你甚至可以考虑这是因为它可以防止null
被用作“正常”有意义的值 - 虽然 - 考虑您是否会在特定情况下需要这样的值。
如果你觉得它有味道,那么简单的超载怎么样。
public void Foo(int p1, MyClass fooObj)
{
. . .
}
public void Foo(int p1)
{
var fooObj = LoadFooObj(....);
Foo(p1, fooObj);
}
这样就明确了每种方法的作用,并且不会改变调用中的参数。
是的,你的代码看起来不错,谢谢。关键是我不知道是否原始代码味道) –
唯一的问题是它很难筛选出我被称为没有选项的地方。如果你把它们分开,你可以很容易地找到ide中的所有引用 –
如果你想拥有多个可选参数也很棘手 - 重载次数爆炸。 –
我要去争辩乔恩斯基特完全相反,并说这不是罚款,原因有二:
你可能只是重载Foo
,但想想这些方法的作用:他们可能应该被赋予不同的名称来描述他们做不同事情的事实。不要依赖评论来解释这一点;用代码本身清楚说明。
我不明白为什么(2)特别适用于可选参数。当然,同样的逻辑将适用于任何参数,无论它是否具有默认值? –
它也适用于具有布尔参数的任何方法吗?我只能使用两种名称略有不同的方法。 –
@ArturUdod,绝对这个规则应该应用于布尔参数。 –
这是完全常见的,并确定。关于不改变参数值的想法可能是针对人们过去编写的100多行方法。如果你只有短的方法,这不会是一个问题。 –