【问题标题】:Create new string every second - using String.Format or StringBuilder?每秒创建新字符串 - 使用 String.Format 还是 StringBuilder?
【发布时间】:2018-03-30 05:02:19
【问题描述】:

所以我有这门课:

public class ElapsedTime: BaseObservableObject
{
    public static event PropertyChangedEventHandler StaticPropertyChanged;
    private static Stopwatch _stopWatch;
    private static string _value;

    public static Stopwatch StopWatch
    {
        get { return _stopWatch; }
        set
        {
            _stopWatch = value;
        }
    }

    public static string Value
    {
        get { return _value; }
        set
        {
            _value = value;
            OnStaticPropertyChanged("Value");
        }
    }

    private static void OnStaticPropertyChanged(string propertyName)
    {
        StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(propertyName));
    }
}

更新我的Lebel

private void UpdateElapsedTime()
{
    string str = string.Format("{0:00}:{1:00}:{2:00}:{3:00}",
        ElapsedTime.StopWatch.Elapsed.Days,
        ElapsedTime.StopWatch.Elapsed.Hours,
        ElapsedTime.StopWatch.Elapsed.Minutes,
        ElapsedTime.StopWatch.Elapsed.Seconds);
    lblEl.content = str;
}

它是否在每次调用(每一秒)分配新内存并且使用StringBuilder 更好?

【问题讨论】:

  • 每秒创建一个字符串没什么好担心的。

标签: c# wpf stopwatch string.format


【解决方案1】:

使用接受格式字符串参数的 ToString 重载。每秒 1 次 ToString 调用在资源方面非常便宜

private void UpdateElapsedTime()
{
    lblEl.content = ElapsedTime.StopWatch.Elapsed.ToString(@"dd\:hh\:mm\:ss");
}

【讨论】:

  • 这是针对 OP 特定目的的更简单的解决方案。我打算在我的帖子中解释字符串插值。
【解决方案2】:

String.builder 用于当您循环多次将字符串添加到已有的内容时。您每次都在创建一个新字符串,并且只将几个字符串粘在一起,因此不值得付出努力。它甚至可能具有更高的开销,因为创建字符串生成器本身比创建字符串更昂贵。

像现在这样格式化 4 个变量和一个字符串格式之间的区别就像一纳秒,所以如果你觉得它更清晰,我不会担心。 在桌面应用程序中,代码的清晰性通常比效率重要得多。

为什么我发布答案而不是评论是因为字符串插值比使用变量编号的格式更容易使用。 总的来说,无论如何。 在这种特定情况下,一种格式更加优雅,因此此选项对于您的特定目的并不更好。 我想指出字符串插值存在。 https://docs.microsoft.com/en-gb/dotnet/csharp/language-reference/tokens/interpolated

看起来像:

lblEl.content = $"{ElapsedTime.StopWatch.Elapsed.Days:00}:{ElapsedTime.StopWatch.Elapsed.Hours:00}:{ElapsedTime.StopWatch.Elapsed.Minutes:00}:{ElapsedTime.StopWatch.Elapsed.Seconds:00}";

我最常在调试时使用它,因为我想查看一堆变量,而仅仅一个断点和快速观察是不切实际的。

请注意,您可以通过在变量后面附加“:”和通常的格式字符串来包含格式。

【讨论】:

  • 我的代码和你在这里发布的代码有什么不同?
  • 顺便说一句,现在我的标签看起来像 0:0:0:0 而不是 00:00:00:00 这就是我想要的
  • 我编辑了我的帖子,展示了如何使用字符串插值格式化字符串。在这种特殊情况下,Ash 的建议更简单。
  • 每次访问StopWatch.Elapsed - 你都会获得新的价值。访问它 4 次 -> 4 个不同的结果
  • 你是对的。而且我认为一种格式对于他的特定目的来说是一个更好的解决方案。但是......在获得日期、小时、分钟和秒之间会经过不到一秒钟的时间。可能不到一毫秒。
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 2016-02-07
  • 2021-12-13
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
相关资源
最近更新 更多