一、预定义类型。 1、值类型和引用类型 C#中的数据类型,可以分为值类型和引用类型,值类型存储在堆栈上,而引用类型存储在托管堆上。如下代码示例, int i=10; int j=i; i 和j 的值都是10,并且在内存中会有两个地方存储10. 再看下面的代码 Vector x=new Vector(); x.Value=20; Vector y=x; Console.WriteLine(y.Value); y.Value=50; Console.WriteLine(x.Value); Vector 是一个引用类型,引用类型在使用的时候需要new 来实例化一个。这段代码执行后,只有一个 Vector 对象,x,y 都指向包含该对象的内存地址。因为x,y 存储的都是对象的引用,所以当y 改变的时候, x 也会改变。所以该程序输出的结果是20 和50.如果变量是一个引用,就可以把其值设置为null,表示不指向任何对象。 2、CTS 类型。 C#的预定义类型并没有内置于语言中,而是内置于.NET Framework 中,比如声明一个int 类型时,实际 上是.NET 结构System.Int32 的一个实例。这说明,可以把所有的基本数据类型看作是支持某些方法的类。 3、预定义的值类型 A、整型 sbyte ,8 位有符号的整数,范围从 -128 到127. byte ,8 位无符号的整数,范围从 0 到255. short,16 位有符号的整数,范围从 -32768 到32767 ushort ,16 位无符号的整数,范围从0 到65535 int,32 位有符号的整数,范围从-2147483648 到2147483647 uint,32 位无符号的整数,范围从0 到4294967295 long,64 位有符号的整数,范围从-2 的31 次方到2 的31 次方减1 ulong,64 位无符号的整数,范围从0 到2 的64 次方减1 B、浮点类型。 float ,32 位单精度浮点数。double,64 位双精度浮点数。如果代码对某个非整数值,如12.3 硬编码,则编译器一般假定该变量是double,如果想指定其为float ,则可以在后面加上字符f。 C、decimal 类型。 该类型是一种财务专用数据类型,是128 位高精度十进制表示法。要把数据指定为decimal 类型的,只需在数字后面加上M(或者m) A) bool 类型。 C#的bool 类型包含true 和false。 B)字符类型。 也就是char 类型,表示一个16 位的unicode 字符。char 类型的字面量是采用 单引号 括起来的。而不是双引号。双引号括起来的是字符串类型的。 4、预定义引用类型。 A、object 类型。 这是C#的基类,所有的类都派生自它。所以,可以使用object 引用绑定任何子类型的对象,object 类 型执行许多基本的一般用途的方法,如 Equals() GetHashCode(),GetType()等,我们需要针对某些方法 进行“重写”,这在后面我们将会学习到。 B、string 类型。 注意,string 类型是属于引用类型。我们来看下面一段代码,在修改一个字符串的时候,实际上是创 建了一个新的字符串,而并非修改了原来在字符串。我们来看一个示例: using System; using System.Windows; namespace xuexuexi.com { class MyFirstClass { static void Main() { string str1="xuexuexi.com"; string str2=str1; Console.WriteLine("str1="+str1); Console.WriteLine("str2="+str2); str1="www.xuexuexi.com"; Console.WriteLine("str1="+str1); Console.WriteLine("str2="+str2); } } } 在这个示例中会输出 str1="xuexuexi.com"; str2="xuexuexi.com"; str1="www.xuexuexi.com"; str2="xuexuexi.com"; 这和我们所预期的引用类型正好相反,为什么呢?因为当我们用“xuexuexi.com”来初始化str1 的时候,就在堆上分配了一个string 对象,当初始化str2 的时候,也指向了这个对象。当str1 改变的时候,并不是修改了原有的对 象,而是新创建了一个对象,但str2 还是指向原来的对象,所以,str2 的值并未改变。 |