我有这个功能:
public bool GetBoolSetting(Settings setting)
{
return int.Parse(GetStringSetting(setting)) == 0 ? false : true;
}
有一个问题,GetStringSetting(setting)
可以返回null
,"0"
或"1"
。当它返回null
时,我得到一个例外。
如果发生这种情况,我是否可以让GetBoolSetting
函数返回null?
答案 0 :(得分:3)
在C#中,与大多数语言一样,常规布尔值不可为空。但是,您可以使用nullable types来获得所需的结果。
例如,如果您希望某个方法能够返回true
,false
或null
,则指定一个可以为空的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)
我建议你返回true
或false
并摆脱奇怪的null
逻辑。
使用C#7语法可以在一行中进行:
public bool GetBoolSetting(Settings setting) => int.TryParse(GetStringSetting(setting), out int i) && i == 1;