文字列が空またはnullの場合の.Trim()

私はjsonの形でクライアントからいくつかのデータを受け取ります。 私はこれを書いている:

string TheText;//or whould it be better string TheText = ""; ?
TheText = ((serializer.ConvertToType(dictionary["TheText"])).Trim());

jsonから解析されている変数が空に戻った場合、.Trim()メソッドを呼び出すとこのコードはクラッシュしますか?

ありがとう。

11
C#6.0では、theText?.Trim()のようなnull条件付き演算子を使用できるようになりました。
追加された 著者 Santosh,
それがヌルなら、それはクラッシュします...
追加された 著者 BoltClock,
(myValue ?? "").Trim()は常に動作します。
追加された 著者 Larry,

7 答え

シリアライザが空の文字列を返す場合、 Trim は何も行いません。

シリアライザが null を返した場合は、 Trim の呼び出しで NullReferenceException を取得します。

あなたのコードは次のように書かれています(初期化に関する限り):

string theText = 
            ((serializer.ConvertToType(dictionary["TheText"])).Trim());

変数を宣言して初期化し、直ちに変数に代入することには意味がありません。

シリアライザが返すものがわからない場合は、以下のコードが最も安全です。

string theText = ((serializer.ConvertToType(dictionary["TheText"])));

if(!string.IsNullOrEmpty(theText))
{
    theText = theText.Trim();
}
18
追加された
あなたはフィールドの負荷をトリミングする必要がある場合は、これは痛みです、文字列がnullの場合、トリミングメソッドを拡張する方法はありませんか?
追加された 著者 JsonStatham,
@Odedええ、怠け者で、他の誰かのために参照用に投稿された
追加された 著者 JsonStatham,
それはより明確になります。
追加された 著者 frenchie,
@SelectDistinct - あなたは常にそれを行う拡張メソッドを書くことができます。
追加された 著者 Oded,

Calling Trim() on an empty string will result in an empty string. Calling Trim() on null will throw NullReferenceException

10
追加された
@CodeBlend:空白はどういう意味ですか?
追加された 著者 Armen Tsirunyan,
string.IsNullOrEmptyOrBlank を確認する最もクリーンな方法は何ですか?
追加された 著者 Coops,
追加された 著者 Coops,

トリムしたいフィールドがいくつかありますが、特定のフィールドにNULLがあるレコードの例外が発生した場合は、簡単な拡張メソッドを記述するのが最も簡単な方法です。

public static class ExtensionMethods
    {
        public static string TrimIfNotNull(this string value)
        {
            if (value != null)
            {
                return value.Trim();
            }
            return null;
        }
    }

サンプル使用例:

string concatenated = String.Format("{0} {1} {2}", myObject.fieldOne.TrimIfNotNull(), myObject.fieldTwo.TrimIfNotNull(), myObject.fieldThree.TrimIfNotNull());
9
追加された

elvis演算子を使うことができます:

GetNullableString()?.Trim();//returns NULL or trimmed string
6
追加された

まず、 TheText "" に初期化する方がよいでしょう。あなたはすぐ後にそれに割り当てています。 (空の文字列を使用する必要がある場合は、代わりに string.Empty を使用してください。

次に、いいえ、クラッシュしません。 Trim()は空の文字列でうまく動作します。 "空"であれば null になり、そうであればクラッシュします。 null-coalesce演算子を使用して修正できます。

string TheText = (serializer.ConvertToType(dictionary["TheText"]) ?? string.Empty).Trim();
2
追加された
私は、 string.Empty "" より優れているという普遍的な合意はないと思います。 1つは "" が好きです。
追加された 著者 CodesInChaos,
私のテストでは、 "" string.Empty はまったく同じインスタンスを指していることがわかりました。そのインスタンスはAppDomainsで共有されます。 NGenを使用すると違いがあるかもしれませんが、少なくとも通常のプログラムでは、これらの2つの技術的な違いはありませんでした。
追加された 著者 CodesInChaos,

いくつかのコメントで示唆されているように、この構文でc#6のNULL条件付き演算子を使用できるようになりました。

string TheText = (serializer.ConvertToType(dictionary["TheText"]))?.Trim();

Documentation: https://msdn.microsoft.com/en-us/library/dn986595.aspx

2
追加された

このコードを吹き出しとして使うことができます

 string theText = (((serializer.ConvertToType(dictionary["TheText"])))+ string.Empty).Trim();
0
追加された