是否有更好的方法-
if (Number.IsNotNullOrEmpty())
{
var status = _Logic.Order(data, Number);
}
else
{
var status = _Logic.Order(data);
}
Order
方法的签名-
Order(Data data, string number = "4a")
我基本上是根据number
是否为NULL来以不同的方式调用相同的方法。
答案 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
);