C# 在C中使用子字符串方法时引发内存不足异常#

C# 在C中使用子字符串方法时引发内存不足异常#,c#,exception,C#,Exception,我有一个长度约为9700000的字符串(MyString)。一个for循环从这个字符串中获取子字符串 像 但同样的事情正在发生 EditMyString和MyStringBuilder是全局变量我不确定这个循环是否会终止 不应该这样写吗 for(int i=0;i<800; i+= 1000 ) { String SStr=MyString.Substring(i,1000); } 我不确定这个循环是否会终止 不应该这样写吗 for(int i=0;i<800; i+= 1

我有一个长度约为9700000的字符串(MyString)。一个for循环从这个字符串中获取子字符串

但同样的事情正在发生


EditMyString和MyStringBuilder是全局变量

我不确定这个循环是否会终止

不应该这样写吗

for(int i=0;i<800; i+= 1000 )
{
    String SStr=MyString.Substring(i,1000);
}

我不确定这个循环是否会终止

不应该这样写吗

for(int i=0;i<800; i+= 1000 )
{
    String SStr=MyString.Substring(i,1000);
}

看起来MyString可能是一个属性,它本身在每次调用时创建一个新字符串

您的800个子字符串调用将使用大约2MB的内存,这不太可能是问题所在,但是如果您对MyString的800个调用都分配了9.7MB字符串的新副本,那么这将是一个问题

编辑:

回答这个问题是一个移动的目标,因为您一直在更改它,但是您的新StringBuilder示例在循环中每次都调用ToString,这将生成原始字符串的另一个副本-这将需要大约9700000*9700000/1000个字符的空间,尽管垃圾收集器可能会来救你,但这是一项非常艰巨的分配工作


如果您避免使用类的名称(例如“StringBuilder”)作为变量的名称,您和其他人的生活都会得到改善。使用不同的命名约定(例如,变量以小写字母开头)

看起来MyString可能是一个属性,它本身会在每次调用时创建一个新字符串

您的800个子字符串调用将使用大约2MB的内存,这不太可能是问题所在,但是如果您对MyString的800个调用都分配了9.7MB字符串的新副本,那么这将是一个问题

编辑:

回答这个问题是一个移动的目标,因为您一直在更改它,但是您的新StringBuilder示例在循环中每次都调用ToString,这将生成原始字符串的另一个副本-这将需要大约9700000*9700000/1000个字符的空间,尽管垃圾收集器可能会来救你,但这是一项非常艰巨的分配工作


如果您避免使用类的名称(例如“StringBuilder”)作为变量的名称,您和其他人的生活都会得到改善。使用不同的命名约定(例如,变量以小写字母开头)

尝试改用StringBuilder,我希望您能发布您正在使用的实际代码,而不是继续编辑for循环以获得各种不同风格的break。什么是“MyString”?如果是局部变量或字段,请将其名称更改为不以大写字母开头。如果它是一个属性getter,那么您需要发布它的代码,因为(在问题的最新版本中),您现在调用它大约20000次,因此,它的作用可能很重要。您需要发布更多的代码,以便人们能够重现相同的错误。@All:很抱歉我的问题不断发生变化,请尝试使用StringBuilder代替标题。我希望您能够发布您正在使用的实际代码,而不是继续编辑for循环,以获得各种不同的错误样式。“MyString”是什么?如果是局部变量或字段,请将其名称更改为不以大写字母开头。如果它是一个属性获取程序,那么你需要发布它的代码,因为(在问题的最新版本中),你现在调用它大约20000次,所以它的作用可能很重要。你需要发布更多的代码,以便人们可以重现相同的错误。@All:很抱歉我的问题中的持续更改是的,刚刚编辑了我的答案,提出了运行循环的不同方式。是的,刚刚编辑了我的答案,提出了运行循环的不同方式。
for(int i=0;i<800; i+= 1000 )
{
    String SStr=MyString.Substring(i,1000);
}
for(int i=0;i<800; i++)
{
    String SStr=MyString.Substring( i * 1000 ,1000);
}