0

これがMainform.csのC#コードです

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;

なぜ初期化する必要があるのですか?:

4

7 に答える 7

2

問題は、コンストラクターで、最初に「new」キーワードを使用してオブジェクトを作成せずに、accountsオブジェクトを使用していることです。.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));
}
于 2011-11-16T10:38:19.813 に答える
1

フォームコンストラクターで初期化できます

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)} };
于 2011-11-16T10:17:21.003 に答える
1

あなたの顧客はnullです。

それを初期化します:

private Customer cust = new Customer();

また

この行の前

DepositDialog dlg = new DepositDialog(cust.Accounts);
于 2011-11-16T10:19:23.700 に答える
1

「顧客の顧客;」どのタイプの変数custが保持できるかをコンパイラーに通知するだけです。実際には、顧客オブジェクトにメモリを割り当てません...それが「new」キーワードが行うことです。custをオブジェクトとして考えないでください。必要に応じて、いつでも別の顧客オブジェクトを指すように変更できる顧客オブジェクトへのポインタです。

于 2011-11-16T10:21:11.687 に答える
1
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();
     }
于 2011-11-16T10:28:06.090 に答える
1

作成されたほど初期化されていません。

 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 = FindCustomerInCountry("France");

フランスの顧客がいない場合、顧客は「何もない」、つまりnullを指します。

続けてそこに着きます。

于 2011-11-16T10:41:08.167 に答える
0
public MainForm()
{
    InitializeComponent();
    cust = new Customer();
}
于 2011-11-16T10:17:22.093 に答える