C# 子类的对象引用
已更新子参数名称。C# 子类的对象引用,c#,C#,已更新子参数名称。 在TestClass内部为子类ChildClass赋值,但在赋值之后,如果我尝试访问Childcalss值,则该值为null。不确定原因。您必须将新的ChildClassdata分配给当前实例的根。为此,需要将新对象分配给this.root。在TestClass中进行如下更改: namespace Test { public class Program { static void Main(string[] args) {
在TestClass内部为子类ChildClass赋值,但在赋值之后,如果我尝试访问Childcalss值,则该值为null。不确定原因。您必须将新的ChildClassdata分配给当前实例的根。为此,需要将新对象分配给this.root。在TestClass中进行如下更改:
namespace Test
{
public class Program
{
static void Main(string[] args)
{
TestClass testC = new TestClass();
testC.AssignRec(10);
//testC.root - this is null
}
}
public class TestClass
{
public Childclass root;
public void Assign(int data)
{
AssigRec(this.root,data);
}
public void AssignRec(Childclass rootnode, int data)
{
if (rootnode == null)
{
rootnode = new Childclass(data);
}
}
}
public class Childclass
{
public int data;
public Childclass(int data)
{
this.data = data;
}
}
}
当参数的名称与字段的名称完全相同时,我们需要小心,因为在方法内部,名称将引用参数,除非我们使用this.root指定字段 因此,代码所做的是仅当参数根为null时才分配类字段根 相反,如果backing字段为null,您似乎希望执行赋值,在这种情况下,您可以执行以下操作:
public class TestClass
{
public Childclass root;
public void Assign(Childclass root, int data)
{
if (root == null)
{
//over here
this.root = new Childclass(data);
}
}
}
虽然作为这个类的使用者,如果调用Assign方法并传入一些数据,我会有点困惑,但是如果类字段root不是null,则不会发生任何事情
我也会被一个同时接受ChildClass和数据的方法弄糊涂,因为不清楚这些参数之间的关系是什么
相反,我建议提供两个重载,每个重载都有一个参数:
public void AssignRec(Childclass root, int data)
{
// Assign the field 'root' to the argument passed to this method unless the argument
// to this method is 'null', in which case assign a new instance of ChildClass
this.root = root ?? new ChildClass(data);
}
试图访问它并得到null的代码在哪里?在Assign中,root是一个隐藏同名成员的参数。您正在将新实例分配给参数,当您退出该方法时,该参数超出了范围。与字段匹配的参数名称像fak@GregK. 冒着查尔斯·西蒙尼(Charles Simonyi)的不洁精神永远萦绕在我心头的风险,我几乎希望有一个常规的C参数前缀,对于私有字段来说是analagous to u。@EdPlunkett我怎么强调都不过分,这个约定有多么难以置信的帮助。还有类属性的大写名称。@Sent您必须将新的ChildClass对象分配给TestClass的数据成员根。但是,在代码中,将新对象指定给参数。要么在答案中使用this.root,要么将属性的名称改为root大写字母R。这样读起来也会更清楚。@Senthil重命名参数不会有什么帮助,尽管这会让您更清楚问题的本质:您正在将新实例赋给一个参数,该参数是该方法的本地参数。您仍在丢弃新实例。您将this.root传递到AssignRec,但在该方法中,参数rootnode只是对传入内容的新引用。更改其值不会更改this.root的值。如果您能让我知道更新后的代码,这会很有帮助。也许您应该告诉我们您希望该方法做什么,因为您的编辑会使所需的结果更加不清楚,因为您现在没有为类字段分配任何内容。该方法的目的是什么?我试图理解为什么在Assign方法中传递this.root并没有保留AssignRec方法中更新的值。好的,我想这是因为您没有给this.root赋值。您是给参数名赋值,它没有任何作用。这个答案解决了这个问题。但是,如果参数root不为null,您希望它做什么?我试图只理解第一次赋值。在AssignRec中更改值是否会在root中得到更新?。我们为什么要重新分配该值。
public void Assign(int data)
{
if (this.root == null)
{
this.root = new ChildClass(data);
}
else
{
this.root.data = data;
}
}
public void Assign(ChildClass root)
{
this.root = root;
}