在一个C#文件中,我有一个
class Archiver {
[DllImport("Archiver.dll")]
public static extern void archive(string data, StringBuilder response);
}
Run Code Online (Sandbox Code Playgroud)
字符串数据是一个输入,StringBuilder响应是函数写入的东西
归档函数原型(用C编写)如下所示:
void archive(char * dataChr, char * outChr);
Run Code Online (Sandbox Code Playgroud)
它在dataChr中接收一个字符串,然后执行一个
strcpy(outChr,"some big text");
Run Code Online (Sandbox Code Playgroud)
从C#我称之为:
string message = "some text here";
StringBuilder response = new StringBuilder(10000);
Archiver.archive(message,response);
Run Code Online (Sandbox Code Playgroud)
这是有效的,但问题是,你可能会看到我给StringBuilder大小赋值,但是归档函数可能会返回一个比我给我的StringBuilder大小更大的文本.有任何解决这个问题的方法吗?
问:
哪一个是性能明智的:清除字符串构建器
AStringBuilder.Remove(0,AStringBuilder.Length);
Run Code Online (Sandbox Code Playgroud)
string theString = AStringBuilder.ToString();
ABuilder.Replace(theString,String.Empty);
Run Code Online (Sandbox Code Playgroud)
AStringBuilder.Length = 0;
Run Code Online (Sandbox Code Playgroud)
注意:我使用不包含Clear()方法的Framework 3.5 .
我有一个场景,我想在方法中StringBuilder用作局部变量.我理解如果StringBuilder是一个本地方法变量,它不应该有任何关于线程安全的问题.
但是,如果我追加StringBuilder一个实例变量,如:
class MyClass {
private List<String> property;
public void myMethod() {
StringBuilder sb = new StringBuilder();
for(String s : property) {
sb.append(s);
}
}
// some other methods that mutate property
}
Run Code Online (Sandbox Code Playgroud)
我认为要使这个线程安全,只需更改StringBuilder为StringBuffer是不够的.我可以同步属性本身吗?
我理解这StringBuilder是在循环中连接字符串的选择,如下所示:
List<string> myListOfString = GetStringsFromDatabase();
var theStringBuilder = new StringBuilder();
foreach(string myString in myListOfString)
{
theStringBuilder.Append(myString);
}
var result = theStringBuilder.ToString();
Run Code Online (Sandbox Code Playgroud)
但是哪些场景StringBuilder表现优异String.Join(),反之亦然?
var theStringBuilder = new StringBuilder();
theStringBuilder.Append("Is this ");
theStringBuilder.Append("ever a good ");
theStringBuilder.Append("idea?");
var result = theStringBuilder.ToString();
Run Code Online (Sandbox Code Playgroud)
要么
string result = String.Join(" ", new String[]
{
"Or", "is", "this", "a", "better", "solution", "?"
});
Run Code Online (Sandbox Code Playgroud)
任何指导将不胜感激.
编辑:是否有一个阈值,其中的创建开销StringBuilder是不值得的?
我正在使用StringBuilder,而不是String在我的代码中努力使代码在所有解析和连接期间节省时间.
但是当我查看它的来源时,substring()方法
AbstractStringBuilder又因此StringBuilder返回a String而不是a StringBuilder.
这背后会有什么想法?
谢谢.
使用此代码(sbJava是一个StringBuilder):
String androidFindLine = string.Format("Button _{0} = (Button) findViewById(R.id.{0});\"", btnId);
sbJava.Append(androidFindLine);
sbJava.Append(Environment.NewLine);
sbJava.Append(string.Format("_{0}.setOnClickListener(new View.OnClickListener() { ", btnId));
Run Code Online (Sandbox Code Playgroud)
我明白了
System.FormatException未处理_HResult = -2146233033 _message =输入字符串格式不正确...
btnId的值是"btnbutton_up"
问题是什么?
Java开发人员为什么不创建一个类AbstractStringBuilder并将其重命名为StringBuilder?
例如,以下方法AbstractStringBuilder:
public AbstractStringBuilder append(double d) {
FloatingDecimal.appendTo(d,this);
return this;
}
Run Code Online (Sandbox Code Playgroud)
和中的方法StringBuilder:
@Override
public StringBuilder append(double d) {
super.append(d);
return this;
}
Run Code Online (Sandbox Code Playgroud)
我想我们只能保留一种方法AbstractStringBuilder,它将很好地工作。创建无用包装的目的是StringBuilder什么?
我正在使用Scala将文件写入磁盘.
要创建将写入文件的整个String,我正在迭代我的数据并将所有信息附加到StringBuilder对象.
例如:
val moreData = getMoreData
strBuilder.append(moreData)
strBuilder.append("even more data")
//...
strBuilder.toString
Run Code Online (Sandbox Code Playgroud)
在操作结束时,我然后调用StringBuilder的toString方法,并写入Path.
我知道Scala对字符串有编译优化,所以我的问题是:
哪种方法具有更好的性能.String-Interpolation-Concatenation或StringBuilder?
这些编译优化是否与StringBuilder有某种关联?换句话说,StringBuilder追加操作是否有优化?
我写了一些代码,里面有很多字符串创建.为了避免一遍又一遍地避免昂贵的字符串创建,我正在使用java StringBuilder类.
我的代码有点像这样:
public String createString(){
StringBuilder stringBuilder = new StringBuilder();
for(int i = 0; i < Integer.MAX_VALUE ; i++){ //its not actually this, but it's a large loop.
stringBuilder.append(appendString())
}
return stringBuilder.toString();
}
Run Code Online (Sandbox Code Playgroud)
该appendString方法还实例化a StringBuilder并附加到它.
为了节省时间,我注意到我可以让我的appendString方法返回a StringBuilder,而不是String避免使用如下.toString()方法返回stringBuilder :
public StringBuilder appendString(){
StringBuilder appendBuilder = new StringBuilder();
appendBuilder.append("whatever");
return appendBuilder;
}
Run Code Online (Sandbox Code Playgroud)
这一切都很好,直到我查看StringBuilder文档并意识到类append(StringBuilder stringBuilder)上没有方法StringBuilder,只有一个append(String string).
所以我的问题是,这段代码是如何运行的?难道铸造StringBuilder来String呢?
我有一个StringBuilder,我想写一个包含重音到csv文件的文本.
码:
StringBuilder strbr = new StringBuilder();
strbr.AppendLine("ù;é;à");
File.WriteAllText(filePath + ".csv", strbr.ToString());
Run Code Online (Sandbox Code Playgroud)
但是当我打开我的csv文件时,只有: é
文件"test.csv"正确包含ù;é;à,但当我用Excel打开它时,我有:
也许我错过了Excel的标题?