2016-08-25 4 views
1

これはよくある問題です:デバッガは小さな配列をSystem.String[]などと表示しますが、クリックして開く必要はありません。どうやってするか?C#でデバッガで配列を表示する方法

私は答えがあります。おそらくあなたはより良いものを持っているでしょう。

+0

'DebuggerDisplayAttribute'を使用してください:https://msdn.microsoft.com/en-us/library/x810d419.aspxまたはhttps://msdn.microsoft.com/en-us/library /ms228992(v=vs.110).aspx –

+0

@SebastianSchulz:どうしたらうまくいくのですか?それは提案された答えですか? –

+1

それは単なるアイデアだった。問題は、この属性をSystem.String []に追加することはできませんが、デバッグする配列を含むクラスがある場合は、この属性をクラスに追加し、どのように表示するかを定義することができます。 –

答えて

1

まず、次のようなテンプレート拡張メソッドが必要です。

public static class UtilExtensions { 
    // string join that works on any enumerable 
    public static string Join<T>(this IEnumerable<T> values, string delim) { 
     return String.Join(delim, values.Select(v => v == null ? "null" : v.ToString())); 
    } 

これはテンプレート化されているため、どのタイプの配列(またはリストなど)でも使用できます。名前空間にuseを含めることを忘れないでください!

次に、このようになりますあなたのクラスに、toString()メソッドを追加します。

public struct CommonRow { 
    public object[] Values; 
    public override string ToString() { 
     return Values.Join(","); 
    } 
    } 

そして魔法の、どこにでも型CommonRowの値があり、デバッガは、1」のようなものとして値が表示されます2,3,55,99」。

+0

この回答はかなり良いです。あなたがより良いものを手に入れようとは思わない – Neil

+0

Jon Skeetがいつ攻撃するかはわかりません。 –

+0

@Neil:あなたの言うことはいいですが、SOのアイデアは常に改善の余地があるということです。私はセバスチャンがそれを示していると思う。 –

1

この場合、ToString()メソッドをオーバーライドするのは嫌いです。開発者は、目的のオブジェクトの文字列表現を返すプロパティを定義する方が読みやすくなります。 DebuggerDisplay

が、それは次のようになります。

[DebuggerDisplay("Values = {DisplayValue}")] 
    public struct CommonRow { 
    public object[] Values; 
    public string DisplayValue 
    { 
     get 
     { 
      return Values.Join(","); 
     } 
    } 
    } 

をあなたはC#6(@ジャップ・スティグ・ニールセンのおかげ)でプロパティを短縮することができます:あなたの拡張クラスを考える

public string DisplayValue => Values.Join(","); 

を:

public static class UtilExtensions 
    { 
    // string join that works on any enumerable 
    public static string Join<T>(this IEnumerable<T> values, string delim) 
    { 
     return String.Join(delim, values.Select(v => v == null ? "null" : v.ToString())); 
    } 
    { 

拡張メソッドは、1回使用すると廃止されました。あなたも書き込むことができます。

public string DisplayValue => String.Join(delim, Values.Select(v => v == null ? "null" : v.ToString())); 

をあなたがDebuggerDisplayAttributeのドキュメントを見つけることができます。msdn.microsoft.com/en-us/library/x810d419.aspxまたはmsdn.microsoft.com/en-us/library/ms228992(v = vs.110).aspx

+1

いいです。しかし、この答えがdavid.pfx自身の答えを参照していることをより明確に書いておけば助けになります。そうでなければ、 '.Join("、 ")'がどのように動作するかは明確ではありません。 _Edit:_上記のコメントの '[DebuggerDisplay]'ドキュメントへのあなたのウェブリンクを繰り返しても、答えが改善されます。 –

+0

C#6.0では、その構文を好む場合は、 'public string DisplayValue => Values.Join("、 ");'と書くこともできます。結果はまったく同じです。 –

+0

@sebastian:ときにはデバッガのみにするという考えのため+1。しかし、1回だけ使用される可能性はありません。 –

関連する問題