.NET には NULL 文字列を String.Empty に解決する方法がありますか?

StackOverflow https://stackoverflow.com/questions/1241112

  •  12-09-2019
  •  | 
  •  

質問

NULL 文字列を string.Empty に解決する 1 行のメソッドがあり、これは拡張メソッドとして役立つかもしれないと考えましたが、そうするための有用な方法が見つかりません。

これが有用であると確認できる唯一の方法は、文字列クラスの静的メソッドとして使用することです。インスタンスが null であるため、明らかにインスタンスに属性を割り当てることができず、コンパイラ エラーが発生するためです。[編集:コンパイラ エラーは初期化されていない変数が原因であり、それを誤解しました]

これをヘルパー クラスに追加することも考えましたが、発見しやすさの観点からは不必要な複雑さが増すだけです。

したがって、この質問は 2 つの部分に分かれていると思います。

  1. .NET Framework には、Null 文字列を string.Empty に解決する組み込みの方法が組み込まれていますが、これは私が途中で見逃していた一般的な知識です。
  2. そうでない場合、このメソッドを文字列クラスの静的拡張として追加する方法を知っている人はいますか?

事前に乾杯

編集:

そうですね、もう少し明確にすべきだったと思います。null 合体についてはすでによく知っていて、ハッシュ コードの計算のために十数個の文字列を検査する場所でこれを使用していました。

ご想像のとおり、互いに隣接する 12 行のコードのすべてに null 合体構文が含まれるのは目障りなので、見やすくするために null 合体操作をメソッドに移動しました。これは完璧ですが、文字列オブジェクトの完全な拡張になります。

int hashcode =
FirstValue.ResolveNull().GetHashCode() ^
SecondValue.ResolveNull().GetHashCode() ^
...

十数行にわたる文章は、次の文章よりもはるかに読みやすいです。

int hashcode =
(FirstValue ?? String.Empty).GetHashCode() ^
(SecondValue ?? String.Empty).GetHashCode() ^
...

文字列値を明示的に null として宣言せず、暗黙的な値に依存した場合、コンパイラの問題が発生しました。

 string s;

ただし、次のように明示的に定義すると、

string s = null;

非常に簡単に呼び出すことができます。

s.ResolveNull();

ご意見ありがとうございました。

役に立ちましたか?

解決

  インスタンスがnullであり、これはランタイムエラーを引き起こすとして明らかにそれがインスタンスに起因することはできませんので、

私はそれが有用である見ることができる唯一の方法は、文字列クラスの静的メソッドとしてでています。

C#3.0の拡張方法は、(それらが実際に静的であるので)ヌル受信機で呼び出されたが、インスタンスメソッドとして動作することができます。だからその拡張メソッド作るます。

他のヒント

私はこのためで構築されたものはないと思います。私が最初に考えた、と私は頻繁に行うには、合体演算子を使用します。

string s = null;
string x = s ?? string.Empty;

someExpressionInvolving(S ?? "");

string.Empty""について興奮しない点はありません - 無視できない違いがあります:

Console.WriteLine(ReferenceEquals(string.Empty, "")); // true

拡張方法:

public static class StringExtensions
{
    public static String EmptyIfNull(this String instance)
    {
        return instance ?? String.Empty;
    }
}

もちろん、あなただけのように簡単にあなたがString.Emptyの代わりにヌルを使用する必要がある場所でinstance ?? String.Emptyを書くことができます。

string test = CouldReturnNull() ?? string.Empty;

あなたはを使用することができます??オペレータ(nullで合体演算子)をC#で - あなたが何を意味するかということですか?それとも私が

?誤解しています

たとえばます。

string n = null;
string y = n ?? String.Empty;

Yだろう= String.Emptyを

string abc = s ?? string.Empty;

私は、拡張メソッドとしてこれを実装するはスウェーデンのコールの中に、私たち「は、水をフェッチする小川の反対側に移動し、」何のようなビットを感じるだろうと言うでしょう。私は、私が代わりにヌルの空の文字列を取得することを確認する必要があるとき、私は頻繁にちょうどstring.Emptyで連結します:

public void SomeMethod(string param)
{
    string notNull = param + string.Empty;
}

確かに、これは作成される余分な文字列インスタンスにつながるが、私はこの問題ではなかったにされているほとんどの実世界の状況であります。

そのための機能にはビルドがありません。しかし、あなたのような文を使用して文字列型のために少し拡張メソッド(または静的menthod)を書くことができます:

リターンの?? string.Emtpy;

string.Empty を追加するだけです 任意の文字列変数に入力すると、null が取得されないことが保証されます。

string a = null;
string b = null + string.Empty;
string c = "a" + string.Empty;

(a == string.Empty).Dump(); // False
(b == string.Empty).Dump(); // True
(c == "a").Dump(); // True

これを LinqPad に投げたので、.Dump() は

オプションを見てみると...

このテクニック

string b = null + string.Empty;

生成する

IL_0001:  ldsfld      System.String.Empty
IL_0006:  dup         
IL_0007:  brtrue.s    IL_000F
IL_0009:  pop         
IL_000A:  ldstr       ""
IL_000F:  stloc.0     

もう 1 つの人気のあるオプション:

string b = null ?? string.empty

生成する

IL_0001:  ldsfld      System.String.Empty
IL_0006:  stloc.0     

この

string b = null + "";

これを生成します

IL_0001:  ldstr       ""
IL_0006:  stloc.0     

私はまだ好意を持っています

string b = null + "";

しかし、実際には、IMO、文字列をダイジェストするときに null を処理できるように準備する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top