我的课程定义如下:
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.
答案 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
是引用类型,它会覆盖赋值操作和其他操作,与值类型一样使用,例如byte
,short
,int
等。
您定义的类实际上是从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