在C#中,以下数据类型为值类型:
bool、byte、char、enum、sbyte以及数字类型(包括可空类型)
以下数据类型为引用类型:
class、interface、delegate、object、stirng
值类型数据大小(值类型都继承自ValueType类):
bool -> System.Boolean (布尔型,其值为 true 或者 false)
byte -> System.Byte (字节型,占 1 字节,表示 8 位正整数,范围 0 ~ 255)
sbyte-> System.SByte (带符号字节型,占 1 字节,表示 8 位整数,范围 -128 ~ 127)
char -> System.Char (字符型,占有两个字节,表示 1 个 Unicode 字符)
short -> System.Int16 (短整型,占 2 字节,表示 16 位整数,范围 -32,768 ~ 32,767)
ushort -> System.UInt16(无符号短整型,占 2 字节,表示 16 位正整数,范围 0 ~ 65,535)
uint -> System.UInt32 (无符号整型,占 4 字节,表示 32 位正整数,范围 0 ~ 4,294,967,295)
int -> System.Int32 (整型,占 4 字节,表示 32 位整数,范围 -2,147,483,648 到 2,147,483,647)
float -> System.Single (单精度浮点型,占 4 个字节)
ulong -> System.UInt64 (无符号长整型,占 8 字节,表示 64 位正整数,范围 0 ~ 大约 10 的 20 次方)
long -> System.Int64 (占8字节,表示 64 位整数,范围大约 -(10 的 19) 次方 到 10 的 19 次方)
double -> System.Double(双精度浮点型,占8 个字节)
enum和struct也是值类型。
数据类型结尾词
1.Decimal类型的变量在结尾要加M
decimal abc = 1.3m;
2.无符号类型用u,长整形用l
String类型
1.String是字符串类,string是基本类型,C#中最终二者都会映射成字符串类,String和string等同。
2.如果在字符串前面加上@则字符串就不会被转义
3.@“\abc” 这样就不会发出警报音,而是原生态的"/abc"
4.string的恒定性:
在.Net中,string类型的对象一旦创建即不可修改!包括ToUpper、SubString、Trim等操作都会在内存中产生新的字符串。。
字符串驻留机制,同一个字符串对象可以在不同的应用程序域中被访问,所以驻留的字符串是进程级的,垃圾回收不能释放这些字符串对象,只有进程结束这些对象才被释放。下面的情况,有变量参与运算,使用的是Concat函数,b 和 c引用的不再是同一个对象。
string a = "a"; //值类型的字符串都放在进程的字符串驻留池中。
string c = "a"+"b";
string d = "ab";
string e = a + "b"; //变量和字符串之间运算调用string.Concat方法,产生在托管堆上。
Console.WriteLine(ReferenceEquals(c, d)); //true
Console.WriteLine(ReferenceEquals(c, e)); //false
Console.WriteLine(c == e); //object.Equals(c, e) true == 比较两个字符串的值,不比较引用。若比较两个对象(包括字符串对象)则会比较引用。
5.“string = ”与“new stirng()”的区别
string test = "a";
string test = new string('a', 1);
以上两行代码的效果是一样的,它们的区别在于加载”a”的时间不同:第一行的“a”是一个常量,在编译期就已经被放在一个叫做常量池的地方了,常量池通常装载一些在编译期被确定下来的数据,例如类、接口等等;而第二行是运行时CLR在堆中生成的值为“a”的字符串对象,所以后者没有字符串驻留。
6.StringBuilder是System.Text命名空间
可空数据类型
在平时编程时(特别是与数据库交互时),我们经常会遇到需要表达一个变量为空的的情况。C#引入了Nullable<T>类型来解决值类型的NULL问题。
声明可空类型Nullable<T>本身是一个泛型类型,表示是类型T的可空版本。Nullable有两个属性,HasValue与Value。前者为bool值,表示是否有值,后者为T类型,保存值本身。
Nullable<int> a=10,b=null;
Console.WriteLine("{0},{1}",a,b); //输出 "10," 可以看出b为空
Console.WriteLine("{0},{1}",a.HasValue,a.Value); //输出"10,True"
注意,Nullable<T>是值类型。可空类型有足够多的优化让我们可以像使用一个值类型来使用它们,除了它们可以为null。
T和Nullable<T>有相互的隐式转换。但是要注意,当Nullable<T>转换为T,如果值为空,那么会抛出异常。
用?代替Nullable
声明可空类型时,总是要写一遍Nullable,无疑非常笨重。语法糖形式简化如下
int? a=10,b=null;
Console.WriteLine("{0},{1}",a,b);
int?这种写法和Nullable<int>完全等价。
??操作符代替判null
其基本作用是判断左边的值是否为空,如果空,则返回右边的值,否则返回左边的值。
int? test;
...
int result;
result = test ?? 100 ;
值得注意的是,即便是引用类型也可以使用??运算符。
此外,??可以连续使用。譬如多个可空变量形成如first??second??third的表达式。此时这个表达式会从左到右求值直到遇到第一个有值的变量并返回
《完》。