C#变量类型(1):引用类型和值类型

原创 2003年11月29日 23:05:00
 

C#是一种类型安全的语言。每一个变量都要求定义为一个特定的类型,并且要求存储在变量中的值只能是这种类型的值。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

变量既能保存值类型,也可以保存引用类型,还可以是指针。这一课将讲述前两种类型,关于指针的讨论我们将在下一课中进行。

下面是关于值类型和引用类型不同点的概论:

如果一个变量v存储的是值类型,则它直接存储包含数据的对象。任何其他的变量v’都不能直接存储已经由v存储了的对象,虽然v’可以存储一个和v存储的对象有着相同值的对象。(译注:这意味着,v和v’存储的对象毫不相干,任意改变其中一个存储的对象都不会影响到另一个变量存储的对象。)

如果变量v存储的是一个引用类型,它直接存储一个指向对象的引用,同时可能存在另一个变量v’,它也存储着指向这个对象的引用。(译注:这意味着,改变v’引用的对象同时也会影响到v引用的对象,反之亦然。)

值类型

C#中你可以通过声明枚举类型或是结构类型来定义你自己的值类型。C#以同样的方式处理用户自定义的类型和C#预定义的值类型,不过C#编译器可能更优于处理后者。下面的表列出了C#中预定义的值类型的一些信息。因为在C#中所有的基本值类型都是从object类型(最终基类)发展而来,所以下表中还显示了与这些预定义类型相对应的.Net框架中的System类型。

C# 类型

.Net 框架类型

有无符号

占据位数

取值范围

sbyte

System.Sbyte

1

-128 到 127

short

System.Int16

2

-32768 到32767

int

System.Int32

4

-2147483648 到 2147483647

long

System.Int64

8

-9223372036854775808 到 9223372036854775807

byte

System.Byte

1

0 到 255

ushort

System.Uint16

2

0 到 65535

uint

System.UInt32

4

0 到 4294967295

ulong

System.Uint64

8

0 到18446744073709551615

float

System.Single

4

可能值从 ±1.5 x 10-45 到 ±3.4 x 1038 ,小数点后7位有效数字

double

System.Double

8

可能值从 ±5.0 x 10-324 to ±1.7 x 10308 小数点后15到16位有效数字

decimal

System.Decimal

12

可能值从 ±1.0 x 10-28  到±7.9 x 1028 小数点后28到29位有效数字

char

System.Char

N/A

2

任何16位Unicode字符

bool

System.Boolean

N/A

1 / 2

true 或者false

在下面的代码中,两个变量都声明为整形,并得到赋值:

int x = 10;
int y = x;
y = 20; // 这条语句运行后x的值为10,y的值为20;

    引用类型

C#预定义的引用类型包括object和string类型。正如我们在上面提到的,object类型是所有其他类型的最终基类。用户定义的引用类型可以是接口类型、类类型和委托类型(第12课会有具体介绍)。

引用类型事实上保存一个指向它引用的对象的内存地址。下面的代码段中有两个变量引用了同一个对象(本例中,假设这个对象有一个数据成员’myValue’):

object x = new object();
x.myValue = 10;
object y = x;
y.myValue = 20; // 这条语句执行后,x.myValue和y.myValue的值都为20。

上面的这段代码演示了引用类型的一个特点:改变某一个引用指向的对象的属性同时也会影响到所有其他指向这个对象的引用。不过,strings类型虽然也是引用类型,但它的工作方式更象值类型。当一个字符串被指定了另一个字符串的值时,例如:

string s1 = "hello";
string s2 = s1;

    s2和s1都引用了同一个字符串类型,但是当s1的值发生改变时,例如s1=”goodbye”;s2的值仍然是”hello”。之所以会这样,是因为当改变s1的值是,新创建了一个string对象,s1引用这个新的string对象;s2仍然引用原来string对象。产生这种行为的原因是string对象是恒定的,也就是说,一旦一个string对象被创建,它的值就不能再修改,所以当改变一个字符串变量的值的时候,仅仅是新创建了一个包含修改内容的新的string对象。

    转义序列和逐字字符串verbatim strings)

    当声明一个字符串变量时有一些字符是不能以平常的方式包含在变量中的。为了解决这个问题,C#提供了两种不同的方法。

    第一种方法是使用’转义序列’。例如,我们想得到如下的字符串

    “Hello World

    How are you”

    我们可以使用下面的语句声明字符串:string a = "/"Hello World/nHow are you/""。这条语句中使用了”和换行符的转义序列。更多字符的转义序列可以参见下表:

   

Character

Escape Sequence

'

/'

"

/"

/

//

警报

/a

退格符

/b

换页符

/f

换行符

/n

回车符

/r

Tab 符

/t

垂直 Tab 符

/v

使用数字指定的Unicode 字符,如/u2000

/u

使用十六进制数指定的Unicode 字符,如/xc8

/x

空值

/0 (zero

    第二种方法是使用’逐字字符串’文本。这种方法将想要得到的字符串放在@”和”之间。假如我们需要将C:/My Documents/赋值给’path’,我们可以使用转义序列方法:string path = "C://My Documents//";也可以使用如下的语句:string path = @"C:/MyDocuments/"。

    通过使用后一种方法得到的字符串还可以横跨多行而不需要使用’/n’。使用这种方法唯一需要使用到转义序列的字符串是”,其转义字符为””(两个连在一起的双引号)。例如想将the word "big" contains three letters.赋值给’text’,我们就可以使用如下的语句:string text = @"the word ""big"" contains three letters."。

   装箱

    C#允许你将任何的值类型转换为对应的引用类型,也可以将得到的引用类型再转换为值类型。下面的代码演示了这种转换――装箱:

int i = 123;
object box = i;
if (box is int)
{Console.Write("Box contains an int");} // 这一行将会打印出来。

    当第2行的代码执行后,对象’box’将被初始化,i保存的值将被复制给这个对象。值得注意的一件趣事是box运行时的类型将是被装箱的值类型(本例中即为int)。’is’操作符将返回box的类型为int。 

C#中的变量类型

C#中的变量类型分为两种:值类型和引用类型。 其中值类型比较好理解:概念上,值类型变量是直接存储其值,存储在堆栈中;   举例说明: int是值类型,表示下面的语句会在内存的两个地方存数值20:   ...
  • liangqichan
  • liangqichan
  • 2015年09月09日 15:16
  • 1127

C#变量类型:引用类型和值类型

C#是一种类型安全的语言。每一个变量都要求定义为一个特定的类型,并且要求存储在变量中的值只能是这种类型的值。 变量既能保存值类型,也可以保存引用类型,还可以是指针。这一课将讲述前两种类型,关于指...
  • slj_win
  • slj_win
  • 2014年08月25日 10:12
  • 752

CSharp变量和数据类型的转换

分类     值类型 什么样的变量是值类型呢?看值类型的特点吧 1.值类型变量都存储在堆栈中。2.访问值类型变量时,一般都是直接访问其实例。 3.每个值类型变量都有自己的数据副本,因此对一...
  • wxlinsr
  • wxlinsr
  • 2014年05月22日 12:09
  • 3418

C++ 变量类型

变量其实只不过是程序可操作的存储区的名称。C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。 变量的名称可以由字母、数字和下划线...
  • qq_38131668
  • qq_38131668
  • 2017年12月12日 11:07
  • 20

C++变量类型

全部变量 全局变量不受作用域影响 如果在一个文件中使用extern关键字来声明另一个文件中存在的全局变量,那么这个文件可以使用这个数据(即另一个文件中使用已存在文件中的变量,两者共用一个变量) /...
  • hackerHL
  • hackerHL
  • 2017年02月19日 20:40
  • 158

C#详解值类型和引用类型区别

首先,什么是值类型,什么是引用类型? 在C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储在数据堆中。 值类型(value type):byte,short,int,lo...
  • qiaoquan3
  • qiaoquan3
  • 2016年04月20日 17:59
  • 27942

C#值类型与引用类型间转换

值类型与引用类型间转换也称为装箱拆箱操作, 将基本类型或值类型转换成引用类型称为装箱, 将一个值类型变成了引用类型。具体代码的含义如下: 1)     int i=10:...
  • cxcalm
  • cxcalm
  • 2015年08月18日 13:11
  • 2492

C语言之变量类型和存储方式

变量可以分为全局变量、静态全局变量、局部变量和静态局部变量 变量的声明有两种情况: 1、一种是需要建立存储空间的(定义性声明)。例如int a 在生命的时候就已经建立了存储空间。 2、另一种是不...
  • tech_girl
  • tech_girl
  • 2017年01月03日 17:27
  • 894

C语言基础篇:变量和数据类型

  • 2008年10月29日 23:15
  • 1.17MB
  • 下载

【C#基础】值类型和引用类型

在备战软考的过程中,涉及到了原型模式,其中讲到了在浅复制的过程中,值类型和引用类型是有区别的。那么究竟什么是值类型,什么是引用类型呢? 在理解这两个概念之前,我们先谈一谈栈和堆。...
  • qq_26545305
  • qq_26545305
  • 2016年10月23日 18:58
  • 722
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#变量类型(1):引用类型和值类型
举报原因:
原因补充:

(最多只允许输入30个字)