C#赋值问题

nudtbear 2011-04-21 02:39:07
如下一段代码

void (struct a)
{
struct b=new struct()
b=a;
change to b;
}
为什么执行完以后a的值也变了呢?
...全文
210 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
coolzhengtao 2011-05-31
  • 打赏
  • 举报
回复
struct 是值类型,肯定发生改变,如果是引用类型的话就不变,建议楼主去百度搜索值类型和引用类型!
Olive_Guo 2011-05-31
  • 打赏
  • 举报
回复
值类型的“不可改变”性,表面看上去值发生了变化,其实是发生变化的数据没有改回原来的变量,而是一个新的变量

而你看到的是表面的现象,就是应该改变了


nudtbear 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 hamber_bao 的回复:]

C#中的数据类型分为两种, 值类型和引用类型
值类型包括struct,基本数据类型等
引用类型包括class,interface,数组等
创建两个值类型的实例,并且进行相互赋值操作,
若更改了其中一个实例的值,另一个是不会跟着变的。
创建两个引用类型的实例,并且进行相互赋值的操作,
若更改了其中一个实例的值,另一个会跟着变的。

值类型和引用类型的主要区别就是变量在内存的存储方式……
[/Quote]

那对数组的赋值只能用循环来进行吗?
nudtbear 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xiaoyuzi 的回复:]

结构是值类型,所以赋值后,对新结构的改变不会改变原来结构它里面成员的值(对于他的成员,如果是值类型,值类型值不变,如果是引用类型,你就要注意了,他不变的是引用的地址,实际引用指向的值会跟着变化,因为它们引用的是同一块内存)。这也就是你这个结构里的数组值会变了,数组是引用类型System.Array.

测试代码
C# code

public class MyClass
{
……
[/Quote]

那怎么办呢?只能循环赋值吗?
Hamber_Bao 2011-04-21
  • 打赏
  • 举报
回复
C#中的数据类型分为两种, 值类型和引用类型
值类型包括struct,基本数据类型等
引用类型包括class,interface,数组等
创建两个值类型的实例,并且进行相互赋值操作,
若更改了其中一个实例的值,另一个是不会跟着变的。
创建两个引用类型的实例,并且进行相互赋值的操作,
若更改了其中一个实例的值,另一个会跟着变的。

值类型和引用类型的主要区别就是变量在内存的存储方式不同。

LZ可以试着写一个类和一个结构,然后分别实例化,并且进行赋值操作。
然后试着改变对象的某一属性的值,看看另一个是不是也跟着变。

值得注意的是,string类型是一种特殊的类型,它是引用类型,但是表现的却是值类型的性质。
Hamber_Bao 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 q107770540 的回复:]
因为struct是值类型
[/Quote]

struct为结构类型,改变b,a的值不应该变!
kingdom_0 2011-04-21
  • 打赏
  • 举报
回复
change to b;????????????????????????????????什么东东?
struct是值类型。切记.
xiaoyuzi 2011-04-21
  • 打赏
  • 举报
回复
结构是值类型,所以赋值后,对新结构的改变不会改变原来结构它里面成员的值(对于他的成员,如果是值类型,值类型值不变,如果是引用类型,你就要注意了,他不变的是引用的地址,实际引用指向的值会跟着变化,因为它们引用的是同一块内存)。这也就是你这个结构里的数组值会变了,数组是引用类型System.Array.

测试代码

public class MyClass
{
private int myvalue;

public int MyValue
{
get { return myvalue; }
set { myvalue = value; }
}

public MyClass(int myvalue)
{
this.myvalue = myvalue;
}
}

public struct MyStruct
{
public int a;
public double b;
public MyClass myCls;
public int[] myArray;
}

MyStruct a = new MyStruct();
a.a = 1;
a.b = 2f;
a.myCls = new MyClass(3);
a.myArray = new int[] { 1,2,3};

MyStruct b = new MyStruct();
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());
yan_terry 2011-04-21
  • 打赏
  • 举报
回复
呀,你还有数组啊,肯定是你的数组问题。
yan_terry 2011-04-21
  • 打赏
  • 举报
回复
不会啊,struct是值类型。下面的结果为:1,1,3
using System;
using System.Collections.Generic;
using System.Text;

namespace structdos
{
struct Ms
{
public int a;
public Ms(int b)
{
a = b;
}
}
class Program
{
static void Main(string[] args)
{
Ms first = new Ms(1);

Console.Write(first.a.ToString() + "\r\n");
Console.Read();
ChangeA(first);
}


private static void ChangeA (Ms fir)
{
Ms second=new Ms(2);
second =fir;
second.a = 3;

Console.Write(fir.a.ToString()+"\r\n");
Console.Write(second.a.ToString()+"\r\n");
Console.Read();


}

}
}
#blackheart 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 nudtbear 的回复:]

a是提前定义好的一个结构,有很多变量和数组组成
[/Quote]
变量没变吧?是不是数组元素变了?
nudtbear 2011-04-21
  • 打赏
  • 举报
回复
a是提前定义好的一个结构,有很多变量和数组组成
nudtbear 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huwei001982 的回复:]
change to b 是什么?

就你的例子看, a 的值是不应该变的,因为 struct 是值类型
[/Quote]
change to b就是对b进行操作啊,完了之后就是a的值也跟着变了,因为a里有很多数组,不想用循环来赋值,所以就b=a,如果用循环来赋值的话对b操作后a就不会变
  • 打赏
  • 举报
回复
就你写出来的部分没发现可以导致a变掉的部分
#blackheart 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huwei001982 的回复:]

change to b 是什么?

就你的例子看, a 的值是不应该变的,因为 struct 是值类型
[/Quote]
我觉得也是
nudtbear 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 colinfang2006 的回复:]
因为struct是值类型
[/Quote]
什么意思啊?
戒指 2011-04-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 q107770540 的回复:]

因为struct是值类型
[/Quote]对的
huwei001982 2011-04-21
  • 打赏
  • 举报
回复
change to b 是什么?

就你的例子看, a 的值是不应该变的,因为 struct 是值类型
636f6c696e 2011-04-21
  • 打赏
  • 举报
回复
因为struct是值类型
q107770540 2011-04-21
  • 打赏
  • 举报
回复
因为struct是值类型

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧