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;
}