C#引用结构和类的区别

220 阅读2分钟

在C#中,结构是值类型,在声明变量的时候,就会对其分配内存;类是引用类型,如果只是声明变量,得到的是一个声明都没的空对象,也不可访问其中的成员。

例1(使用结构) using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace nihao {

/// <summary>
/// 结构体表示复数
/// </summary>

class Program
{
    static void Main(string[] args)
    {
        ComplexNumber c1;
        //c1赋值
        c1.a = 1;
        c1.b = 3;
        //创建c2并且赋值
        ComplexNumber c2 = c1;
        c2.a = c2.b;
        Console.Write("c1 = ");
        c1.Write();
        Console.Write("c2 = ");
        c2.Write();
        Console.ReadKey();
    }
    /// <summary>
    /// 创建结构,同时在结构中创建一个输出复数的方法
    /// </summary>
    struct ComplexNumber {

        public float a;

        public float b;

        public void Write() {
        
            Console.WriteLine("{0}+{1}i", a, b);//输出复数(可引用) 
                       
        }
    }
}

} 例2(使用类)

using System;

namespace ConsoleApp3

{

/// <summary>
/// 把结构成类,并引用运行,
/// 结构属于值类型,类属于引用类型
/// 值类型在声明变量时就会分配内存,但引用类型不会,只会得到一个空对象,也不可访问
/// 因此new用于显示创建类的变量(为类分配内存)
/// </summary>
class Program
{
    static void Main(string[] args)
    {
        //new在C#中作用
        ComplexNumber c1 = new ComplexNumber();//为ComplexNumber类分配一个内存
        ComplexNumber c2 = c1;
        c1.a = 1;
        c1.b = 3;
        c2.a= c2.b;
        Console.Write("c1 = ");
        c1.Write();
        Console.Write("c2 = ");
        c2.Write();
    }
}

class ComplexNumber { 
    
    public float a;
    public float b;

    public void Write() {

        Console.WriteLine("{0}+{1}i" ,a,b );
        Console.ReadKey();
    
    }
}

}

若要使用类,需要在声明变量时将 ComplexNumber c1;更改为ComplexNumber c1 = new ComplexNumber(); new用于显示创建类的变量,才得到在程序中真是存在的内存对象。 而且例1和例2所得结果不同 如图 例1结果

在这里插入图片描述 例2结果

在这里插入图片描述

由此可见值类型和引用类型的区别: 1、将值类型的一个变量a赋值给另一个变量b,其实就是把a的数据赋值给b,a和b两个变量是相互独立的。 2、将引用类型的一个变量a赋值给另一个变量b,其实是把a中指向所引用的类的指针赋值给b,另b也包含指向所引用的类的指针,本质上是对类进行操作(不知道这样讲是否合适)。如图 在这里插入图片描述 在执行c2.a=c2.b之后变为 在这里插入图片描述 以上就是我对于C#中引用结构和引用类的一些认识,由于刚刚起步学习C#,可能在认识上还有一些偏差,希望大家可以指正,谢谢大家。