值类型和引用类型

哪些属于值类型?

      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

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值