问题描述
如下一段代码void(structa){structb=newstruct()b=a;changetob;}为什么执行完以后a的值也变了呢?
解决方案
解决方案二:
因为struct是值类型
解决方案三:
因为struct是值类型
解决方案四:
changetob是什么?就你的例子看,a的值是不应该变的,因为struct是值类型
解决方案五:
引用1楼q107770540的回复:
因为struct是值类型
对的
解决方案六:
引用2楼colinfang2006的回复:
因为struct是值类型
什么意思啊?
解决方案七:
引用3楼huwei001982的回复:
changetob是什么?就你的例子看,a的值是不应该变的,因为struct是值类型
我觉得也是
解决方案八:
就你写出来的部分没发现可以导致a变掉的部分
解决方案九:
引用3楼huwei001982的回复:
changetob是什么?就你的例子看,a的值是不应该变的,因为struct是值类型
changetob就是对b进行操作啊,完了之后就是a的值也跟着变了,因为a里有很多数组,不想用循环来赋值,所以就b=a,如果用循环来赋值的话对b操作后a就不会变
解决方案十:
a是提前定义好的一个结构,有很多变量和数组组成
解决方案十一:
引用9楼nudtbear的回复:
a是提前定义好的一个结构,有很多变量和数组组成
变量没变吧?是不是数组元素变了?
解决方案十二:
不会啊,struct是值类型。下面的结果为:1,1,3usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespacestructdos{structMs{publicinta;publicMs(intb){a=b;}}classProgram{staticvoidMain(string[]args){Msfirst=newMs(1);Console.Write(first.a.ToString()+"rn");Console.Read();ChangeA(first);}privatestaticvoidChangeA(Msfir){Mssecond=newMs(2);second=fir;second.a=3;Console.Write(fir.a.ToString()+"rn");Console.Write(second.a.ToString()+"rn");Console.Read();}}}
解决方案十三:
呀,你还有数组啊,肯定是你的数组问题。
解决方案十四:
结构是值类型,所以赋值后,对新结构的改变不会改变原来结构它里面成员的值(对于他的成员,如果是值类型,值类型值不变,如果是引用类型,你就要注意了,他不变的是引用的地址,实际引用指向的值会跟着变化,因为它们引用的是同一块内存)。这也就是你这个结构里的数组值会变了,数组是引用类型System.Array.测试代码publicclassMyClass{privateintmyvalue;publicintMyValue{get{returnmyvalue;}set{myvalue=value;}}publicMyClass(intmyvalue){this.myvalue=myvalue;}}publicstructMyStruct{publicinta;publicdoubleb;publicMyClassmyCls;publicint[]myArray;}MyStructa=newMyStruct();a.a=1;a.b=2f;a.myCls=newMyClass(3);a.myArray=newint[]{1,2,3};MyStructb=newMyStruct();b=a;b.a=4;b.b=5f;b.myCls.MyValue=6;b.myArray[0]=4;b.myArray[1]=5;b.myArray[2]=6;MessageBox.Show(a.a.ToString()+","+a.b.ToString()+","+a.myCls.MyValue.ToString()+","+a.myArray[0].ToString());MessageBox.Show(b.a.ToString()+","+b.b.ToString()+","+b.myCls.MyValue.ToString()+","+b.myArray[0].ToString());
解决方案十五:
changetob;????????????????????????????????什么东东?struct是值类型。切记.
解决方案:
引用1楼q107770540的回复:
因为struct是值类型
struct为结构类型,改变b,a的值不应该变!
解决方案:
C#中的数据类型分为两种,值类型和引用类型值类型包括struct,基本数据类型等引用类型包括class,interface,数组等创建两个值类型的实例,并且进行相互赋值操作,若更改了其中一个实例的值,另一个是不会跟着变的。创建两个引用类型的实例,并且进行相互赋值的操作,若更改了其中一个实例的值,另一个会跟着变的。值类型和引用类型的主要区别就是变量在内存的存储方式不同。LZ可以试着写一个类和一个结构,然后分别实例化,并且进行赋值操作。然后试着改变对象的某一属性的值,看看另一个是不是也跟着变。值得注意的是,string类型是一种特殊的类型,它是引用类型,但是表现的却是值类型的性质。
解决方案:
引用13楼xiaoyuzi的回复:
结构是值类型,所以赋值后,对新结构的改变不会改变原来结构它里面成员的值(对于他的成员,如果是值类型,值类型值不变,如果是引用类型,你就要注意了,他不变的是引用的地址,实际引用指向的值会跟着变化,因为它们引用的是同一块内存)。这也就是你这个结构里的数组值会变了,数组是引用类型System.Array.测试代码C#codepublicclassMyClass{……
那怎么办呢?只能循环赋值吗?
解决方案:
引用16楼hamber_bao的回复:
C#中的数据类型分为两种,值类型和引用类型值类型包括struct,基本数据类型等引用类型包括class,interface,数组等创建两个值类型的实例,并且进行相互赋值操作,若更改了其中一个实例的值,另一个是不会跟着变的。创建两个引用类型的实例,并且进行相互赋值的操作,若更改了其中一个实例的值,另一个会跟着变的。值类型和引用类型的主要区别就是变量在内存的存储方式……
那对数组的赋值只能用循环来进行吗?
解决方案:
值类型的“不可改变”性,表面看上去值发生了变化,其实是发生变化的数据没有改回原来的变量,而是一个新的变量而你看到的是表面的现象,就是应该改变了
解决方案:
struct是值类型,肯定发生改变,如果是引用类型的话就不变,建议楼主去百度搜索值类型和引用类型!