2009-08-06 3 views
5

私はnull文字列をstring.Emptyに解決する1行のメソッドを持っていますが、これは拡張メソッドとしては便利かもしれないと思っていましたが、それを作る便利な方法が見つかりません。.NETにはnull文字列をString.Emptyに解決する方法がありますか?

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

私はヘルパークラスに追加することを考えましたが、

だから、この質問は、私が思う二つの部分である:

  1. は、私がどこかに沿って見逃している一般的な知識であるString.Emptyのにnull文字列を解決する方法で構築されている.NETフレームワークをい方法?
  2. もしそうでなければ、誰かがこのメソッドを文字列クラスの静的な拡張として追加する方法を知っていますか?事前に

乾杯

編集:

さて、私は、もう少し明確にしてきた必要がありますね - 私はすでにヌルcoallescingをよく知っていると私は場所でこれを使用していましたここではハッシュコードの計算のために検査されているダースの文字列があります。

あなたが想像しているように、ヌル協調構文を含むすべてのコードは互いに密接に接していますので、私はヌル協調操作をメソッドに簡単に移行しました。しかし、それは文字列オブジェクトに最適な延長となり、完璧どちらである:ダースラインを超える

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(); 

感謝を。私は、それゆえの.dump()さん

、LinqPadでこれを投げた

+0

30秒以内に6つの返信に基づいて、うん、よく知っている。 :D –

+0

笑 - それは私がヌル共鳴を逃したことを忘れていたわけではなく、私はそれが既にこの特定の目的のために醜いものとしてそれを書いていたことを知っていた。 D – BenAlabaster

+1

私はnull文字列を扱うことができないコードは醜いと思う:-P –

答えて

6

唯一の方法は、明らかにそれができないため、文字列クラスの静的メソッドとしてですインスタンスがnullのためインスタンスに起因するため、実行時エラーが発生します。

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

+4

nullで拡張メソッドを呼び出すことができるという点は100%正しい(+1)ですが、通常はヌルコアリングよりも多くの労力がかかります。 –

+0

さて、私はそれが来るのを見ていない - あなたは正しい。私は実際に私の文字列にnullを割り当てていないだろう、それはインスタンス化後nullにデフォルト設定されていたので、私はコンパイラエラーを取得していた。実際にstring s = nullを宣言したとき。値がまだヌルであったとしても問題は解決しました...奇数 – BenAlabaster

+0

私は、Marcに同意します。それが、実際に最初の答えを '??'(Matt's)と表記した理由です。これはちょうど質問の間違った声明を指摘することでした。 –

0

ちょうど任意の文字列変数に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 

を取得することはありませんが保証されますオプションを見る...

この技術

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  

他の人気のオプション:

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を処理するために準備しなければならない

生成
+0

うわー、本当に、下票? –

24

これには何も組み込まれていないと思います。私が最初に考えた、と私は頻繁に行うには、合体演算子を使用している:私はそれが有用である見ることができた

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

Idkなぜ誰もがstring.Emptyを追加できるのはなぜでしょうか –

+3

@Allen - 意味的に、これはユーザーがnullではなく空の文字列を望んでいることを完全に明確にしています。既存の文字列に見えるものに空の文字列を追加すると、そのコードが何をしているのかを誤って解釈する可能性があります –

+0

*私は自分の投稿にILを示しました。 IMO、私の解決策はより明確ですが、主観的です。 –

4

someExpressionInvolving(s ?? "");

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

私の静的メソッドはnullのcoallescingを使用しています - 私はちょうど私が異なるフィールドをチェックするダースラインがあり、それは醜い罪のように見えるものをより読みやすくしようとしていました。 – BenAlabaster

3

拡張方法:もちろん

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

、あなたは同じように簡単な場所どこでinstance ?? String.Emptyを書くことができます -

string.Empty""について興奮しない点はありません無視できる差がありますnullの代わりにString.Emptyを使用する必要があります。

+0

私はハッシュコードを計算しているところでそれを使用していました。悲しいことに、ヌルになる可能性のある12個の文字列フィールドがあり、すべての地獄のように見えません。文字列の静的な拡張メソッド(string.ResolveNull(stringValue).GetHashCode() – BenAlabaster

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

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

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

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

1

?? Operator (null-coalescing operator)はC#で使うことができますか?それとも私は誤解したことがありますか?

例えば、

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

yはだろう= String.Emptyを。

1
string abc = s ?? string.Empty; 
0

そのための機能はありません。しかし、次のような文で文字列型の小さな拡張メソッド(または静的なmenthod)を書くことができます。

return s ?? string.Emtpy;

+0

)の方が、割り当てを話しているのではなく、検査していないので、ちょっとした作業が面白そうだと思っていました。しかし、通常はええ、私はそれを使用しようとする –

関連する問題