在C#PInvoke中,如何传递字符串缓冲区以便C DLL填充它并返回?PInvoke宣言是什么?
C函数声明是
int GetData(char* data, int buflength);
Run Code Online (Sandbox Code Playgroud)
在C#中,我已将其声明为
[DllImport(DllName)]
static extern Int32 GetData([MarshalAs(UnmanagedType.LPStr)]StringBuilder receiveddata, Int32 buflen);
Run Code Online (Sandbox Code Playgroud)
这是对的吗?我像这样传递StringBuilder变量
int bufferLength = 32;
StringBuilder data = new StringBuilder(bufferLength);
int result = GetData(data, bufferLength);
Run Code Online (Sandbox Code Playgroud)
我想知道它是否正确?
谢谢
以下代码有效,但修复了String []中的元素数量.有没有办法让String []动态添加所需的元素数量?
private static StringBuilder names = new StringBuilder();
...
public String[] getNames() {
int start = 0;
int end = 0;
int i = 0;
String[] nameArray = {"","","",""};
while (-1 != end) {
end = names.indexOf(TAB, start);
nameArray[i++] = names.substring(start, end);
start = ++end; // The next name is after the TAB
}
return nameArray;
}
Run Code Online (Sandbox Code Playgroud) 我看了一下XML转义的字符串,发现它非常有用.
我想做类似的事情:转义要在XML-Attribute中使用的字符串.
该字符串可能包含\ r \n.XmlWriter类产生类似\ r \n - >
我目前使用的解决方案包括XmlWriter和StringBuilder,而且非常难看.
任何提示?
编辑1:
抱歉让LarsH失望,买我的第一个方法是
public static string XmlEscapeAttribute(string unescaped)
{
XmlDocument doc = new XmlDocument();
XmlAttribute attr= doc.CreateAttribute("attr");
attr.InnerText = unescaped;
return attr.InnerXml;
}
Run Code Online (Sandbox Code Playgroud)
这是行不通的.XmlEscapeAttribute("Foo\r\nBar")会导致"Foo\r\nBar"
我使用.NET Reflector来了解XmlTextWriter如何转义属性.它使用内部的XmlTextEncoder类...
我的方法我目前正在使用这样的方法:
public static string XmlEscapeAttribute(string unescaped)
{
if (String.IsNullOrEmpty(unescaped)) return unescaped;
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb, settings);
writer.WriteStartElement("a");
writer.WriteAttributeString("a", unescaped);
writer.WriteEndElement();
writer.Flush();
sb.Length -= "\" />".Length;
sb.Remove(0, …Run Code Online (Sandbox Code Playgroud) 我可以通过互联网和Sun Java获得更多.但是需要在一个例子的帮助下获得明显的差异?
StringBuffer 要么 StringBuilder
什么是差异,什么时候更喜欢考虑响应时间.
有一天,我正在向我的一个朋友咆哮一个特定的Telerik控件.我告诉他生成一个控制树花了几秒钟,在分析后我发现它在循环中使用字符串连接而不是StringBuilder.重写后,它几乎是瞬间完成的.
所以我的朋友听说过,并且似乎很惊讶C#编译器没有像Java编译器那样自动进行转换.阅读Eric Lippert的许多答案,我意识到这个功能没有成功,因为它不值得考虑.但是,如果假设成本实现它的成本很小,那么什么理由会阻止人们去做呢?
我需要写10,000 x 30,000个字符.单个字符串构建器能够对所有字符进行编码,还是应该考虑一组字符串构建器?我无法访问测试用例,因此我无法亲自验证它.希望我能在这里找到答案.
提前致谢.
编辑:
我尝试使用循环添加10000 x 30000个字符.我得到以下例外情况.
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2367)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:130)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:114)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:415)
at java.lang.StringBuilder.append(StringBuilder.java:132)
at Test.main(Test.java:19)
Run Code Online (Sandbox Code Playgroud)
如何处理这个"java堆空间"?
在以下三种情况下,StringBuffer转换为String的主要区别是什么:
案例1:使用toString()
StringBuffer sb = new StringBuffer("Welcome");
String st = sb.toString();
Run Code Online (Sandbox Code Playgroud)
案例2:使用+""
StringBuffer sb = new StringBuffer("Welcome");
String st = sb + "";
Run Code Online (Sandbox Code Playgroud)
案例3:使用String.valueOf()
StringBuffer sb = new StringBuffer("Welcome");
String st = String.valueOf(sb);
Run Code Online (Sandbox Code Playgroud)
哪个是性能方面的最佳实践?
我知道StringBuilder应优先于String,因为String将保存在常量字符串池中,并为其分配新值不会覆盖以前的值.但是,StringBuilder是一个覆盖其先前值的对象.
另外如果我在Hibernate的支持类中有String类型的变量,我应该使用StringBuilder吗?怎么样?
...
Result result = (Result) criteria.list().get(0);
class Result{
String name;
String fname;
...
}
Run Code Online (Sandbox Code Playgroud)您好我在评论shoutbox时有以下方法显示促销行:
public String getShoutboxUnderline(){
StringBuilder builder = new StringBuilder();
builder.append("watch");
builder.append("on");
builder.append("youtube");
builder.append(":");
builder.append("Mickey");
builder.append("en");
builder.append("de");
builder.append("stomende");
builder.append("drol");
return builder.toString();
}
Run Code Online (Sandbox Code Playgroud)
但是当我得到它时,我得到了watchonyoutube:mickeyendestomendedrol,它没有空格.如何在Stringbuilder中获取空格?
我有这样的代码:
String str1 = new StringBuilder("???").append("??").toString();
System.out.println(str1.intern() == str1); //true
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == str2); //false
String str3 = new StringBuilder("Str").append("ing").toString();
System.out.println(str3.intern() == str3); //true
Run Code Online (Sandbox Code Playgroud)
我有结果:
String str1 = new StringBuilder("???").append("??").toString();
System.out.println(str1.intern() == str1); //true
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == str2); //false
String str3 = new StringBuilder("Str").append("ing").toString();
System.out.println(str3.intern() == str3); //true
Run Code Online (Sandbox Code Playgroud)
我能理解为什么line1和line3是真的,但我是关于line2的问题,为什么这是假的?
我的java是:java版"1.8.0_73"