CultureInfo nonInvariantCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = nonInvariantCulture;
nonInvariantCulture.NumberFormat.NumberDecimalSeparator = ",";
我的问题是现在的Thread.CurrentThread.CurrentCulture的NumberDecimalSeparator是默认的“.”, 还是“,", 为什么?
c# 赋值疑问
答案:2 悬赏:30 手机版
解决时间 2021-02-04 13:39
- 提问者网友:流星是天使的眼泪
- 2021-02-03 13:15
最佳答案
- 五星知识达人网友:封刀令
- 2021-02-03 13:45
答案肯定是你新设置的分割符号" , "。
假如你写了这样一个程序,
using System;
using System.Threading;
using System.Globalization;
class Program
{
static void Main()
{
CultureInfo nonInvariantCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = nonInvariantCulture;
nonInvariantCulture.NumberFormat.NumberDecimalSeparator = ",";
Console.WriteLine("Main thread, Current Culture {0}, Number Separator {1}",
Thread.CurrentThread.CurrentCulture.Name,
Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator);
// Prints Main thread, Current Culture en-US, Number Separator ,
Thread t = new Thread(new ThreadStart(DoWork));
t.Start();
t.Join();
}
static void DoWork()
{
Console.WriteLine("Work Thread, Current Culture {0}, Number Separator {1}",
Thread.CurrentThread.CurrentCulture.Name,
Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator);
// Prints Main thread, Current Culture en-US, Number Separator .
}
}最后输出的当然是",",因为当前的语言文化就是你新设置的“en-US"对象,而NumberDecimalSeparator得值被你强制的设置为","。
但是你其它线程还是使用系统默认的语言文化对象,所以只能说你当前线程的语言环境是你新建的"en-US"语言文化对象。
如果你的系统region也是"en-US",但他们使用的是不同的语言文化对象,所以结果也是不同的。具体可以看我给你的例子。
假如你写了这样一个程序,
using System;
using System.Threading;
using System.Globalization;
class Program
{
static void Main()
{
CultureInfo nonInvariantCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = nonInvariantCulture;
nonInvariantCulture.NumberFormat.NumberDecimalSeparator = ",";
Console.WriteLine("Main thread, Current Culture {0}, Number Separator {1}",
Thread.CurrentThread.CurrentCulture.Name,
Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator);
// Prints Main thread, Current Culture en-US, Number Separator ,
Thread t = new Thread(new ThreadStart(DoWork));
t.Start();
t.Join();
}
static void DoWork()
{
Console.WriteLine("Work Thread, Current Culture {0}, Number Separator {1}",
Thread.CurrentThread.CurrentCulture.Name,
Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator);
// Prints Main thread, Current Culture en-US, Number Separator .
}
}最后输出的当然是",",因为当前的语言文化就是你新设置的“en-US"对象,而NumberDecimalSeparator得值被你强制的设置为","。
但是你其它线程还是使用系统默认的语言文化对象,所以只能说你当前线程的语言环境是你新建的"en-US"语言文化对象。
如果你的系统region也是"en-US",但他们使用的是不同的语言文化对象,所以结果也是不同的。具体可以看我给你的例子。
全部回答
- 1楼网友:青灯有味
- 2021-02-03 15:19
1. string 是引用类型
引用类型操作
当使用重载操作符”=”给string对象赋值时,string的对象是引用类型,它保留在堆上,而不是堆栈上.因此,当把一个字符串赋给另一个字符串时,会得到对内存中同一个字符串的两个引用.例如,修改其中一个字符串,就会创建一个全新的string对象(注意,这个过程发生在”=”中),而另一个字符串没有改变.考虑下面的代码:
public class myclass
{
public static void main()
{
string str1 = "i am a number";
string str2 = str1;
console.writeline("str1 = "+str1);
console.writeline("str2 = "+str2);
str1 = "i am another number";
console.writeline("after str1 changed... str1 = "+str1);
console.writeline("after str1 changed... str2 = "+str2);
console.readline();
}
}
output :
str1 = i am a number
str2 = i am a number
after str1 changed...str1 = i am another number
after str1 changed...str2 = i am a number
具有值类型特征的操作
string有两种情况下的操作是具有值类型特征的:
1) 在函数中传递string(比如函数参数是string型)时,传递的是地址,但却不能修改成员变量,原因是它重新又创建了一个全新的对象,和它想修改的那个成员变量非同一地址,所以看上去像是值类型;
2) str1 == str2 ,仅仅是比较了值,而非地址(是ms重写了==运算符所致).
总结:
string 到底是引用类型还是值类型 答:引用类型 . 只不过它在某此操作上会表现出值类型的特征.
string类型的另外一个特殊性在于它是“不会变”的,每次操作string,都相当于新建了一个string对象.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯