2017-07-08 4 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

は、あなたが本当にそれがnullを返すようにしたいですか?これによって上流のすべてのものが影響を受けると考えてください。 'GetStringSetting()'の結果がnullの場合、falseを返すほうが理にかなっていませんか? – maccettura

答えて

2

あなたはNullable<bool>にあなたの方法の種類を変更し、以下のようなあなたの1の線形計算書に継続することができます。

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

ます。また、NULL可能ブール値のデフォルト値を返しますdefault(bool?)代わりのnew bool?()を使用することができますそれはヌルです。

2

あなたは可能性が高いので、同じように、NULL可能ブール値を使用する:あなたは、むしろ偽としてnullを扱いたい場合

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

または、:

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#では、ほとんどの言語のように、正規ブール値はNULL値に設定できません。しかし、あなたは望む結果を得るためにnullable typesを使うことができます。

public bool? MyMethod() 
{ 
    // Stuff 
} 

お知らせbool?:あなたは方法がtruefalse、またはnullを返すことができるようにしたい場合は、それは戻り値の型だとして、あなたがNULL可能ブール値を指定たとえば

、。これは、ブール値がが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()); 

..or代わりに、デフォルト値を決定この場合(bool?は、他の場所で使用できるようにnullであればどうなるか)、変換してください。デフォルトとしてfalse

例:

bool newBool = MyMethod() ?? false; 

あなたの質問にはほとんど関係を持っているが、私はあなたがお勧めアドバイスの余分な部分、。代わりに、指定した文字列が有効でない場合、例外をスローし、安全でないint.Parse、の、Int32.TryParseに切り替える:int.Parsenull入力を処理できないため

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

あなたは例外を取得します。あなたはそれを前にチェックしなければなりません。戻り値を使用している場合

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

:例えば:あなたはGetStringSettingリターンがnullの場合はnullを返したい場合は

は、あなたが(bool?疑問符を追加することで、短い)Nullable<bool>に戻り値の型を変更する必要がありますNULL可能なデータ型の概要については

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

trueまたはfalseを返信して、奇妙なnullロジックを取り除くことをお勧めします。 C#7の構文を使用して

が、これは1行で行うことができます。

public bool GetBoolSetting(Settings setting) => int.TryParse(GetStringSetting(setting), out int i) && i == 1; 
関連する問題