类的对象复制引用,其中.net对象复制值

时间:2015-10-20 09:27:56

标签: c# class object reference copy

我的课程定义如下:

class foo
    {
        private string _bar;
        public string Bar
        {
            get { return _bar; }
            set { _bar = value; }
        }
    }

查看以下操作:

  foo myFoo = new foo();//Creating an object of foo
  myFoo.Bar = "sample";//assign value for bar
  foo currentFoo = myFoo;//Assign the object to another object
  currentFoo.Bar = "newValue";//Change the value of newly created object.

在这种情况下,在对象的bar的最终步骤值变为newValue之后,对象(.net)类型的值不会像这样反映:

  object obj = "currentValue";//assign some value 
 object newObj = obj;//assign object to another object
 newObj = "Changed Value";//change the value of new object.

为什么没有更新旧对象的值?这是什么原因?是否可以像这样创建类的对象?

更新

我也检查过以下情况:

foo myFoo = new foo();
 myFoo.Bar = "sample";
 object currentFoo = myFoo;
 ((foo)currentFoo).Bar = "newValue";
 //Here also both the objects get updated.

3 个答案:

答案 0 :(得分:0)

C#使用对几乎所有期望基类型的引用。

在这种情况下,您有一个实例化为对象的类,然后稍后引用它。当你使用' ='在对象中,它总是会创建一个引用。

在第二种情况下,您的对象是'字符串'因为它是一个基类型没有创建引用,而是创建了另一个具有该值的对象〜

编辑:让不可变的'类。不仅仅是一种方式。

class foo
    {
        private string _bar;
        public string Bar
        {
            get { return _bar; }
            set { _bar = value; }
        }

        public foo Clone()//Cloning is creating a new reference type with same values as old object
        {
           foo newc = new foo();
           newc.Bar = this.Bar;
           return newc;
        }
    }

然后就这样做

foo obj1 = new foo();
foo.Bar = "hi";
foo obj2 = foo.Clone();
obj2.Bar = "bye";

答案 1 :(得分:0)

string是引用类型,它会覆盖赋值操作和其他操作,与值类型一样使用,例如byteshortint等。

您定义的类实际上是从object派生的,而.NET与对象类似,而不是值类型。

除了一些基本类型,在.NET中,所有对象都通过引用传递。

答案 2 :(得分:0)

类是引用类型,而结构是值类型

意味着类传递一个指向它们存储在的内存位置的指针,而结构传递一个新值

字符串是一种特殊的交叉类型,但通常可以视为值类型

使用您的示例,这就是正在发生的事情

foo myFoo = new foo();//Creating a new foo object at memory location #1 and point variable myFoo at #1
myFoo.Bar = "sample";//set the bar section of #1 to Sample
foo currentFoo = myFoo;//point variable current foo at #1
currentFoo.Bar = "newValue";//set the bar section of #1 to Sample

现在在你的第二个,这是发生了什么

object obj = "currentValue";//Create a value at #1 with the value "currentValue" and point obj at #1
object newObj = obj;//Point newObj at #1
newObj = "Changed Value";//create value at #2 as "Changed Value" and point newObj at #2