VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > temp > C#教程 >
  • c#基础(四)预定义值类型和引用类型

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  一、预定义类型。

  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 gosoa.com
{
  class MyFirstClass
  {    
    static void Main()
    {
      string str1="GoSoA.com.cn";
      string str2=str1;
      Console.WriteLine("str1="+str1);
      Console.WriteLine("str2="+str2);
      str1="www.GoSoA.com.cn";
      Console.WriteLine("str1="+str1);
      Console.WriteLine("str2="+str2);
    }
  }
}

  在这个示例中会输出

  str1="GoSoA.com.cn";

  str2="GoSoA.com.cn";

  str1="www.GoSoA.com.cn";

  str2="GoSoA.com.cn";

  这和我们所预期的引用类型正好相反,为什么呢?

  因为当我们用“GoSoA.com.cn”来初始化str1的时候,就在堆上分配了一个

  string对象,当初始化str2的时候,也指向了这个对象。当str1改变的时候,并不是修改了原有的对象,而是新创建了一个对象,但str2还是指向原来的对象,所以,str2的值并未改变。



相关教程