Ufu*_*MEN 20 c# oop object value-type reference-type
我仍然怀疑object.它是任何类的任何类的主要基类.但它是引用类型还是值类型.或者喜欢这些行为中的哪一个呢?我需要澄清一下.我很难理解这一点.
object obj1 = "OldString";
object obj2 = obj1;
obj1 = "NewString";
MessageBox.Show(obj1 + " " + obj2);
//Output is "NewString OldString"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它就像一个值类型.如果object是引用类型,那么为什么obj2值仍然是"OldString"
class SampleClass
{
public string Text { get; set; }
}
SampleClass Sample1 = new SampleClass();
Sample1.Text="OldText";
object refer1 = Sample1;
object refer2 = refer1;
Sample1.Text = "NewText";
MessageBox.Show((refer1 as SampleClass).Text + (refer2 as SampleClass).Text);
//OutPut is "NewText NewText"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它就像引用类型
我们可以推断出它object的类型就是你所包含的内容.它既可以是引用类型,也可以是值类型.这是关于你在里面装的东西.我对吗?
Mar*_*ell 22
它是一种参考类型
用string做一个例子并不是很有启发性,因为string 也是一个引用类型(SampleClass很明显); 你的例子包含零"拳击".
如果对象是引用类型,那么为什么obj2值仍为"OldString"
为什么不呢?创建新字符串时,不会将旧引用更改为指向新字符串.考虑:
object obj1 = "OldString";
// create a new string; assign obj1 the reference to that new string "OldString"
object obj2 = obj1;
// copy the reference from obj1 and assign into obj2; obj2 now refers to
// the same string instance
obj1 = "NewString";
// create a new string and assign that new reference to obj1; note we haven't
// changed obj2 - that still points to the original string, "OldString"
Run Code Online (Sandbox Code Playgroud)
当你这样做
obj1 = "NewString";
Run Code Online (Sandbox Code Playgroud)
它实际上将一个新的引用保存到另一个内存位置,而不是obj2之前给出的相同位置.当您更改位置的内容时obj1,您将获得相同的更改obj2.
尝试改变的内容obj1与
fixed(char* c = obj1 as string)
{
c = '0';
}
Run Code Online (Sandbox Code Playgroud)
你的两个字符串现在都是"0ldString".
这是因为对象是引用类型.
一个object变量始终是引用类型.
有可能object通过拳击的力量"引用"一个值类型.该框是一个值的引用类型包装器,object变量引用该值.
int x = 10; // a value-type
object o = x;
Run Code Online (Sandbox Code Playgroud)
该变量o是对包含值的框的引用x- 但它不是x:
x = 20;
MessageBox.Show( string.Format( "x:{0} o:{1}", x, o ) );
Run Code Online (Sandbox Code Playgroud)
对于可变值类型,这可能更有启发性:
struct SampleClass
{
public string Text { get; set };
public override string ToString() { return Text; }
}
var x = new SampleClass{ Text = "Hello" };
object o = x;
x.Text = "World";
MessageBox.Show( string.Format( "{0} {1}", x, o ) );
Run Code Online (Sandbox Code Playgroud)
o是一个盒装引用x,所以改变x的值对它没有影响o.
更改SampleClass为类而不是结构(引用类型而不是值类型)将改变行为:行object o = x;将使o引用与x相同的内容,并且更改x的文本也将更改o的文本.