对象引用未设置为对象的实例 - 从另一个方法访问对象

时间:2014-03-08 02:51:55

标签: c#

我在访问使用其他方法创建的对象时遇到问题。

internal class Connect
{
    private ServerSession session;
    private ClientProperties properties;

    public void initialize()
    {

        this.properties = new ClientProperties("PropertyA", "PropertyB");

        // the code for ServerSession() resides in a separate class file
        session = new ServerSession(properties);

        // this is a pseudo event handler...I have real eventhandlers in my application (I just can't share due to NDA)
        session.eventHandler_1(new EventHanlder<Method>(this.method_1));
    }

    public void disconnect()
    {
        session.Disconnect();
    }

    public void connect(string server)
    {
        session.Connect(server, 1234);
    }
}

此应用程序用于连接到网络。我需要initialize函数来初始化网络协议(首次初始化应用程序时,在Program.cs文件中访问此方法。)

我遇到的问题是从我的应用程序WinForm访问Object reference not set to an instance of an object方法时出现connect()错误。

摘录form.cs

namespace MyApplication
{
    public partial class MainForm : Form
    {
        Connect server = new Connect();

        // this method is called when I establish a connection to the network
        private void connectServer()
        {
            server("123.456.789");
        }
    }
}

如何在不抛出此错误的情况下正确访问connect()方法。我知道这是因为对象由于某种原因是空的,但我不明白为什么因为它是在同一个类中初始化的。

2 个答案:

答案 0 :(得分:1)

永远不会调用initialize类的Connect方法,因此对象的session对象永远不会被初始化。要解决这个问题,您应该首先调用该方法。

或者,将初始化代码移动到构造函数:

internal class Connect
{
    private ServerSession session;

    public Connect ()
    {
        session = new ServerSession();
        // stuff
    }

    // …
}

正如您在评论中提到的那样,您在应用程序启动时在其他位置设置了Connect的实例,然后希望它出现在您的表单中。但是,这不是对象的工作方式。在执行new Connect()时,您正在创建一个 new 对象 - 这就是它的全部要点。如果您不想创建新对象,则不要创建新对象,而是重用已创建的对象。

有多种方法可以做到这一点。最干净的方法是使用将现有实例传递给MainForm。例如,通过表单的构造函数,或通过定义您设置的属性:

public partial class MainForm : Form
{
    public Connect Server
    { get; set; }

    private void connectServer()
    {
        Server.connect("123.456.789");
    }
}

然后在Main中,您可以执行以下操作:

Connect connect = new Connect();

MainForm form = new MainForm();
form.Server = connect;
form.Show();

答案 1 :(得分:0)

正如poke所提到的,请务必先调用initialize方法。您还需要确保调用connect方法。所以像这样:

public partial class MainForm : Form
{
    Connect server = new Connect();
    server.initialize(); // call your initialize method

    private void connectServer()
    {
        server.connect("123.456.789"); // call the connect method here
    }
}