我是靠谱客的博主 孤独大地,最近开发中收集的这篇文章主要介绍结构体与类的赋值区别及用Equals和==比较它们相同数据的结果[游戏开发前的准备2],觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

C#里的结构体与类有非常大的相似之处,在实际使用时只有class和struct的区别。所以我列出了关于它们的不同之处,以及在不同情况下的比较:
1.当引用1=引用2时结构体与类存在差异,因为在此后更改值1的值后值2对于类会发生改变,而结构体不会;
2.当为引用1与引用2被分别赋予相同值时,类用Equals()或==作比较结果不相等,而结构体作比较是相等的。

namespace _19结构体与类
{
    class personclass
    {
        public string action;
        public personclass(string action)
        {
            this.action = action;
        }
    }
    class intclass
    {
        public int n;
        public intclass(int n)
        {
            this.n = n;
        }
    }
    struct personstruct
    {
        public string action;
        public personstruct(string action)
        {
            this.action = action;
        }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            personclass pa1 = new personclass("madess1");
            personclass pa2 = new personclass("cult1");
            pa1 = pa2;
            pa2.action = "veneration1";
            Console.WriteLine(pa1.action + " " + pa2.action);//veneration1 veneration1
            //类的数据存储在堆里,栈存放一个地址,两个引用相等时它们指向同一个堆区数据,
            //      而=直接使用引用赋值,以至于在更改pa2的值时pa1也被修改了

            intclass pb1 = new intclass(2);
            intclass pb2 = new intclass(4);
            pb1 = pb2;
            pb1.n = 6;
            Console.WriteLine(pb1.n + " " + pb2.n);//6 6
            //即使是int类型也使用引用赋值

            personstruct pc1 = new personstruct("madess2");
            personstruct pc2 = new personstruct("cult2");
            pc1 = pc2;
            pc2.action = "veneration2";
            Console.WriteLine(pc1.action + " " + pc2.action);//cult2 veneration2
            //结构体的数据单独存储栈里,引用相等改变的单独的数据,所以pc2更改时pc1不会更改

            int a = 30;
            int b = 30;
            string c = "30";
            Console.WriteLine(a.Equals(b));//True
            Console.WriteLine(a.ToString().Equals(c));//True
            personclass pe1 = new("agnoal");
            personclass pe2 = new("agnoal");
            personstruct pf1 = new("agnoal");
            personstruct pf2 = new("agnoal");
            Console.WriteLine(pe1.Equals(pe2));//False 因为引用类型的地址不同
            Console.WriteLine(pf1.Equals(pf2));//True 结构体在所赋值相等时不同地址共用一个对象引用
            Console.WriteLine(pe1 == pe2);//False 因为引用类型的地址不同
            //Console.WriteLine(pf1 == pf2);//结构体不能直接用==作比较
            Console.WriteLine(pe1.ToString().Equals(pe2.ToString()));//True
            Console.WriteLine(pe1.ToString() == pe2.ToString());//True 通过ToString()转换成值类型的引用类型在被判断是否相等时只需要比较值
            

            //结论1:类的赋值其实改变的是地址的引用对象,当两个地址的引用对象相等时其中一个改变值会导致另一个的值也发生改变,
            //      而结构体的每次赋值都会改变地址,不过当值相等时地址也相等
            //结论2:用Equals()对不同地址相同数据作比较时类返回False,因为它比较的是指向内容是否一致,而==比较的是地址是否一致,
            //      对于除string之外的引用类型,Equals()判断是否对同一个对象的引用(即堆中的内容是否相同)
            //      ==比较的是栈的内容是否相同(即是否指向同一个堆中地址),
        }
    }
}

最后

以上就是孤独大地为你收集整理的结构体与类的赋值区别及用Equals和==比较它们相同数据的结果[游戏开发前的准备2]的全部内容,希望文章能够帮你解决结构体与类的赋值区别及用Equals和==比较它们相同数据的结果[游戏开发前的准备2]所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部