2017-07-08 42 views
3

我有这样的功能:我怎样才能返回null或布尔从功能

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

存在这样GetStringSetting(setting)问题可以退货null"0""1"。当它返回一个null我收到一个异常。

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

+2

你真的希望它返回一个空?想想所有受此影响的上游事件。如果GetStringSetting()的结果为空,返回false是否更有意义? – maccettura

回答

2

您可以将方法的类型更改为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?()返回可空布尔的默认值那是空的。

2

你可能想用一个可空布尔值,像这样:

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

或者,如果你宁愿把null作为错误:

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

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

3

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

例如,如果你想有一个方法能够返回truefalse,或null,您可以指定一个可空布尔值,因为它的返回类型:

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 

你将不得不您可空布尔值转换为一个正常的,当然之后确保它是空:

MyBoolMethod((bool)MyMethod()); 

..或者作为选择,确定一个缺省值对于这种情况(如果bool?为空以便它可以在其他地方使用,则该变为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

你得到的异常,因为int.Parse不能处理null输入。你必须先检查它。

如果你想返回null GetStringSetting返回null,则需要(通过附加一个问号简称:bool?)的返回类型更改为Nullable<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 
} 

对于可为空的数据类型的概述,请参阅本link

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;