如何从函数中返回null或bool

5

我有这个函数:

public bool GetBoolSetting(Settings setting)
{
    return int.Parse(GetStringSetting(setting)) == 0 ? false : true;
}

存在一个问题,即GetStringSetting(setting)可能返回null"0""1"。当它返回null时,我会收到一个异常。

如果发生这种情况,是否有可能使GetBoolSetting函数返回null


2
你真的想让它返回 null 吗?考虑一下上游受到的所有影响。如果 GetStringSetting() 的结果为 null,返回 false 不是更合理吗? - maccettura
6个回答

5
您可以将方法的类型更改为Nullable<bool>,并像下面一样继续执行您的单行语句:
public bool? GetBoolSetting(Settings setting)
{
    return GetStringSetting(setting) != null ? 
           int.Parse(GetStringSetting(setting)) != 0 : new bool?();//Or default(bool?)
}

您也可以使用default(bool?)代替new bool?(),它返回Nullable布尔类型的默认值null。


3
在C#中,就像大多数语言一样,普通布尔值不可为空。但是您可以使用可空类型来获得所需的结果。
例如,如果您希望方法能够返回truefalsenull,则需要指定可空布尔值作为其返回类型:
public bool? MyMethod()
{
    // Stuff
}

请注意bool后面的问号?。这表示该布尔值是可空的。
因此在您的情况下,您可以执行以下操作:
public bool? GetBoolSetting(Settings setting)
{
    string myString = GetStringSetting(setting));
    if (string.IsNullOrEmpty(myString))
        return null;
    return int.Parse(myString) != 0;
}

注意,然而使用可空布尔类型等类型是很棘手的。例如,如果你试图将这个方法的结果传递给另一个接受布尔参数的方法,你将无法立即这样做。

public void MyBoolMethod(bool parameter)
{
}

MyBoolMethod(MyMethod()); // This doesn't compile

在将可空布尔值转换为普通布尔值之前,您需要确保它不是 null:

MyBoolMethod((bool)MyMethod());

..或者,可以为这种情况决定一个默认值(如果bool?为空,它应该变成什么,以便在其他地方使用),然后进行转换。

false作为默认值的示例:

bool newBool = MyMethod() ?? false;

这里有一个额外的建议,虽然和你的问题关系不大,但我推荐你使用。不要使用不安全的int.Parse,如果提供的字符串无效会抛出异常,而是改用Int32.TryParse

public bool? GetBoolSetting(Settings setting)
{
    string myString = GetStringSetting(setting));
    int output = -1;
    if (string.IsNullOrEmpty(myString) || !int.TryParse(myString, out output))
        return null;
    return output != 0;
}

2
您可能需要使用可空布尔值,如下所示:
public bool? GetBoolSetting(Settings setting)
{
    var s = GetStringSetting(setting);
    if (string.IsNullOrEmpty(s))
        return null;
    return int.Parse(s) == 0 ? false : true;
}

或者,如果你更愿意把null视为false:

public bool GetBoolSetting(Settings setting)
{
    var s = GetStringSetting(setting);
    if (string.IsNullOrEmpty(s))
        return false;
    return int.Parse(s) == 0 ? false : true;
}

此外,考虑使用TryParse而不是Parse。

2
你之所以会得到异常是因为 int.Parse 无法处理 null 的输入。你需要在使用之前进行检查。
如果你希望当 GetStringSetting 返回 null 时返回 null,你需要将返回类型更改为可空的 Nullable<bool>(在末尾加上问号: bool?),例如:
public bool? GetBoolSetting(Settings setting)
{
  var strSetting = GetStringSetting(setting);
  if (string.IsNullOrEmpty(strSetting))
    return null;
  return int.Parse(strSetting) == 0 ? false : true;
}

在使用返回值时,必须检查它是否有值,这样处理起来就更加复杂:

var boolSetting = GetBoolSetting(...);
if (boolSetting.HasValue)
{
    // Check boolSetting.Value
}
else
{
     // Handle null value
}

如果想了解可空数据类型的概述,请参考此链接


2
public bool? GetBoolSetting(Settings setting)
{
    int result = 0;
    if (!int.TryParse(GetStringSetting(setting), out result))
        return null;
    return result == 0 ? false: true;
}

2

我建议你返回truefalse并且摆脱奇怪的null逻辑。

使用C# 7语法,这可以在一行中完成:

public bool GetBoolSetting(Settings setting) => int.TryParse(GetStringSetting(setting), out int i) && i == 1;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接