C#赋值问题

问题描述

如下一段代码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是值类型,肯定发生改变,如果是引用类型的话就不变,建议楼主去百度搜索值类型和引用类型!

时间: 2024-10-21 18:49:30

C#赋值问题的相关文章

java中为什么有的变量声明而不赋值?

问题描述 java中为什么有的变量声明而不赋值? java中为什么有的变量声明而不赋值?而有的就值,那什么情况下要赋值,什么情况下不赋值 解决方案 比如对象变量,而调用这个变量的构造函数非常耗费时间,所以我们等用到的时候再创建,如果程序运行完都不访问它,就根本不创建,这样可以提高效率. 对于简单变量,比如int float一类的,建议随手给一个初始值. 解决方案二: 你这个问题给你举个例子,你应该就能理解了 例如: int a; 这是只声明不赋值,则只会在内存的栈区创建引用,堆中并无此引用的指向

简捷PHP数组赋值方法详解

 PHP数组还是比较常用的,于是我研究了一下PHP数组赋值,在这里拿出来和大家分享一下,希望对大家有用.所谓数组就是一组变量的集合保存在计算机的内存中,这些变量可以是不同的类型,包括整数,布尔值,字符串等.可以说数组就是内存中的一个小型的数据库.它为我们访问数据提供了一个快捷的方式――可以省出IO或者数据库的频繁访问以此来提高一些性能,所以关于数组中一些操作也是很多的. 怎样创建在PHP中创建数组你可以使用如下的方法之一创建数组: <?php $a="abcd";  print(

iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值

在上篇博客<iOS开发之使用Runtime给Model类赋值>中介绍了如何使用运行时在实体类的基类中添加给实体类的属性赋值的方法,这个方法的前提是字典的Key必须和实体类的Property Name相同,然后通过运行时来生成和执行Setter方法给Model类的属性赋值. 通过Runtime来给Model类属性赋值的好处是多多的,它便于代码的后期维护,并且提高了开发效率.当你拿到解析后的字典时你不用一个一个的通过key去把字典的值赋值给相应的Model类的属性,本篇博客中会给出如何去遍历Mod

阻塞赋值和非阻塞赋值

在always语句块中,verilog语言支持两种类型的赋值:阻塞赋值和非阻塞赋值.阻塞赋值使用"="语句:非阻塞赋值使用"<="语句.注意,千万不要将这两种赋值方法与assign赋值语句混淆起来,assign赋值语句根本不允许出现在always语句块中.      位于begin/end块内的多条阻塞赋值语句是串行执行的,这一点同标准的程序设计语言是相同的.但是多条非阻塞赋值语句却是并行执行的,这些非阻塞赋值语句都会在其中任何一条语句执行完成之前开始执行.这

c语言数组与函数-如何在函数中给已经在主函数中定义好的数组赋值

问题描述 如何在函数中给已经在主函数中定义好的数组赋值 已经在main()中定义了一个长度为20的数组,想在定义的函数中给数组赋值,但一直报错,请问如何修改? void arrin(int *arr) { int i; arr[]={1,1,2,2,3,3,4,5,6,5,6,7,7,8,8,9,9,0,0}; for(i=0;i<20;i++) printf("%d",arr[i]); } main() { int testarr[20]; ............ } 解决方

赋值-引用形参和return有什么区别和联系?

问题描述 引用形参和return有什么区别和联系? 形参是对地址进行操作.什么叫对地址进行操作?既然有时赋值形参无法把改变的变量传递给主函数,要传递只能用引用形参,那和用赋值形参,然后在被调函数最后加return的效果是否相同?在原理上有是否有什么区别?在本质上是否相同?是否可以替换? 解决方案 从编程的角度来说,都可以实现你要的目的. 但是两者产生的机器码不同,语法也不同,不知道你说的相同不同是从什么层面看. 事实上,微软的com编程,就使用指针而不是返回值来返回函数运行的结果,而返回值留给返

小心它----“复合赋值运算”

这是今天在开发当中遇到的问题,虽然不是很大,但还是花了一点时间去琢磨.       嗯,好了.先看一段源代码:  short value=2; value-=2;      源码就是上面这个样子的,我动手写的时候因为理解的问题,把代码改成了这个样子: short value=2; value=value-2;     这时候编译器就和我杠上了,报第二行有错.想想也对, value 变量和一个整型运算后 Java 会自动将运算结果提升到 int 类型,这和 value 定义的时候的 short 类

foreach 找不到赋值 代码和定义如下

问题描述 foreach 找不到赋值 代码和定义如下 <%foreach(var a in plist) { %> <%} %> public class index : pagebase { public List<promod> plist; } 解决方案 foreach(var a in Model.plist)如果你返回的Model是一个index的话.

c语言-结构体对象使用malloc初始化时候有办法直接对结构体变量赋值吗

问题描述 结构体对象使用malloc初始化时候有办法直接对结构体变量赋值吗 结构体对象使用malloc初始化时候有办法直接对结构体变量赋值吗? 解决方案 如果是C++的结构体,可以在构造函数中赋值,比如 struct data { int a; data() { a = 1; } }; 解决方案二: 你动态分配了结构体变量无非是,后面的工作需要对它进行赋值,以及各种运算. 那么,你所说malloc初始化直接赋值.是指什么样的情况的,难道是像c++中的 (构造函数).事实上c++的构造函数在使用前

c++-C++ list赋值和类的运算符重载

问题描述 C++ list赋值和类的运算符重载 刚刚发现了个问题,一直卡着我 class CA { public: CA(){} ~CA(){} public: VOID operator = ( CA& msg ) { dwvalue = msg.dwvalue; } private: DWORD dwvalue; }; VOID Fuck1( OUT list& bb ) { list< CA > aa; CA a; CA b; aa.push_back(a); aa.pu