每秒创建一个新字符串 - 使用 String.Format 或 StringBuilder?
Create new string every second - using String.Format or StringBuilder?
所以我有这个 class:
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
?
使用接受格式字符串参数的 ToString 重载。每秒 1 次 ToString 调用在资源方面非常便宜
private void UpdateElapsedTime()
{
lblEl.content = ElapsedTime.StopWatch.Elapsed.ToString(@"dd\:hh\:mm\:ss");
}
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}";
当我想查看一堆变量并且只是一个断点并且快速观察是不切实际的时候,我最常在调试中使用它。
请注意,您可以通过在变量后附加“:”然后添加常用格式字符串来包含格式。
所以我有这个 class:
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
?
使用接受格式字符串参数的 ToString 重载。每秒 1 次 ToString 调用在资源方面非常便宜
private void UpdateElapsedTime()
{
lblEl.content = ElapsedTime.StopWatch.Elapsed.ToString(@"dd\:hh\:mm\:ss");
}
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}";
当我想查看一堆变量并且只是一个断点并且快速观察是不切实际的时候,我最常在调试中使用它。
请注意,您可以通过在变量后附加“:”然后添加常用格式字符串来包含格式。