Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从函数返回null或bool_C# - Fatal编程技术网

C# 如何从函数返回null或bool

C# 如何从函数返回null或bool,c#,C#,我有这个功能: public bool GetBoolSetting(Settings setting) { return int.Parse(GetStringSetting(setting)) == 0 ? false : true; } 有一个问题是GetStringSetting(setting)可以返回null、“0”或“1”。当它返回一个null时,我得到一个异常 如果发生这种情况,我是否可以使GetBoolSetting函数返回null?您可能希望使用可为null的boo

我有这个功能:

public bool GetBoolSetting(Settings setting)
{
    return int.Parse(GetStringSetting(setting)) == 0 ? false : true;
}
有一个问题是
GetStringSetting(setting)
可以返回
null
“0”或
“1”
。当它返回一个
null
时,我得到一个异常


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

您可能希望使用可为null的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;
}

也可以考虑使用<代码> TyPARSE < /C> >而不是解析.< /P>

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

例如,如果希望某个方法能够返回
true
false
null
,则可以指定一个可为null的bool作为其返回类型:

public bool? MyMethod()
{
    // Stuff
}
注意
bool
之后的
。指定布尔值可为null的

因此,在您的情况下,您可以:

public bool? GetBoolSetting(Settings setting)
{
    string myString = GetStringSetting(setting));
    if (string.IsNullOrEmpty(myString))
        return null;
    return int.Parse(myString) != 0;
}
但是,请注意,使用诸如可为null的bools之类的类型是很棘手的。例如,如果您试图将此方法的结果传递给另一个采用bool参数的方法,则无法立即执行

public void MyBoolMethod(bool parameter)
{
}

MyBoolMethod(MyMethod()); // This doesn't compile
当然,在确保布尔值为null之后,您必须将可为null的布尔值转换为普通布尔值:

MyBoolMethod((bool)MyMethod());
..或者,确定这种情况下的默认值(如果为空,则
bool?
应该是什么,以便可以在其他地方使用),并将其转换

默认值为
false
的示例:

bool newBool = MyMethod() ?? false;
另外一条建议,与你的问题无关,但我建议你这样做。与不安全的
int.Parse
(如果提供的字符串无效,将引发异常)不同,请切换到:


出现异常是因为
int.Parse
无法处理
null
输入。你必须先检查一下

如果
GetStringSetting
返回null,则要返回null,则需要将返回类型更改为
Nullable
(缩写为添加问号:
bool?
),例如:

使用返回值时,必须检查它是否有值,以便处理起来更复杂:

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

有关可为空数据类型的概述,请参见此

您可以将方法的类型更改为并继续执行一条线性语句,如下所示:

public bool? GetBoolSetting(Settings setting)
{
    return GetStringSetting(setting) != null ? 
           int.Parse(GetStringSetting(setting)) != 0 : new bool?();//Or default(bool?)
}

您还可以使用而不是
new bool?()
,它返回可空bool的默认值为null。

我建议您返回
true
false
,并去掉奇怪的
null
逻辑

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

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

您真的希望它返回空值吗?想想所有受此影响的事情。如果
GetStringSetting()
的结果为null,那么返回false不是更有意义吗?
public bool? GetBoolSetting(Settings setting)
{
    int result = 0;
    if (!int.TryParse(GetStringSetting(setting), out result))
        return null;
    return result == 0 ? false: true;
}
public bool? GetBoolSetting(Settings setting)
{
    return GetStringSetting(setting) != null ? 
           int.Parse(GetStringSetting(setting)) != 0 : new bool?();//Or default(bool?)
}
public bool GetBoolSetting(Settings setting) => int.TryParse(GetStringSetting(setting), out int i) && i == 1;