簡體   English   中英

如何從函數返回null或bool

[英]How can I return null or bool from a function

我有這個功能:

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

有一個問題, GetStringSetting(setting)可以返回null"0""1" 當它返回null我得到一個異常。

如果發生這種情況,我是否可以讓GetBoolSetting函數返回null?

在C#中,與大多數語言一樣,常規布爾值不可為空。 但是,您可以使用可空類型來獲得所需的結果。

例如,如果您希望方法能夠返回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

您必須將可空的布爾值轉換為正常布爾值,當然要確保它不為空:

MyBoolMethod((bool)MyMethod());

..或者,決定這種情況的默認值( bool?如果它是null,應該變成什么,以便它可以在其他地方使用),並轉換它。

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

您可以將方法的類型更改為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 bool的默認值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;
}

另外,考慮使用TryParse而不是Parse。

您得到異常,因為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
}

有關可空數據類型的概述,請參閱此鏈接

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

我建議你返回truefalse並擺脫奇怪的null邏輯。

使用C#7語法,可以在一行中進行:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM