值类型与引用类型的区别

更新时间:2023-07-20 12:01:35 阅读: 评论:0

将数据类型分为值类型(value type引用类型(reference type
一个具有值类型(value type的数据存放在内的一个变量中。即是在栈中分配内存空间,直接存储所包含的值,其值就代表数据本身。值类型的数据具有较快的存取速度
一个具有引用类型(reference type的数据并不驻留在栈中,而是存储于中。即是在堆中分配内存空间,不直接存储所包含的值,而是指向所要存储的值,其值代表的是所指向的地址。当访问一个具有引用类型的数据时,需要到栈中检查变量的内容,该变量引用堆中的一个实际数据。引用类型的数据比值类型的数据具有更大的存储规模和较低的访问速度
C#是一种类型安全的语言。每一个变量都要求定义为一个特定的类型,并且要求存储在变量中的值只能是这种类型的值。
变量既能保存值类型,也可以保存引用类型,还可以是指针。这一课将讲述前两种类型,关于指针的讨论我们将在下一课中进行。
下面是关于值类型和引用类型不同点的概论:
如果一个变量v存储的是值类型,则它直接存储包含数据的对象。任何其他的变量v’都不能直接存储已经由v存储了的对象,虽然v’可以存储一个和v韭菜英语存储的对象有着相同值的对象。(译注:这意味着,vv’存储的对象毫不相干,任意改变其中一个存储的对象都不会影响到另一个变量存储的对象。)
如果变量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 184********709551615
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 小数点后1516位有效数字
decimal
System.Decimal
12
可能值从 ±1.0 x 10-28  ±7.9 x 1028 小数点后2829位有效数字
char
System.Char
N/A
2
iso是什么文件任何16Unicode字符
bool
System.Boolean
N/A
1 / 2
true 或者fal
在下面的代码中,两个变量都声明为整形,并得到赋值:
int x = 10;
int y = x;
y = 20; // 这条语句运行后x的值为10y的值为20
    引用类型
C#预定义的引用类型包括objectstring类型。正如我们在上面提到的,object类型是所有其他类型的最终基类。用户定义的引用类型可以是接口类型、类类型和委托类型(第12课会有具体介绍)。
引用类型事实上保存一个指向它引用的对象的内存地址。下面的代码段中有两个变量引用了同一个对象(本例中,假设这个对象有一个数据成员’myValue’):
object x = new object();
x.myValue = 10;
object y = x;
y.myValue = 20; // 这条语句执行后,x.myValuey.myValue的值都为20
上面的这段代码演示了引用类型的一个特点:改变某一个引用指向的对象的属性同时也会影响到所有其他指向这个对象的引用。不过,strings类型虽然也是引用类型,但它的工作方式更象值类型。当一个字符串被指定了另一个字符串的值时,例如:
string s1 = "hello";
string s2 = s1;
    s2s1都引用了同一个字符串类型,但是当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

本文发布于:2023-07-20 12:01:35,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1106836.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:类型   引用   对象   变量   数据   字符串
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图