为什么值类型在引用类型的属性时就像引用类型一样?

时间:2017-09-29 13:02:36

标签: c# .net

为什么这样:

@Override
protected void onPause() {
    super.onPause();
    stopVideo();
    webview.pauseTimers();
}

@Override
public void onResume() {
    super.onResume();
    webview.resumeTimers();
    webview.onResume();
}

private void stopVideo() {
    try {
        Class.forName("android.webkit.WebView")
                .getMethod("onPause", (Class[]) null)
                .invoke(webview, (Object[]) null);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
@Override
    protected void onDestroy() {
        super.onDestroy();
        webview.loadUrl("about:blank");
        webview.destroy();
        webview = null;
    }

结果

public class BoolClass
{
    public bool Value { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        BoolClass bc1 = new BoolClass { Value = false };
        BoolClass bc2 = bc1;
        bc1.Value = true;
    }
}

由于bc2.Value == true 是我期望bool的值类型,除非bc2.Value == false被装箱并存储在堆上。

我在Stack Overflow上发现了这个方法来判断该值是否已装箱

bc2.Value

但它说它没有盒装。我现在有些困惑,有人能解释一下吗?

4 个答案:

答案 0 :(得分:8)

BoolClass中只有Main的一个实例 - 使用

创建的实例
BoolClass bc1 = new BoolClass { Value = false }

第二个变量bc2引用BoolClass的完全相同的实例,以及附加到该实例的所有属性。这是因为不会复制引用类型。

OneInstance

因此,只有一个Value属性,它属于BoolClass实例。通过对实例的两次引用都可以看到对该属性的任何操作。

答案 1 :(得分:4)

因为您只创建了一个BoolClass实例(其中包含' new'的行)。分配bc2时,您将为其分配与bc1相同的对象引用,因此它们现在指向同一个对象。

因此,在分配bc1.Value时,您要在bc2上更改同一对象的布尔值,因此它也包含相同的值。

答案 2 :(得分:0)

您没有创建刚刚初始化现有的新实例,因此它引用了某个对象。 如果使用new创建新的,则它将引用不同的object.Ex -

  BoolClass bc1 = new BoolClass { Value = false };
  BoolClass bc2 = new BoolClass();
  bc2.Value = bc1.Value
  bc1.Value = true;

现在bc2.Value只会是假的

答案 3 :(得分:0)

因为您创建了BooClass的实例:

BoolClass bc1 = new BoolClass { Value = false };

然后影响此对象引用另一个对象引用bc2:

BoolClass bc2 = bc1;

因此,bc2和bc1现在指向相同的BooClass实例。