Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在方法中预定义多个参数是个好主意_C# - Fatal编程技术网

C# 在方法中预定义多个参数是个好主意

C# 在方法中预定义多个参数是个好主意,c#,C#,我想知道编码实践,并提出了一个问题。在一个方法中预定义多个参数是一个好主意吗?因此,当您调用该方法时,如果值是预定义的且正确的,则不必传递值。 i、 e 所以当你打电话时,你可以通过 ErrorMessage(); 或 我认为这将是您的备选方案: public class ErrorMessage { public bool isEmpty = false; public bool fromAccEmpty = false; public

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

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

ErrorMessage();


我认为这将是您的备选方案:

public class ErrorMessage
    {
        public bool isEmpty = false;
        public bool fromAccEmpty = false;
        public bool toAccEmpty = false;
    }
private void ShowErrorMessage(ErrorMessage errorObject)
    {
        //Do your stuff here
    }
我为什么提出这个建议: 考虑OP的代码:

#如果我们像他在问题中所说的那样调用方法(
位置参数
),我们不能通过为第二个参数指定值而不给第一个参数赋值来调用方法

#这可以通过使用
命名参数来避免,如下所示:

    ErrorMessage(fromAccEmpty :true);
因此,我们只能为第二个参数赋值,其他参数为默认值。我们可以简单地使用建议的方法,而不存在这些问题和困惑;考虑下面的片段:

ErrorMessage errorBoject = new ErrorMessage();
ShowErrorMessage(errorBoject);// All default values ware assigned
errorBoject.toAccEmpty = true;
ShowErrorMessage(errorBoject); // call with value for last parameter only rest are default
errorBoject.isEmpty = true;
ShowErrorMessage(errorBoject); // only the second value is default rest of them have values

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

ErrorMessage(true, false, true, false);
在2年后的代码中。这是什么意思?你把旗子的顺序也弄对了吗。虽然它可能更冗长

FribbleErrorMessage(); // some flag = true
FrobbleErrorMessage(); // some flag = false
.... 
更清楚。(是的,我知道所有组合都需要16个方法或4个标志,但可能需要调用常见的方法,并减少标志的数量)

另一个想法是用枚举替换布尔

ErrorMessage(IsError.True, EmptyAcc.False,..);
现在您可以了解它们的含义,编译器将确保您传递正确的内容

或者un lucky关于传递某种参数块的建议

 ErrorMessage(new ErrorControl{IsEmpty=true});

请注意,许多人(包括我)使用默认的arg值而不是重载。为什么?因为如果你想改变默认行为,你必须重新编译调用者,这对你来说可能不是问题,但一般来说,这会使封装变得更弱(这也是为什么你应该使用public get;set;accessors而不是裸公共字段的原因)

你是不是因为这个(我想)但考虑的很少:您将省略这些参数的频率有多高?如果你更频繁地使用默认值,那么你可以考虑使用它们(用它们的缺点,不要忽略它们)。第二个考虑因素:更应该避免这样的布尔参数混乱。使用(至少)枚举标志或强制自己使用命名参数,调用点是绝对模糊的。我使用默认值的次数比不使用的次数多,但是每个bool都有不同的if条件。当然,每个bool都有意义,但在调用点,您需要停下来思考,检查并再次思考,以记住第三个bool的含义。其他阅读你的代码的人会发现它更令人困惑。这就是为什么-例如-
ErrorMessage(ErrorMessageOptions.IsEmpty | ErrorMessageOptions.toacempty)
更好(如果添加更多选项,则可以扩展)。至少你应该强迫自己使用
ErrorMessage(isEmpty:true,ToAccepty:true)。还考虑默认参数的缺点:如果你改变它,你需要重新编译调用代码,你可能需要手动检查每个调用……我同意这个答案,但是要扩展为什么它是一个好主意-多个参数的默认值使得它不可能改变,比如说,默认设置的第三个参数,不必显式地声明前两个参数的值。@esmoore68:请看;我已经更新了答案
ErrorMessage(IsError.True, EmptyAcc.False,..);
 ErrorMessage(new ErrorControl{IsEmpty=true});