对象是引用类型还是值类型?

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)

  • 以字符串为例是一个非常糟糕的主意。字符串是引用,但它也是不可变的。当您创建一个新字符串时,它首先查看字符串池以查看是否已经存在类似的字符串。字符串是一个超级特例,不要用它来解释有关引用和值类型的概念。 (3认同)

pas*_*ein 9

当你这样做

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".

这是因为对象是引用类型.


Ste*_*ove 8

一个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的文本.