将类引用传递给另一个不起作用的类

Lar*_*isa -1 c# inheritance class winforms

我有一个相当复杂的应用程序,所以我决定组织一些代码,并且我对主类的引用不再有问题了.我已经有了一个包含类的结构,但它们都是主类的属性,并且没有其他类属性需要引用主类.

所以我的结构是这样的: Main Class -> Class1, Class2, Class3 etc.

重组后,我创建了一个类似于此的结构:

Main Class -> (Class1 -> Class12, Class13), Class2, Class3 etc.
Run Code Online (Sandbox Code Playgroud)

我之前将引用传递给主类就好了,但是现在我有了更深层的结构,我得到了主要的class null错误.

与此特定错误相关的结构如下:

MainWindow: Form -> MaxFlow (algorithm) -> LabelNodes (a part of that algorithm)
Run Code Online (Sandbox Code Playgroud)

结构非常简单,因为我的大部分代码与问题完全无关.

首先,我有MainWindow课.

public partial class MainWindow : Form {
    private MaxFlow maxFlow; // Algorithm
    internal MaxFlow MaxFlow { get => maxFlow; set => maxFlow = value; }

    public MainWindow() {
        InitializeComponent();

    maxFlow = new MaxFlow(mainWindow: this);
    }
Run Code Online (Sandbox Code Playgroud)

然后Maxflow上课:

class MaxFlow {
    private MainWindow mainWindow;

    public MaxFlow(MainWindow mainWindow) {
        mainWindow = this.mainWindow;
    } 
Run Code Online (Sandbox Code Playgroud)

然后是最后一个带节点的类:

class LabelNodes {
    private MainWindow mainWindow;

    public LabelNodes(MainWindow mainWindow) {
        this.mainWindow = mainWindow;
    }

    public AddNewNodeLabel() { 
        //…

        // THIS PART THROWS THE ERROR (mainWindow equal to null):
        Label newLabel = new Label  {
            Location = mainWindow.LastClickLocation,
            Name = ”…”
        };

    //…
    }
Run Code Online (Sandbox Code Playgroud)

我试着设置断点,并发现该参考MainWindow类是null已经将它传递给前LabelNodes级,它得到通过nullMaxFlow类.

因为我有转移之前没有任何问题LabelNodes类从MainWindowMaxFlow,我怀疑这个问题是因为我通过它两次,但不明白为什么这可能是一个问题.

任何帮助,将不胜感激.

Jer*_*gen 6

您的代码不正确:您应该分配this.mainWindow而不是参数mainWindow.它会将字段中的默认值null分配给参数. (在Maxflow类中)

class MaxFlow {
   private MainWindow mainWindow;

   public MaxFlow(MainWindow mainWindow) {
       // mainWindow = this.mainWindow;   <-----
       // should be:
       this.mainWindow = mainWindow;
   } 
Run Code Online (Sandbox Code Playgroud)

就像DavidG指出的那样.更好的命名对话可以防止出现这些错误:

class MaxFlow 
{
   private MainWindow _mainWindow;

   public MaxFlow(MainWindow mainWindow) 
   {
       _mainWindow = mainWindow;
   } 
}
Run Code Online (Sandbox Code Playgroud)

  • 对于更好的变量命名也是一个很好的论据,常见的约定是使用下划线为私有变量添加前缀. (3认同)