为什么我分配给变量的值消失了?

时间:2018-12-02 08:10:34

标签: c# winforms variables

我将import { Injectable } from '@angular/core' import { CONFIG } from '../config/config' import { Http } from '@angular/http' import 'rxjs/add/operator/toPromise' @Injectable() export class AuthService { constructor(private http: Http) { } register(name: String, email: String, password: String) { this.getConfig() .subscribe((response => { console.log(response) })) } getConfig() { return this.http.post(`${CONFIG.API_URL}/register`, { name: name, email: email, password: password }).toPromise() } } 的值分配给另一种形式variableA。为什么在清除variableB之后两个变量都为空?

variableA

enter image description here

Before execute entries.clear()

enter image description here

4 个答案:

答案 0 :(得分:22)

由于之前的这段代码,frm5.entriesentries都引用相同的对象:

frm5.entries = entries;

这里每个变量的值只是对象的引用-就像两张纸上有相同的房屋地址。您打给entries.Clear()的电话就像是在说:“用写在entries纸上的地址去房子,然后移走所有家具。”如果然后用写在纸上的地址frm5.entries到房子里,您会看到一间空房子。

这是引用类型在.NET中的工作方式,关键要理解它以便在任何.NET语言中取得进步。我有一个page on the topic,其中包含很多信息,还有一个Stack Overflow question,您可能也会觉得有用。

以下是说明这一点的示例:

using System;
using System.Collections.Generic;

class Test
{
    static void Main()
    {
        List<string> x = new List<string>();
        List<string> y = x;
        // x and y now refer to the same list...

        x.Add("foo");
        Console.WriteLine(y.Count); // 1

        y.Clear();
        Console.WriteLine(x.Count); // 0

        // Changing x or y to refer to a different list
        // *doesn't* change the other variable
        x = new List<string>();
        x.Add("bar");
        x.Add("baz");

        Console.WriteLine(y.Count); // 0
    }
}

答案 1 :(得分:2)

尝试frm5.entries = entry.ToArray();将会复制您的收藏集。我认为现在您复制引用而不是值。在一个变量上运行Clear()会导致另一个变量也为空,因为它指向内存中的相同空间。

答案 2 :(得分:1)

看来entries是集合,数组或List或其他。

无论如何,所有这些都称为类,您可以创建这些类的实例。这些对象就是引用类型,这意味着变量仅保存对内存的引用,在此对象被“记住”。因此,当您将变量分配给其他变量时,该其他变量也仅保留对同一内存的引用。

因此,当您更改一个变量时,基础对象也会更改,因此第二个变量也将受到影响(对一个变量所做的所有更改都会反映在所有具有相同引用的变量中。)

我建议您对此进行一些阅读,以更好地理解。例如:A deep dive: Value and reference types in .Net

答案 3 :(得分:0)

我不确定条目的数据类型,但是如果条目变量是DataTable,请像这样开始使用

在阻止状态中

frm5.entries = entries.Copy();

在else块

frm5.entries1 = entries.Copy();

它将复制解决您的问题。