C# 链接字符串方法时的内存消耗

C# 链接字符串方法时的内存消耗,c#,string,immutability,method-chaining,C#,String,Immutability,Method Chaining,我知道C#中的string是一种不可变类型。当您链接字符串函数时,每个函数都实例化一个新的字符串,这是真的吗 如果这是真的,那么使用链接方法对字符串执行过多操作的最佳实践是什么 当您链接字符串函数时,每个函数都实例化一个新的字符串,这是真的吗 一般来说,是的。每个返回修改字符串的函数都是通过创建一个新字符串对象来实现的,该对象包含与原始字符串分开存储的完整新字符串 有一些方法可以避免这种情况,特别是当您从不同的部分创建字符串时。但一般来说,如果不在字符串之间创建多个对象,很难说如何做得更好 尽管

我知道C#中的
string
是一种不可变类型。当您链接字符串函数时,每个函数都实例化一个新的
字符串
,这是真的吗

如果这是真的,那么使用链接方法对
字符串执行过多操作的最佳实践是什么

当您链接字符串函数时,每个函数都实例化一个新的
字符串
,这是真的吗

一般来说,是的。每个返回修改字符串的函数都是通过创建一个新字符串对象来实现的,该对象包含与原始字符串分开存储的完整新字符串

有一些方法可以避免这种情况,特别是当您从不同的部分创建字符串时。但一般来说,如果不在字符串之间创建多个对象,很难说如何做得更好

尽管这听起来很糟糕,但它通常不是一个大问题:虽然它可能很昂贵,但由于字符串操作而产生的无关字符串对象很少是性能差的原因。除非您正在使用字符串执行高性能操作,否则您可能会忽略这样一个事实,即您一直在创建新对象,然后这些对象会被丢弃。如果您以后有疑问,您可以随时分析您的代码,以了解它是否真的重要

当您链接字符串函数时,每个函数都实例化一个新的
字符串
,这是真的吗

一般来说,是的。每个返回修改字符串的函数都是通过创建一个新字符串对象来实现的,该对象包含与原始字符串分开存储的完整新字符串

有一些方法可以避免这种情况,特别是当您从不同的部分创建字符串时。但一般来说,如果不在字符串之间创建多个对象,很难说如何做得更好


尽管这听起来很糟糕,但它通常不是一个大问题:虽然它可能很昂贵,但由于字符串操作而产生的无关字符串对象很少是性能差的原因。除非您正在使用字符串执行高性能操作,否则您可能会忽略这样一个事实,即您一直在创建新对象,然后这些对象会被丢弃。如果您以后有疑问,您可以随时分析您的代码,以确定它是否真的重要。

我们在绑定到UI的模型中使用了一种特殊方法来获取该对象的唯一id。该方法将使用+运算符连接一些字符串

它最终在一秒钟内被调用10000次或更多次,有时在加载新数据时会减慢整个应用程序的速度。在应用程序中首次加载某些屏幕时,这是一个严重的瓶颈。所以我想如果你不调用每秒至少使用几千次字符串操作的代码,那么你就没事了


从长远来看,string.Format方法的速度要快两倍。

我们在绑定到UI的模型中使用了一种特殊方法来获取该对象的唯一id。该方法将使用+运算符连接一些字符串

它最终在一秒钟内被调用10000次或更多次,有时在加载新数据时会减慢整个应用程序的速度。在应用程序中首次加载某些屏幕时,这是一个严重的瓶颈。所以我想如果你不调用每秒至少使用几千次字符串操作的代码,那么你就没事了

从长远来看,string.Format方法的速度要快两倍

我知道C#中的字符串是不可变的类型。当您链接字符串函数时,每个函数都实例化一个新字符串,这是真的吗

是的,字符串是不可变的,因此它们根本无法更改。但并不是每个函数都会实例化一个新字符串,因为有些函数可能会受到影响(相同文本的字符串可以(但不总是!)驻留在相同的内存空间中)

如果这是真的,那么如何对字符串进行过多操作的最佳实践是什么

最常用的两种方法是首先使用或通过

我知道C#中的字符串是不可变的类型。当您链接字符串函数时,每个函数都实例化一个新字符串,这是真的吗

是的,字符串是不可变的,因此它们根本无法更改。但并不是每个函数都会实例化一个新字符串,因为有些函数可能会受到影响(相同文本的字符串可以(但不总是!)驻留在相同的内存空间中)

如果这是真的,那么如何对字符串进行过多操作的最佳实践是什么


最常用的两种方法是首先使用或通过

1)建立字符串,通常是这样。2) 您可以使用
StringBuilder
来生成可变字符串。@Sayse:我以为每个返回字符串的字符串方法都会实例化一个新字符串!是的,你是在寻找可能的复制品吗。2) 您可以使用
StringBuilder
来生成可变字符串。@Sayse:我以为每个返回字符串的字符串方法都会实例化一个新字符串!您是否在寻找可能的重复项?我发现许多
StringBuilder
方法返回
StringBuilder
。我不知道他们是否返回了一个新的
StringBuilder
,或者它与以前一样。因此,我们可以链接
StringBuilder
方法而不用担心消耗内存吗?
StringBuilder
方法总是返回相同的对象,因此您可以执行
var b=new StringBuilder()然后
b.Append(“某些字符串”).Append(“其他字符串”).Append(12.Append(“foobar”)
并且它将全部附加到同一个对象
b
。完成后,可以调用
b.ToString()
来获取最终的字符串对象。我发现许多
StringBuilder
方法都返回
StringBuilder
。我不知道他们是否返回了一个新的
StringBuilder
,或者它与以前一样。