传递NULL时为参数分配默认值

时间:2018-09-06 22:36:43

标签: c#

是否有更好的方法-

if (Number.IsNotNullOrEmpty())
{
    var status = _Logic.Order(data, Number);
} 
else
{
    var status = _Logic.Order(data);
}

Order方法的签名-

Order(Data data, string number = "4a")

我基本上是根据number是否为NULL来以不同的方式调用相同的方法。

4 个答案:

答案 0 :(得分:0)

如果您无法控制??的签名,从调用者的角度来看,编写代码的一种简化方法是使用var status = _Logic.Order(data, Number ?? "4a"); null-coalescing operator

var status = _Logic.Order(data, string.IsNullOrEmpty(Number) ? "4a" : Number);

但这仅检查空值,因此,如果您还想检查空值,则可以执行以下操作:

public static void Order (Data data)
{
    Order(data, "4a");
}

public static void Order (Data data, string number)
{
    // Do stuff here
}

但是,如果您可以控制该方法,则不是拥有一个可选参数(如果修改该参数可能会导致某些问题),另一种选择是为该方法提供不同的重载:

null

当然,这仍然不能阻止某人在数字字段中传递public static void Order (Data data, string number) { if (data == null) throw new ArgumentNullException(nameof(data)); if (string.IsNullOrEmpty(number)) number = "4a"; // Do stuff here } ,因此在某些时候,您必须进行一些参数验证。这在大多数方法中都很常见:

componentWillUnmount() {  
    // Assign this.setState to empty function to avoid console warning
    // when this.setState is called on an unmounted component
    this.setState = () => undefined;
}

答案 1 :(得分:0)

由于null是要传递给方法的有效值,因此方法通常必须自行处理参数可能为null的可能性。通常,您会看到以下内容:

public void Example(string arg)
{
    if (arg == null)
        throw new ArgumentNullException(nameof(arg));

    // …
}

在不支持传递null值的情况下。但是,显式地允许传递null值并在内部对其进行处理没有什么错误。例如,您可以仅分配一个后备值,而不是引发异常:

public void Example(string arg)
{
    if (arg == null)
        arg = "some default";

    // …
}

如果您不能修改方法来添加这种逻辑,那么您将不得不在外部进行处理。如果您自己知道后备值,则可以使用以下多种方法之一:

// null-coalescing operator
_logic.Order(data, number ?? "4a");

// ternary conditional operator
_logic.Order(data, number != null ? number : "4a" );

// adjust the value separately first
if (number == null)
    number = "4a";
_logic.Order(data, number);

如果您不知道默认值,而是不得不依靠方法签名提供的默认值,或者如果您必须调用单独的重载(不使用第二个参数),那么您将很不幸为此必须使用两个单独的调用。因此,您将无法避免这种情况:

if (number != null)
    _logic.Order(data, number);
else
    _logic.Order(data);

顺便说一句。当然,在处理字符串时,有时使用string.IsNullOrEmpty代替严格的null检查更有意义。我保留了严格的null检查以显示一般想法。您当然可以根据需要进行调整。

答案 2 :(得分:0)

传递NULL时,可以使用以下解决方案为参数分配默认值:

public static void Order (Data data, string number=null)
{
    // Do stuff here
}

答案 3 :(得分:-1)

假设由于某种原因无法重构Logic类,但是您需要使用其默认值,则可以使用以下模式:

_Logic.Order(data, Number.IsNotNullOrEmpty ? Number : DefaultForNumber.Value);

但是DefaultForNumber的实现有点痛苦。

static Lazy<string> DefaultForNumber = new Lazy<string>
    (
        () => typeof(Logic).GetMethod("Order").GetParameters()[1].DefaultValue as string
    );