欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

值类型和引用类型

程序员文章站 2022-06-22 17:30:57
哪些属于值类型? 1、结构(struct)属于值类型,另外int、double、float、char、bool、decimal(钱)、enum类型属于值类型,我们可以将鼠标放在int类型上,然后按F12可以跳转到类型定义,可以看到int、double、float也属于结构类型。哪些属于引用类型? 2、自定义类属于引用类型,数组是隐式的引用类型,另外委托、集合、接口、......

哪些属于值类型?

      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

 

本文地址:https://blog.csdn.net/tiankongzhicheng441x/article/details/84928675