2012-04-19 51 views
1

我已经写了一个函数反向,以在不安全的上下文中使用指针在.net中反转字符串。 我的确如此。是.net中的字符串被更改?有没有一些错误?

我分配“问候”和“x”相同的值。 我反过来迎接我的惊喜x也被颠倒过来。

using System; 

class Test{ 

    private unsafe static void Reverse(string text){ 
     fixed(char* pStr = text){ 
      char* pBegin = pStr; 
      char* pEnd = pStr + text.Length - 1; 
      while(pBegin < pEnd){ 
       char t = *pBegin; 
       *pBegin++ = *pEnd; 
       *pEnd-- = t; 
      } 
     } 
    } 

    public static void Main(){ 
     string greet = "Hello World"; 
     string x = "Hello World"; 
     Reverse(greet); 
     Console.WriteLine(greet); 
     Console.WriteLine(x); 
    } 
} 
+1

我希望你有很好的理由使用指针在C#... – jrummell 2012-04-19 15:00:09

+0

@ jrummell试图获得最大的性能...... – Pritesh 2012-04-19 15:02:28

+0

除非你已经对你的应用程序进行了基准测试,并确认这段代码是“慢”,不要打扰这种优化。 – jrummell 2012-04-19 15:05:44

回答

12

没有什么奇怪的。你看到实习。如果你写:

Console.WriteLine(object.ReferenceEquals(greet, x)); 

立即宣布后,你会看到,你只得到了一个字符串对象。两个变量都引用同一个对象,所以显然,如果通过一个变量对对象进行修改,稍后通过其他变量访问对象时会看到相同的变化。

从C#4的规格,部分2.4.4.5:

每个字符串字面量并不一定导致一个新的字符串实例。当两个或更多根据字符串相等运算符等价的字符串文本出现在同一个程序中时,这些字符串文字将引用同一个字符串实例。

哦,我希望在真正的代码,你不是使用不安全的操作实际上修改字符串...

+0

但我创建了2个实例..奇怪。 – Pritesh 2012-04-19 14:58:15

+3

@Pritesh:不,你没有。你声明了两个变量,并且为这两个变量使用了相同的字符串,这意味着你有两个变量都指向同一个字符串对象。 – 2012-04-19 14:59:11

+0

这是在.Net中正确的behaviou故障 – Pritesh 2012-04-19 15:01:18

相关问题