作者petrushka (不放过自己)
看板C_Sharp
标题Re: [问题] C# access C++ COM的疑问
时间Sat May 29 00:08:29 2010
1.
在.NET,string是reference type,是immutable的,经常有程式设计师误解string是
value type。它只是使用起来像是value type一样而已。
既然string是immutable的,也就是说我们不能真正的去改变它的内容值。例如:
string s = "foo bar";
s.Replace( "foo", "bar" ); // s 内容仍未改变
上述程式并不是真的改变了s的内容值,而是产生了一个新的string。
也就是说.NET从旧的string中,将foo的位置以bar替代再copy了foo以外的字元,产生
了一个全新的字串。
所以,真正的程式应该是这样:
string s = "foo bar";
s = s.Replace( "foo", "bar" ); // 让s指向新的string
因此,在这里就跟C/C++的想法不一样了。
2.
C/C++程式设计师常使用'\0'或null character当做字串结尾。
但在.NET,string是可以包含null characters的。
(注意:要不要把null character当做字串结尾,要看解读的程式怎麽想。)
因此,在这里也跟C/C++的想法不一样了。
如果你是要从字元阵列取得字串并回传,我想大概的作法如下:
char[] p = { 'H', 'e', 'l', 'l', 'o' };
string str = new string( p );
return str; // Console.WriteLine( str );
因为在.NET,string可以包含null character,所以如果你要透过char array来操作,
就自行处理array range来取得你要的字串。例如:
char[] p = { 'H', 'e', 'l', 'l', 'o' };
string str = new string( p, 0, 2 ); // string( char*, startIndex, length )
return str; // Console.WriteLine( str );
上述程式就只会印出前2个字元字串。
--
对於已经无法拥有的
唯一能做的是
不要忘记
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 125.230.127.133
1F:→ loveme00835:其实C++也是可以做到COW 05/29 03:49
2F:→ petrushka:顺便借题说明原PO最後提到的问题而已 05/29 10:37