值类型与引用类型(C#)
值类型
值类型主要由两类组成:
- 结构
- 枚举
结构分为以下几类:
- Numeric(数值)类型
- 整型
- 浮点型
- decimal
- bool
- 用户定义的结构
值类型表如下:
值类型的主要功能
- 基于值类型的变量直接包含值。 将一个值类型变量赋给另一个值类型变量时,将复制包含的值。 这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。
- 所有的值类型均隐式派生自 System.ValueType。
- 与引用类型不同,不能从值类型派生出新的类型。 但与引用类型相同的是,结构也可以实现接口。
- 每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。
初始化值类型
在使用 C# 中的局部变量之前,必须对其进行初始化。 例如,可能声明未进行初始化的局部变量,如以下示例所示:
int myInt;
那么在将其初始化之前,无法使用此变量。 可使用下列语句将其初始化:
myInt = new int(); // Invoke default constructor for int type.
此语句是下列语句的等效语句:
myInt = 0; // Assign an initial value, 0 in this example.
当然,可以用同一个语句进行声明和初始化,如下面示例所示:
int myInt = new int();
//或
int myInt = 0;
使用 new 运算符时,将调用特定类型的默认构造函数并对变量赋以默认值。 在上例中,默认构造函数将值 0 赋给了 myInt。
对于用户定义的类型,使用 new 来调用默认构造函数。 例如,下列语句调用了 Point 结构的默认构造函数:
Point p = new Point(); // Invoke default constructor for the struct.
此调用后,该结构被认为已被明确赋值;也就是说该结构的所有成员均已初始化为各自的默认值。
引用类型
一个引用类型的变量不存储它们所代表的实际数据,而是存储对实际数据的引用(一般而言,引用会是数据存储于存储器或存储设备中的物理地址。)。
引用类型分两步创建:首先在栈上创建一个引用变量,然后在堆上创建对象本身,再把这个内存的句柄(也是内存的首地址)赋给引用变量。
首先来看一例程:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace example
{
public class Car
{
public int carSpeed { get; set; }
public string carName { get; set; }
public Car( int carSpeed, string carName)
{
this.carSpeed = carSpeed;
this.carName = carName;
}
}
class Program
{
static void Main(string[] args)
{
Car a = new Car( 100, "BMW");
Car b = new Car( 150, "Benz");
// 测试值类型
int carSpeed = a.carSpeed;
a.carSpeed = 200;
// 测试引用类型
Car c = b;
b.carName = "Ferrari";
// 输出
Console.WriteLine("carSpeed = {0}", carSpeed);
Console.WriteLine("a.carSpeed = {0}", a.carSpeed);
Console.WriteLine("b.carName = {0}", b.carName);
Console.WriteLine("c.carName = {0}", c.carName);
while(true);
}
}
}
输出结果:
由例程可知:int carSpeed = a.carSpeed ; a.carSpeed = 200,这条语句申请了一个 int 型的变量 carSpeed ,它在栈里另开辟一个地址,把值存在其中,当 a.carSpeed 的值改变时不会影响 carSpeed 的值。Car c = b; b.carName = “Ferrari”;,这里把 c 指向 b,也就是说两者在栈中存的是同一个引用,当 b.carName 改变时,c.carName 也会改变。
下面关键字用于声明引用类型:
- class
- interface
- delegate
C# 也提供了下列内置应用类型:
- dynamic
- Object
string
参考资料
1.值类型(C# 参考): https://msdn.microsoft.com/zh-cn/library/s1ax56ch.aspx
2.引用类型(C# 参考):https://msdn.microsoft.com/zh-cn/library/490f96s2.aspx?f=255&MSPPError=-2147217396
3.C#里面的值类型与引用类型的区别:http://blog.csdn.net/wust__wangfan/article/details/17841055
版权声明:本文为博主原创文章,未经博主允许不得转载。