Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C语言的调试器中显示数组#_C#_Debugging_Extension Methods - Fatal编程技术网

C# 如何在C语言的调试器中显示数组#

C# 如何在C语言的调试器中显示数组#,c#,debugging,extension-methods,C#,Debugging,Extension Methods,这是一个常见的问题:调试器将您的小数组显示为System.String[]或类似形式,但您希望在不必单击并打开的情况下查看值。怎么做 我有一个答案。也许您有一个更好的方法。首先,您需要一个模板化的扩展方法,如下所示 public static class UtilExtensions { // string join that works on any enumerable public static string Join<T>(this IEnumerable

这是一个常见的问题:调试器将您的小数组显示为
System.String[]
或类似形式,但您希望在不必单击并打开的情况下查看值。怎么做


我有一个答案。也许您有一个更好的方法。

首先,您需要一个模板化的扩展方法,如下所示

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

神奇的是,只要有CommonRow类型的值,调试器就会显示类似“1,2,3,55,99”的值。

在这种情况下,我不喜欢重写ToString()方法。对于开发人员来说,定义一个返回所需对象的字符串表示形式的属性更具可读性

使用
DebuggerDisplay
时,它将如下所示:

  public struct CommonRow {
    public object[] Values;
    public override string ToString() {
      return Values.Join(",");
    }
  }
  [DebuggerDisplay("Values = {DisplayValue}")]
  public struct CommonRow {
    public object[] Values;
    public string DisplayValue
    {
      get
      {
          return Values.Join(",");
      }
    }
  }
您可以使用C#6缩短属性(感谢@jeppe stig nielsen):

考虑到您的扩展类:

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

您可以找到
DebuggerDisplayAttribute
:msdn.microsoft.com/en-us/library/x810d419.aspx或msdn.microsoft.com/en-us/library/ms228992(v=vs.110)的文档。aspx

使用
DebuggerDisplayAttribute
:或@SebastianSchulz:如何工作?这是一个提议的答案吗?这只是一个想法。问题是,您无法将此属性添加到System.String[]中,但如果您有一个包含要调试的数组的类,您可以将此属性添加到该类中,并定义一种显示它的方式。这个答案很好。您不认为您会得到更好的属性。您永远不知道Jon Skeet何时会罢工。@Neil:很高兴您这么说,但最重要的是总有改进的余地。我想塞巴斯蒂安表现得很好。但是,如果你写得更清楚一些,这个答案是指david.pfx本人的答案,这将是有帮助的;否则,例如,
.Join(“,”
的工作原理就不清楚了。编辑:如果您根据上面的评论重复指向
[DebuggerDisplay]
文档的web链接,也可以改进答案。使用C#6.0,您还可以编写
公共字符串DisplayValue=>值。Join(,“”)如果您喜欢该语法。结果是完全一样的。@sebastian:+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()));
    }
  {
public string DisplayValue => String.Join(delim, Values.Select(v => v == null ? "null" : v.ToString()));