今天犯了一个低级错误,晕啊!
如下面的代码所示, #1不会对Thread的culture有impact,除非用了#2的语句。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
var curUICulInfo = Thread.CurrentThread.CurrentUICulture;
if (curUICulInfo.LCID != request.LocaleID)
{
curUICulInfo = new CultureInfo(request.LocaleID); //------#1------
Thread.CurrentThread.CurrentUICulture = new CultureInfo(request.LocaleID); //------#2------
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------
在#1处,curUICulInfo会引用到一个新的object,而保持原来的Thread.CurrentThread.CurrentUICulture不变;她们俩是不同的object。
话说起来,如果在c++中,我可能能马上想到#1这里(不吹牛:-) ),这个变量会重新指向一块内存,但是在C#代码中完全没有了这个意识...
以这个为例,栈上的variable会指向managed heap中的object;重新给栈variable赋值,他的指向会变掉。也就是说,基本的build-in类型、struct和class,这些类型的variable,使用她们,或者对她们进行修改,都是对同一份object在操作;但是,class类型的variable,重新赋值,会重新引用到一份new的object上,这样就有了2份;因为他们是.net中的引用,相当于c++中的指针(不是c++的引用,因为指向可以变)。
这就可以联系到一个经典的C/C++面试题。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
void AllocateMem(Obj* a_ptr)
{
a_ptr = new Obj();
}
Obj* l_pObj = NULL;
AllocateMem(l_pObj); //问现在l_pObj还NULL吗?
------------------------------------------------------------------------------------------------------------------------------------------------------------------
虽然.net runtime帮助我们管理了资源,不用担心释放的问题,但是分配的问题还是需要自己处理的;关于分配的一些观念,有很多需要继承C++里的。
Keep it in MIND.