每秒创建一个新字符串 - 使用String.Format或StringBuilder?

时间:2018-03-30 05:02:19

标签: c# wpf stopwatch string.format

所以我有这个课程:

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

String.builder用于循环多次将字符串添加到已有的字符串。你每次都在创建一个新的字符串,并且只将几个字符串放在一起,所以不值得努力。它甚至可能具有更高的开销,因为stringbuilder本身比字符串更昂贵。

现在格式化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}";

我经常在调试中使用它,当我想看到一堆变量而只是一个断点并且快速观察是不切实际的。

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