2016-03-30 6 views
-5

私のアプリケーションでは、Active Directoryからの記述を取得して文字列に割り当てることで、後でその文字列を「契約済み」でチェックしてそのユーザーを無視できます。
問題はすべてのユーザーが説明フィールドに値を持っているとは限りません。その結果、Null Reference Exceptionがスローされます。私がこれを扱う唯一の方法は、String.IsNullOrEmptyを使ってもう1つのチェックを追加し、一時的な値を追加してから後でその一時的な値を削除することです。これは面倒で間違っているようです。Null値の文字列にString.Containsを使用する

チェック中に文字列にnullを処理するには何が必要ですか?私は、次の2つのコードセットを試してみました、両方のエラーをスローしています

var userDescription = (string)userDirectoryData.Properties["description"].Value; 

if (userDescription.Contains("Contracted")) 
{ 
    continue; 
} 
else 
{ 
    //Do Stuff here 
} 

そして

var userDescription = (string)userDirectoryData.Properties["description"].Value; 

if (userDescription.IndexOf("Contracted") > -1) 
{ 
    continue; 
} 
else 
{ 
    //Do Stuff here 
} 

EDIT: https://msdn.microsoft.com/en-us/library/k8b1470s.aspxによると、それが戻りますように私はString.Emptyのに設定することはできません偽陽性を引き起こす「0」の結果は、「契約」のみを含む。

+0

「一時的な値を追加する」が「String.IsNullOrEmpty」(または「String.IsNullOrWhitespace')を使用していることを意味するのは、ここでは完全に正常ではありません。 –

+2

これら2つのスニペットの違いは何ですか? –

+1

'if(userDescription!= null && userDescription.IndexOf(" Contracted ")> -1)' – Magnus

答えて

2

値は、C#NULL可能合体使用nullである場合は、空の文字列を割り当て:string.IsNullOrEmpty(又はジェームズデベロッパーの回答)を使用してC#6前

var userDescription = (string)userDirectoryData.Properties["description"].Value ?? String.Empty; 

if (userDescription.Contains("Contracted")) 
{ 
    continue; 
} 
else 
{ 
    //Do Stuff here 
} 
+0

IndexOfはString上で0を返します。チェックが間違いのフラグを立てるという意味ですが、空の値です。https://msdn.microsoft.com/en-us/library/k8b1470s.aspx – Matthew

+0

良い点。 –

+0

あなたの投稿は私のままでしたが、私は 'コンテナ 'でそれをやることができましたが、少し忘れてしまいましたが、私は憎しみの嵐を経験しましたが、答えが嫌いな人はいません。本当に人々をSOから遠ざけてしまう。 – Matthew

0

var userDescription = (string)userDirectoryData.Properties["description"].Value; 
if (!string.IsNullOrEmpty(userDescription) && userDescription.IndexOf("Contracted") > -1) 
{ 
    continue; 
} 
else 
{ 
    //Do Stuff here 
} 

必要がありますC#6では、これをヌル伝播演算子(?.)に減らすことができます:

(代わりに userDescription.Contains.の)combersome C#6.0の構文 ?.が(この特定のケースでは)生憎

if (userDescription?.Contains("Contracted") == true) { 
    continue; 
    } 
    else { 
    // Do Stuff here 
    } 

を使用することができ

if ((string)userDirectoryData.Properties["description"].Value?.IndexOf("Contracted") > -1) 
{ 
    continue; 
} 
else 
{ 
    //Do Stuff here 
} 
1

ビットBoolean?が暗黙的Booleanからをキャストすることはできないと理由です== trueを追加する必要があります。 IndexOfの場合、コードは非常にOKになります。

if (userDescription?.IndexOf("Contracted") > -1) { 
    continue; 
    } 
    else { 
    // Do Stuff here 
    } 
0

あなたがContains()IndexOfをオーバーライドして、文字列の場合は、カスタム出力を定義することができ、このようなnullである:

public static class Extensions 
{ 
    public static bool Contains(this string value, string search) 
    { 
     if(value != null) 
     { 
      return value.Contains(search); 

     } 
     else 
     { 
      // IF ITS NULL DEFINE YOUR RETURN HERE 
     } 
     return false; 
    } 

    public static int IndexOf(this string value, string search) 
    { 
     if(value != null) 
     { 
      return value.IndexOf(search); 
     } 
     else 
     { 
      // IF ITS NULL DEFINE YOUR RETURN HERE 
     } 
     return -1; 
    } 
} 

使用量は除いて同じままヌル値での振る舞いから私のコメントをチェックしてください。

+0

ビットオーバーキルだと思いませんか? – Matthew

関連する問題