2009-08-28 1 views
3

内の1つのパラメータを受け入れString.Concat()のためのオーバーロードがあります上記の行は2つの文字列を連結して、複数の部分の日付/時刻文字列を形成します。なぜパッチが次の行に提出されたこの今日気づい.NET

String.Concat()の単一のパラメータオーバーロードを持つための隠れた理由がいくつかありますか、それは言語設計者によって「完全性」のために含まれていました。同じ出力を持つ

lblCompletionTime.Text = trainingSkill.EndTime.ToLocalTime().ToString(CultureInfo.CurrentCulture) 

私はとのラインを交換しました。

+0

このコードはEVEMonのものですか? :) –

+0

はい...そうです。 –

答えて

10

String.Concat(Object)は、nullを渡すとString.Emptyを返します。 ToStringは、NULLポインタ例外でクラッシュします。私はそれが何かだと思い

public static string Concat(object arg0) 
{ 
     if (arg0 == null) 
     { 
       return Empty; 
     } 
     return arg0.ToString(); 
} 

しかし、それはは、引数がnullではないことを検証しない

+0

面白いのは、ToStringをObjectの拡張メソッドにすることができ、myObjectがnullのときにmyObject.ToString()を呼び出すことさえ可能になるということです。 –

+1

@Pierre: "can"はまれに正当な理由がありません。 – STW

+0

@ Yoooder私はあなたに同意します:D –

3

MSDNによれば、String.Concat(object)

は 指定されたオブジェクトの文字列表現を作成します。

+0

Object.ToString()は多かれ少なかれ同じことを言います。 msgstr "現在のオブジェクトを表す文字列を返します。" –

4

は、私はそれが特にこれは実装があるという事実を考慮するとあまり意味がないことに同意します。私はこの方法では、より良い機能が実際に何を表現するために

String.ToStringSafe(Object obj) { } 

または類似した何かを呼ばれている可能性があることだと思うので、まだ何も連結されていません。

0

String.Concat(Object)を使用してオブジェクトを文字列に変換することは、関数のオーバーロードが設計された動作です。

String.Concat方法(オブジェクト)
指定されたオブジェクトの文字列表現を作成します。

2

String.Concat(オブジェクト)のドキュメントを見ると、nullを受け取り、空の文字列を返すという利点があります。これは、object.ToString()と比較すると利点があります。 NullReferenceExceptionがスローされます。 あなたの例では、trainingSkill.EndTimeがnullの場合、ToLocalTimeを呼び出すときにプログラムがブレークするため、役に立たない。 それは自動空の文字列とは別に(ほとんど価値を有していても良いC#では私はあなたの訂正をprefferが、私はそれがDateTime.ToString(のデフォルトの動作であるため、パラメータとしてCultureInfo.CurrentCultureを渡す必要はありませんだと思う)

+1

デフォルトの動作は特定のヨーロッパのインストールで特に不公平に見えます.ToStringはデフォルトでen-USになります。事実、FxCopはint.ToString()、DateTime.ToString()のすべてのインスタンスを、IFormatProviderを受け付けるEqualalantのOverloadで置き換えることをお勧めします。 –

+0

ドキュメントによると、DateTime.ToString()とCurrentInfo.CurrentCultureの両方でThread.CurrentThread.CurrentCultureを使用します。したがって、DateTime.ToString(CurrentInfo.CurrentCulture)を使用すると常にDateTime.ToString()と等しくなります。 – pauloya

1

ヌル値の場合)。

一般的に、このメソッドのシグネチャは関数型言語で非常に便利です。

+0

それは思考の面白い傾きですが、私は.NETベースの関数型プログラミングを見ていないことを認めなければなりません。あなたは、F#で言うと、.ToString()を使用するのを止めるでしょうか? –

+0

単一のオブジェクトの場合、ToStringは意味をなさないでしょう。再帰的に(Head | Tail - おそらくF#の構文ではなく、アイデアを得る)リストを処理している場合、両方とも同じオブジェクトを呼び出すでしょう。一つは単一オブジェクト、もう一つはリスト、またはnullです。 –

+0

FWIW、これはちょうどガット本能です。私はそれが実際にこのように動作するという証拠はありません。 –