原則5:いつもToString()を提供します。
10444 ワード
原則5:いつもToString()を提供します。
By D.S.Qiu
他人の労働を尊重し、オリジナルを支持します。転載は出典を明記してください。http://dsqiu.iteye.com
NET環境ではSystem.Object.ToString()が最もよく使われている方法の一つです。クライアントコードのすべての種類に合理的なバージョンを書くべきです。さもなくば、あなたのコードを使用する各ユーザに、読み取り可能な説明の属性を作成するように強制します。文字列説明は、使用者にオブジェクトの情報を説明するために使用されやすい:WPF(Windows Presentation Foundation)フレームでは、Silverlightフレームでは、Web Formsまたはコンソールから出力される。文字列の説明もデバッグに使用できます。あなたが作成した各タイプはこの方法を書き換えるべきです。より複雑なタイプを作成する場合は、より複雑なIRATAble.ToStringを実現する必要があります。この方法を書き直したり、書いたりしていないと、お客様がこの問題を修正するように強制されます。
System.Objectのバージョンはタイプの全限定名前に戻ります。この情報はほとんど役に立ちません。「System.Drawingg.Rect」「MyNamespace.Point」「SomeSample.Size」はお客様に展示する情報ではありません。これはあなたがToString()を書き換えていないと得られた情報です。クラスは一回だけ書きますが、お客さんは何回も使います。あなたの書くタイプがもっと多く働いたら、あなたの利用者から報酬が得られます。
一番簡単な需要を考えます。System.Object.ToString()を書き直します。作成したクラスはToStringを書き直す必要があります。一番よく使われているテキストの説明を提供するために。以下のカスタムクラスは、3つのpublic属性を提供します。
引き継ぐObject.ToStringバージョンは「Custrormer」を発揮します。この情報は何にも役に立たない。ToStringを使っても、デバッグのためだけに、それよりもっと複雑なはずです。
ToStering()の方法を書き直して、この種類のテキスト説明を返してもらうべきです。Cusstomerの例では、nameです。
この原則に従わない他の提案があれば、上の方法であなたの種類のためにこの方法を書き直してください。これは一人一人の時間を直接節約します。Object.ToStringメソッドの合理的な実装を提供すると、このクラスのオブジェクトはWPFコントロール、Siverlightコントロール、Web Formコントロール、または印刷出力に簡単に追加されます。NET BCLは、各コントロールに書き換えたObject.ToString()を使用して、対象を説明します。coboboxboxes、list boxs、text boxes、および他のコントロールです。WPFまたはWeb FormでCusstomerのオブジェクトリストを作成すれば、System.sonine.Writeline()を通じてSystem.String.Format()またはToString()のnameテキストを出力できます。
いつでも.NET BCLはCusstomerの文字列説明を取得したいです。Customerタイプは属性Nameを提供します。上の簡単な3行のコードはすべての基本的な需要を処理します。
C⻠3.0は匿名クラスにデフォルトのToString()をコンパイルした。デフォルトで生成されたToString()は、各要素の属性値を出力します。属性の説明のシーケンスはLIQクエリの結果であり、彼らの値よりも彼らのタイプの情報が表示されます。下のコードを見てください。
表示されます
さらに、コンパイラが匿名クラスのために生成した出力は、ToString()メソッドを書き換えない限り、あなたがカスタマイズしたタイプよりも優れています。コンパイラよりも方法のスコープで一時的なタイプのためのより良いサポートを利用者に提供するべきです。
以前定義したCustoomerタイプは、Name,Revenue,Phoneの三つの属性があります。書き換えたSystem.ToString()はNameのみを使用しました。この欠陥はIormatitalbeインターフェースを実現することで解決できます。Itrmatitableには、重負荷のToString()方法で指定されたクラスのフォーマット出力情報が含まれています。異なるフォーマットの文字列出力を作成するには、このインターフェースが必要です。定義されたタイプはこのインターフェースのオブジェクトです。レポートを作成することができますを使用して、CustomerのNameと昨年の収入を含むRevenueを表形式で出力します。Iormatitalbe.ToStringはこの役割を提供して、クラスの出力文字列をフォーマットすることができます。Itrmatble.ToSteringメソッド宣言は、フォーマットする文字列とフォーマットプロバイダを含んでいます。
書式設定された文字列を使って、自分のタイプの書式を指定できます。書式設定された文字のキー文字を指定できます。このCustoomerの例では、nを指定してNameを表示し、rはRevenue、pはPhoneを表します。また、以下のIFFmatble.ToSteringバージョンと同様に、コンビネーションキー文字を指定できます。
次の関数を追加して、お客様のコードにCustomerデータの表示を指定できます。
異なるクラスに対しては、IFomrattable.ToString()の実装が特定されますが、IFormatbleインターフェースを実現する場合には、いくつかの状況を実現しなければなりません。まず、一般フォーマットの「G」をサポートしなければなりません。第二に、空のフォーマットをサポートします。「」とnull。書き換えたOjbect.ToStringメソッドは、この3つのフォーマットのために同じ文字列を返す必要があります。NETレコードクラス(BCL)は、IFormatibleを実現したクラスごとに、Object.ToStering()を呼び出す。NET BCLは、フォーマット文字列nullを使用して、IFFmatble.ToString()を使用することが多いが、文字列をフォーマットするためにフォーマット文字Gを使用することは少ない。IRAmatbleインターフェースを追加した場合、この3つの標準フォーマットをサポートしていないと、BCLの文字列が自動的に変換される仕様を破ってしまいます。これのIFormatibleはすぐに暴走します。あなたのタイプはすべての可能なフォーマットをサポートする必要があると予想することはできません。多くの場合、少数の一般的な書式を選択します。クライアントコードはすべての境界をカバーするべきです。
Itrmatitable.ToStering()の2番目のパラメータはIFFT Providerインターフェースを実現する対象である必要があります。このオブジェクトはあなたが予想していなかったフォーマットのサポートを提供することができます。前のIFFTAble.ToSteringの実装をご覧になると、確かにデジタルフォーマットのオプションは提供されていません。デジタルの出力を提供するのは当然のことです。いくつかのフォーマットの文字をサポートしても、ユーザーはいつか、いくつかのフォーマットが予想されていないことを発見します。それはなぜ方法の中で最初の何行がIFFT Providerを実現する対象を調べて操作を依頼したのですか?
クラスの定義からクラスの使用者にキャラクターを移します。あなたが必要なフォーマットがサポートされていないことが分かります。例えば、CustomerのNameの文字の長さは20より大きいです。Customer Nameのフォーマットを変更して50文字の長さを出力します。
それはなぜIFFT Providerインターフェースが生まれたのですか?あなたが作成したクラスはIFFT ProviderとICustomerProviderの組合せを実現することによって、カスタマイズされたフォーマット出力を実現できます。IFFT Providerインターフェースは、Get Format()を定義しています。Get Format()メソッドはICustom Formaterインターフェースを実現したオブジェクトを返します。ICustom Formaterインターフェースは、実際の出力フォーマットを指定する方法です。次の2つのクラスの作成は、50列を使ってCustomer Nameの出力を出力するように修正されます。
Get FormメソッドはICustom Formaterインターフェースを実現するオブジェクトを作成するために返されます。要求された方式の中で、ICustom Formater.Format()した実際のフォーマットは仕事を出力します。ICustom Format.Format()を使ってフォーマット文字列を定義して、1つの過程の中で複数のフォーマットを指定する需要を満たすことができます。フォーマット提供器は、Get Formatメソッドから戻ってきたICustom Formaterです。
あなたが定義したフォーマットを指定するためには、呼び出しパラメータがIFFT Providerオブジェクトのstings.Format()を表示する必要があります。
今はキャラをタイプの定義者に切り返します。Object.ToString()を書き換えるのは、非常に簡単にクラスの文字列説明を提供する方法です。クラスを定義するときは、この方法を書き換えるべきです。それは最も明らかで常用する種類の説明です。これはあまり冗長ではないです。コントロール、HTMLページ、または他の人が読むところに現れます。希少類はより複雑な情報を出力する必要がある場合、Iormatibleインターフェースの実現を十分に活用することができます。これは標準的な方法でクラスのテキスト出力を定義することができます。それを無視すると、自分で実現するフォーマットが必要です。 この解決策は、使用者が対象の内部状態を確認しないため、より多くのコードを必要とする。同様に、この実装は、すべての潜在的なフォーマットを予測することができない。
最後に、使用者はあなたのタイプの情報を推測します。テキストの出力が分かりますので、できるだけ簡単な情報を提供してください。すべてのクラスはToStringを書き換えます。ToString()の出力を短く合理的にする。
リボン:
この数日間は仕事が忙しいので、毎日体力をつけて翻訳しています。これは前编と比较して似ています。タイトルを覚えてもいいです。もっと多いのはプログラミング思惟です。仕事をしてから、自分が弱すぎることに気づきました。以前は本を読んで、両亲がお金を稼ぐのが难しいと思いました。台に上がると、自分ができると信じています。
各種のすっきりしないことを歓迎して、各種は噴きます。これを書くのは個人の趣味です。
本书の他の章の翻訳については、クリックしてを転载してください。
D.S.Qiuに対して何か提案や意見があれば、記事の後ろにコメントしたり、メールしたりすることができます。[email protected])交流、励ましと支持は私の前進の原動力です。もっと良い共有ができることを望んでいます。
転載は最初に出典を明記してください。http://dsqiu.iteye.com/blog/1979985。
もっと素晴らしいです。D.S.Qiuのブログとマイクロブログ(ID:静水プログレッシブ)に注目してください。
By D.S.Qiu
他人の労働を尊重し、オリジナルを支持します。転載は出典を明記してください。http://dsqiu.iteye.com
NET環境ではSystem.Object.ToString()が最もよく使われている方法の一つです。クライアントコードのすべての種類に合理的なバージョンを書くべきです。さもなくば、あなたのコードを使用する各ユーザに、読み取り可能な説明の属性を作成するように強制します。文字列説明は、使用者にオブジェクトの情報を説明するために使用されやすい:WPF(Windows Presentation Foundation)フレームでは、Silverlightフレームでは、Web Formsまたはコンソールから出力される。文字列の説明もデバッグに使用できます。あなたが作成した各タイプはこの方法を書き換えるべきです。より複雑なタイプを作成する場合は、より複雑なIRATAble.ToStringを実現する必要があります。この方法を書き直したり、書いたりしていないと、お客様がこの問題を修正するように強制されます。
System.Objectのバージョンはタイプの全限定名前に戻ります。この情報はほとんど役に立ちません。「System.Drawingg.Rect」「MyNamespace.Point」「SomeSample.Size」はお客様に展示する情報ではありません。これはあなたがToString()を書き換えていないと得られた情報です。クラスは一回だけ書きますが、お客さんは何回も使います。あなたの書くタイプがもっと多く働いたら、あなたの利用者から報酬が得られます。
一番簡単な需要を考えます。System.Object.ToString()を書き直します。作成したクラスはToStringを書き直す必要があります。一番よく使われているテキストの説明を提供するために。以下のカスタムクラスは、3つのpublic属性を提供します。
public class Customer
{
public string Name
{
get;
set;
}
public decimal Revenue
{
get;
set;
}
public string ContactPhone
{
get;
set;
}
public override string ToString()
{
return Name;
}
}
引き継ぐObject.ToStringバージョンは「Custrormer」を発揮します。この情報は何にも役に立たない。ToStringを使っても、デバッグのためだけに、それよりもっと複雑なはずです。
ToStering()の方法を書き直して、この種類のテキスト説明を返してもらうべきです。Cusstomerの例では、nameです。
public override string ToString()
{
retrun Name;
}
この原則に従わない他の提案があれば、上の方法であなたの種類のためにこの方法を書き直してください。これは一人一人の時間を直接節約します。Object.ToStringメソッドの合理的な実装を提供すると、このクラスのオブジェクトはWPFコントロール、Siverlightコントロール、Web Formコントロール、または印刷出力に簡単に追加されます。NET BCLは、各コントロールに書き換えたObject.ToString()を使用して、対象を説明します。coboboxboxes、list boxs、text boxes、および他のコントロールです。WPFまたはWeb FormでCusstomerのオブジェクトリストを作成すれば、System.sonine.Writeline()を通じてSystem.String.Format()またはToString()のnameテキストを出力できます。
いつでも.NET BCLはCusstomerの文字列説明を取得したいです。Customerタイプは属性Nameを提供します。上の簡単な3行のコードはすべての基本的な需要を処理します。
C⻠3.0は匿名クラスにデフォルトのToString()をコンパイルした。デフォルトで生成されたToString()は、各要素の属性値を出力します。属性の説明のシーケンスはLIQクエリの結果であり、彼らの値よりも彼らのタイプの情報が表示されます。下のコードを見てください。
int[] list = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var test = new { Name = "Me",
Numbers = from l in list select l };
Console.WriteLine(test);
表示されます
{ Name = Me, Numbers = System.Linq.Enumerable+WhereSelectArrayIterator`2 [System.Int32,System.Int32] }
さらに、コンパイラが匿名クラスのために生成した出力は、ToString()メソッドを書き換えない限り、あなたがカスタマイズしたタイプよりも優れています。コンパイラよりも方法のスコープで一時的なタイプのためのより良いサポートを利用者に提供するべきです。
以前定義したCustoomerタイプは、Name,Revenue,Phoneの三つの属性があります。書き換えたSystem.ToString()はNameのみを使用しました。この欠陥はIormatitalbeインターフェースを実現することで解決できます。Itrmatitableには、重負荷のToString()方法で指定されたクラスのフォーマット出力情報が含まれています。異なるフォーマットの文字列出力を作成するには、このインターフェースが必要です。定義されたタイプはこのインターフェースのオブジェクトです。レポートを作成することができますを使用して、CustomerのNameと昨年の収入を含むRevenueを表形式で出力します。Iormatitalbe.ToStringはこの役割を提供して、クラスの出力文字列をフォーマットすることができます。Itrmatble.ToSteringメソッド宣言は、フォーマットする文字列とフォーマットプロバイダを含んでいます。
string System.IFormattable.ToString(string format, IFormatProvider formatProvider)
書式設定された文字列を使って、自分のタイプの書式を指定できます。書式設定された文字のキー文字を指定できます。このCustoomerの例では、nを指定してNameを表示し、rはRevenue、pはPhoneを表します。また、以下のIFFmatble.ToSteringバージョンと同様に、コンビネーションキー文字を指定できます。
// supported formats:
// substitute n for name.
// substitute r for revenue
// substitute p for contact phone.
// Combos are supported: nr, np, npr, etc
// "G" is general.
string System.IFormattable.ToString(string format, IFormatProvider formatProvider)
{
if (formatProvider != null)
{
ICustomFormatter fmt = formatProvider.GetFormat(
this.GetType()) as ICustomFormatter;
if (fmt != null)
return fmt.Format(format, this, formatProvider);
}
switch (format)
{
case "r":
return Revenue.ToString();
case "p":
return ContactPhone;
case "nr":
return string.Format("{0,20}, {1,10:C}",
Name, Revenue);
case "np":
return string.Format("{0,20}, {1,15}",
Name, ContactPhone);
case "pr":
return string.Format("{0,15}, {1,10:C}",
ContactPhone, Revenue);
case "pn":
return string.Format("{0,15}, {1,20}",
ContactPhone, Name);
case "rn":
return string.Format("{0,10:C}, {1,20}",
Revenue, Name);
case "rp":
return string.Format("{0,10:C}, {1,20}",
Revenue, ContactPhone);
case "nrp":
return string.Format("{0,20}, {1,10:C}, {2,15}",
Name, Revenue, ContactPhone);
case "npr":
return string.Format("{0,20}, {1,15}, {2,10:C}",
Name, ContactPhone, Revenue);
case "pnr":
return string.Format("{0,15}, {1,20}, {2,10:C}",
ContactPhone, Name, Revenue);
case "prn":
return string.Format("{0,15}, {1,10:C}, {2,15}",
ContactPhone, Revenue, Name);
case "rpn":
return string.Format("{0,10:C}, {1,15}, {2,20}",
Revenue, ContactPhone, Name);
case "rnp":
return string.Format("{0,10:C}, {1,20}, {2,15}",
Revenue, Name, ContactPhone);
case "n":
case "G":
default:
return Name;
}
}
次の関数を追加して、お客様のコードにCustomerデータの表示を指定できます。
IFormattable c1 = new Customer();
Console.WriteLine("Customer record: {0}",c1.ToString("nrp", null));
異なるクラスに対しては、IFomrattable.ToString()の実装が特定されますが、IFormatbleインターフェースを実現する場合には、いくつかの状況を実現しなければなりません。まず、一般フォーマットの「G」をサポートしなければなりません。第二に、空のフォーマットをサポートします。「」とnull。書き換えたOjbect.ToStringメソッドは、この3つのフォーマットのために同じ文字列を返す必要があります。NETレコードクラス(BCL)は、IFormatibleを実現したクラスごとに、Object.ToStering()を呼び出す。NET BCLは、フォーマット文字列nullを使用して、IFFmatble.ToString()を使用することが多いが、文字列をフォーマットするためにフォーマット文字Gを使用することは少ない。IRAmatbleインターフェースを追加した場合、この3つの標準フォーマットをサポートしていないと、BCLの文字列が自動的に変換される仕様を破ってしまいます。これのIFormatibleはすぐに暴走します。あなたのタイプはすべての可能なフォーマットをサポートする必要があると予想することはできません。多くの場合、少数の一般的な書式を選択します。クライアントコードはすべての境界をカバーするべきです。
Itrmatitable.ToStering()の2番目のパラメータはIFFT Providerインターフェースを実現する対象である必要があります。このオブジェクトはあなたが予想していなかったフォーマットのサポートを提供することができます。前のIFFTAble.ToSteringの実装をご覧になると、確かにデジタルフォーマットのオプションは提供されていません。デジタルの出力を提供するのは当然のことです。いくつかのフォーマットの文字をサポートしても、ユーザーはいつか、いくつかのフォーマットが予想されていないことを発見します。それはなぜ方法の中で最初の何行がIFFT Providerを実現する対象を調べて操作を依頼したのですか?
クラスの定義からクラスの使用者にキャラクターを移します。あなたが必要なフォーマットがサポートされていないことが分かります。例えば、CustomerのNameの文字の長さは20より大きいです。Customer Nameのフォーマットを変更して50文字の長さを出力します。
それはなぜIFFT Providerインターフェースが生まれたのですか?あなたが作成したクラスはIFFT ProviderとICustomerProviderの組合せを実現することによって、カスタマイズされたフォーマット出力を実現できます。IFFT Providerインターフェースは、Get Format()を定義しています。Get Format()メソッドはICustom Formaterインターフェースを実現したオブジェクトを返します。ICustom Formaterインターフェースは、実際の出力フォーマットを指定する方法です。次の2つのクラスの作成は、50列を使ってCustomer Nameの出力を出力するように修正されます。
// Example IFormatProvider:
public class CustomFormatter : IFormatProvider
{
#region IFormatProvider Members
// IFormatProvider contains one method.
// This method returns an object that
// formats using the requested interface.
// Typically, only the ICustomFormatter
// is implemented
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatte))
return new CustomerFormatProvider();
return null;
}
#endregion
// Nested class to provide the
// custom formatting for the Customer class.
private class CustomerFormatProvider :ICustomFormatter
{
#region ICustomFormatter Members
public string Format(string format, object arg, IFormatProvider formatProvider)
{
Customer c = arg as Customer;
if (c == null)
return arg.ToString();
return string.Format("{0,50}, {1,15}, {2,10:C}",c.Name, c.ContactPhone, c.Revenue);
}
#endregion
}
}
Get FormメソッドはICustom Formaterインターフェースを実現するオブジェクトを作成するために返されます。要求された方式の中で、ICustom Formater.Format()した実際のフォーマットは仕事を出力します。ICustom Format.Format()を使ってフォーマット文字列を定義して、1つの過程の中で複数のフォーマットを指定する需要を満たすことができます。フォーマット提供器は、Get Formatメソッドから戻ってきたICustom Formaterです。
あなたが定義したフォーマットを指定するためには、呼び出しパラメータがIFFT Providerオブジェクトのstings.Format()を表示する必要があります。
Console.WriteLine(string.Format(new CustomFormatter(), "", c1));
今はキャラをタイプの定義者に切り返します。Object.ToString()を書き換えるのは、非常に簡単にクラスの文字列説明を提供する方法です。クラスを定義するときは、この方法を書き換えるべきです。それは最も明らかで常用する種類の説明です。これはあまり冗長ではないです。コントロール、HTMLページ、または他の人が読むところに現れます。希少類はより複雑な情報を出力する必要がある場合、Iormatibleインターフェースの実現を十分に活用することができます。これは標準的な方法でクラスのテキスト出力を定義することができます。それを無視すると、自分で実現するフォーマットが必要です。 この解決策は、使用者が対象の内部状態を確認しないため、より多くのコードを必要とする。同様に、この実装は、すべての潜在的なフォーマットを予測することができない。
最後に、使用者はあなたのタイプの情報を推測します。テキストの出力が分かりますので、できるだけ簡単な情報を提供してください。すべてのクラスはToStringを書き換えます。ToString()の出力を短く合理的にする。
リボン:
この数日間は仕事が忙しいので、毎日体力をつけて翻訳しています。これは前编と比较して似ています。タイトルを覚えてもいいです。もっと多いのはプログラミング思惟です。仕事をしてから、自分が弱すぎることに気づきました。以前は本を読んで、両亲がお金を稼ぐのが难しいと思いました。台に上がると、自分ができると信じています。
各種のすっきりしないことを歓迎して、各種は噴きます。これを書くのは個人の趣味です。
本书の他の章の翻訳については、クリックしてを転载してください。
D.S.Qiuに対して何か提案や意見があれば、記事の後ろにコメントしたり、メールしたりすることができます。[email protected])交流、励ましと支持は私の前進の原動力です。もっと良い共有ができることを望んでいます。
転載は最初に出典を明記してください。http://dsqiu.iteye.com/blog/1979985。
もっと素晴らしいです。D.S.Qiuのブログとマイクロブログ(ID:静水プログレッシブ)に注目してください。