语言的类属
托管语言,即内存由 Runtime 管理,产生的垃圾由 GC 进行回收。
值类型
- bool,布尔类型,只存储 True 和 False
- byte,字节类型,在计算机占用 8 位。
- char,字符类型,由于 C# 里的 char 是使用 Unicode 字集,所以占用 16 位。
- short,2 字节有符号整数。
- int,4 字节有符号整数。
- long,8 字节有符号整数。
- sbyte,有符号字节类型。
- ushort,2 字节无符号整数。
- uint,4 字节无符号整数。
- ulong,8 字节无符号整数。
- float, 4 字节单精度浮点类型。
- double,8 字节双精度浮点类型。
- decimal,16 字节高精度浮点类型。
(1 个字节 = 8 位)
引用类型
赋值一个数值很简单,但是用过的人都知道:变量被赋值一个 new 过的对象,访问的结果是“引用”并不是“拷贝”。
一个简单的程序就可以说明:
int[] a = new int[3] { 1, 2, 3 };
int[] b = a;
Console.WriteLine(b[1]); //输出:2
a[1] = 5;
Console.WriteLine(b[1]); //输出:5
上面的程序其实是实例化了一个 int 数组 对象。
为什么会这样?这样想一想:对象是一个实际存在的东西,他自己有自己的属性。如果引用类型是用“赋值”的方式进行操作的,那么用起来就会非常麻烦。
static void Main(string[] args)
{
AClass a = new AClass(5);
doPlus(a, 5);
Console.WriteLine(a.a); //输出:10
Console.ReadLine();
}
static void doPlus(AClass a,int order) {
a.a += order;
}
像这样,直接把一个对象丢给函数,这个函数里面完成对这个对象的操作,那就无需那些多余的步骤。
通俗点讲,引用类型的变量本质只是一个指路牌,访问时就会带领你到这个对象所在的位置。
属于这个类型的有:object、string、dynamic。
string 虽然是继承 object 的,但是他有点特殊:在给另一个变量赋值时会自动新建一个对象,在这个变量做出的任何改变都不会影响到最初的对象,实现的最终效果和 值类型 差不多。
所有类的爹
object 类型,就是所有类,包括上面的数据类型、字符串等等,最终都是继承 object ,object 是所有类的爹。
也就所有的类型都可以装箱为 object 传递给函数,具体操作是显性(强制)转换。
//装箱
AClass a = new AClass();
object boxed = (object)a;
//拆箱
AClass b = (AClass)boxed;
但可以装拆箱不代表对象可以强制转换成其他毫不相干的类,就好比你是人类,不可能凭空变成犬类吧。
指针去哪了?
其实 C# 本身是支持指针的,不过使用指针会出现一些安全性问题,所以若不使用 unsafe 声明就会报错。
用 Cookie 保存: 别名、Email