如何从函数返回null或bool

时间:2017-07-08 13:45:45

标签: c#

我有这个功能:

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

有一个问题,GetStringSetting(setting)可以返回null"0""1"。当它返回null时,我得到一个例外。

如果发生这种情况,我是否可以让GetBoolSetting函数返回null?

6 个答案:

答案 0 :(得分:3)

在C#中,与大多数语言一样,常规布尔值不可为空。但是,您可以使用nullable types来获得所需的结果。

例如,如果您希望某个方法能够返回truefalsenull,则指定一个可以为空的bool作为返回类型:

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;
}

但是,请注意,使用像可空的bool这样的类型是很棘手的。例如,如果您尝试将此方法的结果传递给另一个采用bool参数的方法,则无法立即执行此操作。

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;
}

答案 1 :(得分:3)

您可以将方法类型更改为Nullable<bool>,然后继续使用下面的一个线性语句:

laundry

您也可以使用default(bool?)代替public bool? GetBoolSetting(Settings setting) { return GetStringSetting(setting) != null ? int.Parse(GetStringSetting(setting)) != 0 : new bool?();//Or default(bool?) } ,它返回Nullable bool的默认值null。

答案 2 :(得分:2)

您可能想要使用可以为空的bool,如下所示:

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。

答案 3 :(得分:2)

您收到异常,因为int.Parse无法处理null输入。你必须先检查一下。

如果要在GetStringSetting返回null时返回null,则需要将返回类型更改为Nullable<bool>(通过附加问号:bool?),例如:< / p>

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
}

有关可空数据类型的概述,请参阅此link

答案 4 :(得分:2)

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

答案 5 :(得分:2)

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

使用C#7语法可以在一行中进行:

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