Инициализация поля для всей winform для использования ... (Ссылка на объект не установлена ​​на экземпляр объекта) - PullRequest
0 голосов
/ 16 ноября 2011

Вот мой код C # для Mainform.cs

public partial class MainForm : Form
{
    private Customer cust;

    public MainForm()
    {
        InitializeComponent();
    }

    private void buttonDeposit_Click(object sender, EventArgs e)
    {
        // I believe this is where I am going wrong... but I cannot understand why...
        DepositDialog dlg = new DepositDialog(cust.Accounts);

        dlg.ShowDialog();
    }

    private void buttonWithdraw_Click(object sender, EventArgs e)
    {
        // Here it is again...
        WithdrawDialog dlg = new WithdrawDialog(cust.Accounts);

        dlg.ShowDialog();
    }
}

Вот код для Customer.cs:

class Customer
{
    private BankAccountCollection accounts;
    private TransactionCollection transactionHistory;

    public Customer()
    {
        accounts.Add(new SavingsAccount(true,200));
        accounts.Add(new SavingsAccount(true, 1000));
        accounts.Add(new LineOfCreditAccount(true, 0));
    }

    public BankAccountCollection Accounts
    {
        get { return accounts; }
    }

    public TransactionCollection TransactionHistory
    {
        get { return transactionHistory; }
    }
}

Когда я пытаюсь запустить программу, я получаю ошибку JIT, которая говорит мне, что ссылка на объект не установлена ​​для экземпляра объекта. Как инициализировать поле :

private Customer cust;

и почему его нужно инициализировать? :

Ответы [ 7 ]

2 голосов
/ 16 ноября 2011

Проблема в том, что в конструкторе вы используете объект учетных записей, не создавая объект сначала с помощью ключевого слова 'new'.Вы должны инициализировать объекты, как показано ниже, перед использованием метода .Add.

private BankAccountCollection accounts = new BankAccountCollection();
private TransactionCollection transactionHistory = new TransactionCollection();

public Customer()
{
    accounts.Add(new SavingsAccount(true,200));
    accounts.Add(new SavingsAccount(true, 1000));
    accounts.Add(new LineOfCreditAccount(true, 0));
}
1 голос
/ 16 ноября 2011

Это не столько инициализировано, сколько создано.

 private Customer cust; // tells the compiler cust will be a Customer

 cust = new Customer(); // tells the compiler to create(and initialise) a Customer and point cust at it.

До тех пор, пока вы не сделаете это, cust будет нулевым, и любая попытка что-то сделать с ним, будет ошибкой.

Другой способ подумать о том, что ваша переменная cust будет.

  cust = FindCustomerInCountry("France");

если у вас нет французского клиента, он будет указывать на «ничто», т. Е. На ноль.

продолжай идти, ты доберешься до места.

1 голос
/ 16 ноября 2011
why does it need to be initialized?

Поскольку вы не можете получить доступ к non-static членам без создания экземпляра.

Вам необходимо создать экземпляр класса Customer, используя ключевое слово new, прежде чем обращаться к его членам экземпляра.

public partial class MainForm : Form
{
    private Customer cust;

    public MainForm()
    {
        InitializeComponent();
        cust = new Customer();
     }
1 голос
/ 16 ноября 2011

«Клиентский заказ»; только сообщает компилятору, какой тип переменной может содержать cust. На самом деле он не выделяет памяти для объекта клиента ... это то, что делает ключевое слово «new». Не думайте, что cust - это объект, а скорее указатель на объект customer, который вы можете в любой момент изменить, если хотите, на другой объект customer.

1 голос
/ 16 ноября 2011

Ваш запрос равен нулю.

инициализируйте его:

private Customer cust = new Customer();

или

до этой строки

DepositDialog dlg = new DepositDialog(cust.Accounts);
1 голос
/ 16 ноября 2011

Вы можете инициализировать его в конструкторе формы

public MainForm()
{
    InitializeComponent();
    cust = new Customer();
    // here eventually some intialization code...

или напрямую по декларации.

private Customer cust = new Customer() 
      {Accounts = new BankAccount[] 
          { new SavingsAccount(true,200), new SavingsAccount(true,200), 
            new SavingsAccount(true,200)} };
0 голосов
/ 16 ноября 2011
public MainForm()
{
    InitializeComponent();
    cust = new Customer();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...