c# 关于值类型和引用类型的赋值问题

参考了帖子:C#的两种类据类型:值类型和引用类型_牛奶咖啡13的博客-CSDN博客

今天因为对值类型和引用类型的不清晰导致赋值过程出错,特此记录一下。

核心(我的理解):值类型直接存储其值,而引用类型存储它在堆上的地址,根据堆上的地址读出其值

具体上代码:


        class SomeClass  //引用类型
        {
           public int val;
        }
        struct SomeStruct  //值类型
        {
            public int val;
        }
        static void Main(string[] args)
        {
            SomeClass[] sc = new SomeClass[10];
            SomeClass sc1 = new SomeClass(); //引用类型在栈上存储的是堆上分配的临时内存的地址
            SomeStruct[] ss = new SomeStruct[10];
            SomeStruct ss1 ; //值类型在栈上存储的是实际的数值
            int j = 0;
            for(int i = 0; i<10; i++)
            {
                sc1.val = i;
                ss1.val = i;
                ss[j] = ss1;
                sc[j] = sc1; //赋值过程赋值的是地址
                j++;
            }
            Console.WriteLine("以下是引用类型的赋值:");
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(sc[i].val);
                
            }

            Console.WriteLine("以下是值类型的赋值:");
            for (int i = 0; i < 10; i++)
            {
               
                Console.WriteLine(ss[i].val);
            }
            j = 0;
            //想要引用类型达到和值类型一样的复制效果,需要将要每次赋值的引用类型申明一个临时地址,也就是此地址可变
            for (int i = 0; i < 10; i++)
            {
                SomeClass st1 = new SomeClass(); //每次进入循环后他的地址都会改变
                st1.val = i;
                sc[j] = st1; //赋值过程赋值的是地址
                j++;
            }
            Console.WriteLine("以下是引用类型修改后的赋值:");
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(sc[i].val);

            }
        }

结果如下图:

 

 

 注意区分以下两种写法:

第一种:代码如下,过程图类似下图(图中地址不代表任何实际意义,只是作为示意)

SomeClass[] sc = new SomeClass[10];
SomeClass sc1 = new SomeClass(); //引用类型在栈上存储的是堆上分配的临时内存的地址
int j = 0;
for(int i = 0; i<10; i++)
  {
    sc1.val = i;
    sc[j] = sc1; //赋值过程赋值的是地址
    j++;
  }

 

 

 

  第一种:代码如下,过程图类似下图(图中地址不代表任何实际意义,只是作为示意)

SomeClass[] sc = new SomeClass[10];
int j = 0;
for(int i = 0; i<10; i++)
  {
    SomeClass sc1 = new SomeClass(); //引用类型在栈上存储的是堆上分配的临时内存的地址
    sc1.val = i;
    sc[j] = sc1; //赋值过程赋值的是地址
    j++;
  }

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值