【问题标题】:ToString() override [closed]ToString() 覆盖[关闭]
【发布时间】:2020-03-09 06:05:14
【问题描述】:

我们有这门课

public class BranchCity
{
    public int Id { get; set; }
    public string Name { get; set; }
}

当我们通过这个类在 UI 中公开数据时,我们通常只使用它的Name 属性:

<div class="row">
    <div class="col-md-12">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title">
                    Branch city
                </h3>
            </div>
            <div class="panel-body">
                @Model?.BranchCity?.Name
            </div>
        </div>
    </div>
</div>

是否可以覆盖类的ToString(),只打印出这个属性?

public override string ToString() => Name ?? "";

我从许多资料中了解到,出于调试目的,使用类的所有属性覆盖 ToString() 是一种很好的做法(例如,很容易在 VS 中的 Quick Watch 窗口中看到文本表示)但是我不确定上面的方式。

public override string ToString()
{
   return $"{nameof(Id)}: {Id}, {nameof(Name)}: {Name}";
}

【问题讨论】:

  • 做适合您需要的事情。

标签: c# .net tostring


【解决方案1】:

是否可以重写仅打印此属性的类的 ToString()?

public override string ToString() => Name ?? "";

在我看来:不。

当然,您现在可以在视图中执行此操作:

@Model?.BranchCity

但是,如果您稍后阅读该代码,您会想知道:这里会打印什么?因此,您必须转到BranchCity 的定义,注意ToString() 覆盖并阅读代码以查看它打印的属性。您不必写?.Name 节省的所有时间现在都丢失了。

如果在另一个地方你想打印更多BranchCity的属性,例如因为你想在某个后台界面中看到它的Id,你把它修改为Tostring() =&gt; $"{Name} ({Id})",然后到处 在你使用过@SomeModel.BranchCity 的地方,现在这个(Id) 后缀也会被打印出来。

如果您为少数模型实现此模式,则必须为所有模型实现它。否则,您或其他合作者会期望它也适用于其他类,请使用 @SomeModel.SomeOtherProperty,如果您忘记覆盖 ToString(),请查看该属性的类名。

所以不要,明确你要打印的属性。

对于调试案例,我也主张反对覆盖ToString(),而是使用[DebuggerDisplay]

[DebuggerDisplay("{DebuggerDisplay,nq}")]
public class BranchCity
{
    public int Id { get; set; }
    public string Name { get; set; }

    private string DebuggerDisplay => $"Id: {id}, Name: {Name}";
}

【讨论】:

    【解决方案2】:

    您可以使用 ToString() 覆盖做任何您想做的事情。不要让任何人告诉你你不能。

    说真的,没有约定。做你的应用程序需要的任何事情。

    【讨论】:

      猜你喜欢
      • 2016-05-23
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 2010-11-23
      • 1970-01-01
      相关资源
      最近更新 更多