值、引用类型
介绍
引用类型派生自 System.Object
,而值类型均隐式派生自 System.ValueType
。
其实 System.ValueType
也是继承自 System.Object
,只不过它是特立独行的一个分支。
值类型
数值类型、布尔值、结构、枚举都是值类型。例:
[TestFixture]
public class Tests
{
[Test]
public void Test()
{
// 数值类型
Console.WriteLine(1 is ValueType); // true
// 布尔类型
Console.WriteLine(true is ValueType); // true
// 结构类型
Console.WriteLine(new Person() is ValueType); // true
// 枚举类型
Console.WriteLine(EnumTest.Item1 is ValueType); // true
}
}
public struct Person{}
public enum EnumTest
{
Item1 = 1
}
引用类型
字符串、数组、类、接口等都是引用类型。
值、引用类型的区别
- 引用类型变量的赋值只会复制对对象的引用,引用的对象存放在堆内存。
- 值类型变量赋值会深拷贝一个副本,且值类型变量存放在栈内存,且所有的值类型都为被编译器识别为密封类。
结构体
介绍
结构体是一种值类型,它的定义与普通类对象相似,只不过需要将定义类的关键字 class 换成 struct 。对于结构体,不像类那样存在继承,即一个结构不能从另一个结构或类继承。但是结构是从基类 Object 继承。
示例
[TestFixture]
public class Tests
{
[Test]
public void Test()
{
var person1 = new Person();
person1.Id = 1;
person1.Name = "张三";
Person person2 = person1;
person1.Name = "李四";
Console.WriteLine(person2.Name);
// 张三
Console.WriteLine(person1 is ValueType);
// True
}
}
public struct Person
{
private int id;
private string name;
public int Id
{
get { return id; }
set { id = value; }
}
public string Name
{
get { return name; }
set { name = value; }
}
}``
评论区