0

/* こんにちは、Visual Studio で初めての C# アプリケーションを作成しようとしています。メインでクラスとそのクラスのインスタンスを作成しました。フォームのクリック イベント内でそのインスタンスのメンバーをクエリしようとしているだけですが、インスタンス名が現在のコンテキストに存在しないことがわかります。ここに私のコードがあります。*/

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;

    namespace WindowsFormsApplication10
    {

     public class character         // this is my class
        {
            public bool hair_black;
        }


        static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());

                character deviljin = new character();  // instance of my class

                deviljin.hair_black = true;      // initiating a member of the instance


            }
        }
    }

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsFormsApplication10
    {


        public partial class Form1 : Form
        {

            int cs1 = 0,cs2=0;


            public Form1()
            {
                InitializeComponent();


            public void pictureBox1_Click(object sender, EventArgs e)
            {

                flowLayoutPanel1.Visible = true;
                if (deviljin.hair_black == true)   // trying to access instance member
                {                                  // but getting deviljin does not
                                                   // exist in the current context
                    pictureBox28.Visible = false;
                }            

            }

        }
    }
4

3 に答える 3

1

インスタンス変数deviljinはメイン メソッドに対してローカルであり、そのメソッドの外部で直接参照することはできません。

使用しようとしている Form1 のインスタンス内で参照を渡す必要があります。これは、form1 のコンストラクターを介して参照を直接渡すことで実行できます。

 Application.Run(new Form1(deviljin));

もちろん Form1 のコンストラクタを

private character _devReferenceToCharacterPassed

public Form1(character mycharInstance)
{
    _devReferenceToCharacterPassed = mycharInstance;
    InitializeComponent();
}

渡されたインスタンスをクリックコードで使用できるようになりました

public void pictureBox1_Click(object sender, EventArgs e)
{
    flowLayoutPanel1.Visible = true;
    if (_devReferenceToCharacterPassed.hair_black == true)   
    {                                  
         pictureBox28.Visible = false;
    }            
}

にも注意してください

Application.Run(新しい Form1(deviljin));

ブロッキングコールです。これは、Form1 が開かれるまでコードがこの呼び出しから終了しないことを意味するためdeviljin、Run 呼び出しの前に変数の作成を移動する必要があります。

編集: アプリケーション全体でグローバルな可視性を持つ変数の使用に強く反対します。必要な場合もありますが、保守できないコードがすぐに作成されてしまいます。可能な限り少ないグローバル変数でプログラミングを学ぶ方が良い

于 2012-12-14T00:03:36.707 に答える
1

これは、エラーの内容によるものです - インスタンスが現在のコンテキスト (フォームのコンテキスト) に存在しません

Mainこれはスコープの問題です。宣言するすべての変数にはスコープがあり、クラス内のメソッドのローカル スコープで文字クラス インスタンスを宣言しているため、そのメソッドでProgramのみ表示されます。

クラスは静的であるため、Programそのクラスに静的メンバーを作成するだけで済みます。

namespace WindowsFormsApplication10
{

 public class character         // this is my class
    {
        public bool hair_black;
    }


    static class Program
    {
        public static character deviljin;

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

編集:これには本当に気づきませんでしたが、スティーブが指摘したように、これはコンパイルされますが、変数をインスタンス化する前に Application.Run を呼び出すと、アクセスしようとするとランタイム例外が発生します(nullになります)ので、make Application.Runの前にこれを行うことを確認してください

            deviljin = new character();  // instance of my class

            deviljin.hair_black = true;      // initiating a member of the instance

            Application.Run(new Form1());


        }
    }
}

Programこのようにして、クラスを介してインスタンスにアクセスできます。

        public void pictureBox1_Click(object sender, EventArgs e)
        {

            flowLayoutPanel1.Visible = true;
            if (Program.deviljin.hair_black == true)   
            { 
                pictureBox28.Visible = false;
            }            

        }

変数のスコープ、アクセス修飾子、および静的/インスタンス変数を読んでください。非常に単純なプロジェクトの場合、静的変数は問題ないので、まだ学習している間にこのルートに進むことができます

于 2012-12-14T00:09:39.353 に答える
1

Character のインスタンスをパラメーターとして取得するには、フォームを更新する必要があります。

public partial class Form1 : Form
{
    private Character _character;
    public Form1(Character character)
    {
        _character = character;
    }

    public void pictureBox1_Click(object sender, EventArgs e)
    {
        If (_character.hair_black)
        {
             ...
        }
    }
}
...
var deviljin = new Character()
{
    hair_black = true
};
Application.Run(new Form1(deviljin));
于 2012-12-14T00:12:33.673 に答える