最好在方法中预定义多个参数

时间:2016-03-30 15:34:44

标签: c#

我想知道编码实践,并提出了问题。在一个方法中预定义多个参数是一个好主意 - 因此,当您调用该方法时,如果该值是预定义且正确的,则不必传递值。 即。

     private void ErrorMessage
     (bool isEmpty = false, bool fromAccEmpty = false, bool toAccEmpty = false){}

所以当你打电话时,你可以通过

来调用它
ErrorMessage();

ErrorMessage(true, false, true);

2 个答案:

答案 0 :(得分:2)

我认为这将是你的替补:

IdentityUserClaim

为什么我建议这样做: 考虑一下op的代码:

如果我们按照问题(public class ErrorMessage { public bool isEmpty = false; public bool fromAccEmpty = false; public bool toAccEmpty = false; } private void ShowErrorMessage(ErrorMessage errorObject) { //Do your stuff here } )中的说法调用方法,我们就无法通过为第二个参数指定值而不为第一个参数赋值来调用该方法。

使用Positional arguments可以避免这种情况,如下所示:

Named arguments

因此我们只能为第二个参数赋值,其他参数将是默认值。我们可以简单地使用建议的方法,而不会出现这些问题和混淆;请考虑以下代码段:

    ErrorMessage(fromAccEmpty :true);

答案 1 :(得分:0)

要考虑的一件事就是这个。当你看到

ErrorMessage(true, false, true, false);
代码中的

从现在起2年。这是什么意思?你也得到了正确顺序的旗帜。虽然它更啰嗦可能

FribbleErrorMessage(); // some flag = true
FrobbleErrorMessage(); // some flag = false
.... 

更清楚。 (是的,我知道你需要16个方法用于所有组合或4个标志 - 但也许有一些常见的方法可以被调用,并减少标志的数量)

另一个想法是用枚举替换bools

ErrorMessage(IsError.True, EmptyAcc.False,..);

现在您可以看到它们的含义,编译器将确保您传递正确的内容

或者非幸运的建议传递某种参数块

 ErrorMessage(new ErrorControl{IsEmpty=true});

请注意,许多人(包括我)都在默认arg值上而不是重载。为什么?因为如果你想改变默认行为你必须重新编译调用者,也许对你来说不是问题,但一般来说使封装稍微弱一些(同样的原因你应该有公共get; set;访问者而不是裸公共字段)