我将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
Before execute entries.clear()
答案 0 :(得分:22)
由于之前的这段代码,frm5.entries
和entries
都引用相同的对象:
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();
它将复制解决您的问题。