哪些属于值类型?
1、结构(struct)属于值类型,另外int、double、float、char、bool、decimal(钱)、enum类型属于值类型,我们可以将鼠标放在int类型上,然后按F12可以跳转到类型定义,可以看到int、double、float也属于结构类型。
哪些属于引用类型?
2、自定义类属于引用类型,数组是隐式的引用类型,另外委托、集合、接口、string和object类型也是引用类型。
对象是引用类型。把对象赋给变量时,实际上时把该对象的指针赋给了该变量,这两个变量包含同一个对象的指针。
指针是内存中的一个地址,所以实际上是复制了这个地址。
值类型与引用类型的区别:
1、存储的地方不同。值类型的值存储在内存的栈中,引用类型的值是存储在内存的堆中。
2、传递值类型和传递引用类型时,传递方式不同。
举例:
using System;
namespace ConsoleApp1
{
class people
{
public int i;
}
struct stru
{
public int j;
}
class Program
{
static void Main(string[] args)
{
//类是引用类型
people p1 = new people();
p1.i = 10;
people p2 = p1;//把p1引用的地址赋给变量p2
p2.i = 20;
Console.WriteLine($"类:p1中的结果{p1.i}");
Console.WriteLine($"类:p2中的结果{p2.i}");
//结构类型是值类型
stru a1 = new stru();
a1.j = 30;
stru a2 = a1;
a2.j = 40;
Console.WriteLine($"结构:a1中的结果{a1.j}");
Console.WriteLine($"结构:a2中的结果{a2.j}");
//数组是引用类型
int[] SZ1 = new int[1];
SZ1[0] = 3;
int[] SZ2 = SZ1;//将SZ1引用的地址赋值给SZ2.
SZ2[0] = 4;
Console.WriteLine($"数组:SZ1的结果{SZ1[0]}");
Console.WriteLine($"数组:SZ2的结果{SZ2[0]}");
//int类型是值类型
int number = new int();
number = 1;
int num = number;
num = 2;
Console.WriteLine($"int类型:number结果{number }");
Console.WriteLine($"int类型:num结果{num}");
Console.ReadKey();
}
}
}
/****************************输出***********************/
类:p1中的结果20
类:p2中的结果20
结构:a1中的结果30
结构:a2中的结果40
数组:SZ1的结果4
数组:SZ2的结果4
int类型:number结果1
int类型:num结果2
//即时输出窗口
&p1
0x0093ed98
*&p1: 0x00000000
&p1
0x0093ed98
*&p1: 0x02ae6350
p1
{ConsoleApp1.people}
i: 0
p1
{ConsoleApp1.people}
i: 10
&p2
0x0093ed94
*&p2: 0x02ae6350
p2
{ConsoleApp1.people}
i: 10
p2
{ConsoleApp1.people}
i: 20
p1
{ConsoleApp1.people}
i: 20
&a1
0x0093ed90
*&a1: {ConsoleApp1.stru}
a1
{ConsoleApp1.stru}
j: 0
&a1
0x0093ed90
*&a1: {ConsoleApp1.stru}
a1
{ConsoleApp1.stru}
j: 0
a1
{ConsoleApp1.stru}
j: 30
&a2
0x0093ed8c
*&a2: {ConsoleApp1.stru}
a2
{ConsoleApp1.stru}
j: 30
a2
{ConsoleApp1.stru}
j: 40
a1
{ConsoleApp1.stru}
j: 30