2015-10-20 69 views
-2

我有一个类定义如下:类的对象副本的引用,其中作为.NET对象复制价值

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

字符串是不可变的。你的例子类不是。 – Phylogenesis

+0

它们也有些作为值类型,比如'int'(因为它们是不可变的)。 –

+0

@unlucky,你误解了一些东西,这一行newObj =“改变了值”;将创建一个新的字符串对象而不改变现有对象的值 – Kira

回答

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"; 
+0

字符串也是引用类型。创建字符串时,会创建对其的引用。 –

+0

我表达自己错了。如果你做字符串s =“a”;字符串s2 = s; s和s2是不同的对象 – Diogo

+0

是否可以创建我的类的不可变对象? –

0

string是参考的类型,它覆盖分配和其它的操作,与象工作值类型,如byteshortint

您定义的类实际上是从object派生的,.NET可以像引用类型一样使用对象,而不是值类型。

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

+0

是否有可能创建我的类的不可变对象?\ –

+0

@ un-lucky http://stackoverflow.com/questions/352471/how- DO-创建-AN-不变类 –

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 
相关问题