我从未意识到过这样的问题。如果我传递了一个具有特定类型但尚未实例化的变量,那么它不应该被视为一个指针吗?在这个例子中,为什么如果方法GetEmployee创建一个新的实例,我回到了单击事件的范围时,我得到了空值。传递一个类的变量作为之前定义为null的参数
我知道为了使它工作,我可以将参数定义为ref或out,但Employee是一个最初被定义为null的类,但是当我做新的时候,我会在内存中分配一个空间,不要链接到变量?为什么我以后失去价值?
如果我传递一个对象,那么当我回到click事件的范围时,内部方法中所有修改过的属性将保持不变的情况将完全不同。
这将无法正常工作
protected void btnTest_Click(object sender, System.EventArgs e)
{
Employee employee = null;
bool created = GetEmployee(employee);
}
这将工作
protected void btnTest_Click(object sender, System.EventArgs e)
{
Employee employee = new Employee();
bool created = GetEmployee(employee);
}
其余
private bool GetEmployee(Employee employee)
{
if (employee == null)
{
employee = new Employee();
}
employee.ID = 1;
employee.Name = "John";
return true;
}
public class Employee
{
public int ID { get; set; }
public string Name { get; set; }
}
UPDATE:
的COM把事情稍微折腾一下。这也将失败,因为该对象从未被设置为不同的东西,以空
protected void btnTest_Click(object sender, System.EventArgs e)
{
int id = 1;
Employee employee = this.LoadFromDatabase(id);
bool created = GetEmployee(employee);
}
private Employee LoadFromDatabase(id)
{
//In the inner service method if it is not found it will return null
return Service.Instance.LoadFromDatabase(id);
}
private bool GetEmployee(Employee employee)
{
if (employee == null)
{
employee = new Employee();
}
employee.ID = 1;
employee.Name = "John";
return true;
}
https://blogs.msdn.microsoft.com/csharpfaq/2004/03/11/how-are-parameters-passed-in-c-are-they-by-reference-by-value/ – Jakotheshadows
对,在这种情况下,值是引用,你不能改变引用,因此分配某些参数在调用者中没有任何作用。 – Jakotheshadows
我不确定它是如何错误地传递参考的。 REFERENCE是按值传递的。我会编辑我的答案,以明确表示。 – Jakotheshadows