是这样的,我有一个字符串,我想不在申请内存的情况下,修改原字符串的值。我想到的办法是通过指针的方式直接修改值,但不知道怎么写,请大家指教,谢谢!
class Program { unsafe static void Main(string[] args) { string str = "admin"; //我想将字符串修改为admni str = "admn"; //删除i str = "admni";//在最后插入i //这样不申请内存就将i和n调换了位置,请问用指针该如何实现? } }
请问这样如何实现啊?
别用C的思维来想.NET。你可以直接写成str="admni",不会申请内存的。CLR中string是在托管堆中分配内存。既然你已经定义了一个string,说明你已经在托管堆中申请了内存。
是在堆中分配内存,但str="admni"不等于str="admin"需要两个不同的内存空间来存储这两个字符串,所以你这肯定是重新申请内存了
@Set sail: 正如3L所说,在CLR中String是不可变的,你只能分配另一个内存,并把指针赋给它。所有没有办法了。
@呆呆蚁:
我觉得肯定是可以实现的,因为我可以通过指针直接修改内存中指定位置的值啊。
我的思路是,通过指针str="admin"获取str的地址,然后修改此地址的值。这样就能达到不申请空间而改变值了。
能问这样的问题也是大牛。不过我没在.net中用过指针,同样关注!
--!
关注。。。
跟c一样的,就是交换两个char的值嘛:
public static unsafe void Swap(ref string Str1,int i,int j) { if (Str1.Length < 1) return; if(i>Str1.Length||j>Str1.Length||i==j) return; fixed (char* pCh1 = Str1) { int* pChi1 = (int*)pCh1; pCh1[i] = pChi[j]+pCh1[i]; pChi[j] = pChi[i]-pCh1[j]; pChi[i] = pChi[i]-pCh1[j]; } }
上面是意淫,因为string在.net里是不可变的,所以这段代码可能会导致clr crash。c#操作字符串比较好的方式就是尽量少创建string对象。不申请内存是不可能的,因为一开始的char[]就需要申请一个数组的空间,返回的新的string也需要重新申请。
我觉得肯定是可以实现的,因为我可以通过指针直接修改内存中指定位置的值啊。
我的思路是,通过指针str="admin"获取str的地址,然后修改此地址的值。这样就能达到不申请空间而改变值了。
@Set sail: 我就是按照你的思路写的代码,因为string的存在就是为了不可变的,你改了也许会成功但也可能会crash,我没说不可以。c#比较特别对某些类别的指针操作会不安全,这也是为什么关键字叫unsafe的原因。