String
String 是不可变的(immutable), 一旦建立,不能改变。
字符串池
CLR初始化时会创建一个内部的HASH TABLE,key是字符串,value是对托管堆上的字符串对象的引用。但是当显式的New一个字符串对象时,字符串池不起作用。
System.Runtime.CompilerServices.CompilationRelaxationAttribute特性来开关字符串池
ComplitationRelaxations.NoStringInterning
SecureString
命名空间System.Security
SecureString的由来
SecureString是用来保存机密的字符串。传统字符串以明码的形式分配在内存上,一个简单的内存读写工具就可以轻易捕获这些字符串。 对这些字符串加密时他们已经在内存很久了,解决这个问题的方法为在字符串的获得过程中直接进行加密。即SecureString.
SecureString的分配不同于传统字符串,它被分配在非托管内存上,一开始就以加密的形式存在。对它的所有操作都是逐字符进行的。在这些操作时,字符会被解密,然后再操作,最后加密。有一小段时间,字符是以明码的形式存在的。
SecureString实现了Dispose/Finalize模式。释放石对象内存全部置0
代码示例
using(SecureString ss=new SecureString())
{
ss.AppendChar('a');
ss.AppendChar('b');
ss.AppendChar('c');
ss.InsertAt(1,'c');
PrintSecureString(ss);
}
private unsafe static void PrintSecureString(SecureString str)
{
char* buffer=null;
try
{
buffer=(char*)Marshal.SecureStringToBSTR(str);
for(int i=0;*(buffer+i)!='\0';i++)
Console.Write(*(buffer+i));
Console.Write("\r\n");
}
finally
{
if(buffer!=null)
Marshal.ZeroFreeBSTR((System.IntPtr)buffer);
}
}