7

静的プロパティとパブリック プロパティの違いを理解しようとしています。しかし、パブリック プロパティ 'Test' に他の形式でアクセスしようとすると、'null' と表示されます。

フォーム 1 は次のとおりです。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private string _test;

    public string Test
    {
        get { return _test; }
        set { _test = value; }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        _test = "This is a test";
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.Show();
    }
}

Form2 は次のとおりです。

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        Form1 frm1 = new Form1();
        label1.Text = frm1.Test;
    }
}

Form1 の「Test」の値を確認するために、次の行にブレークポイントを設定しました。

label1.Text = frm1.Test;

しかし、値は「null」です。

パブリック プロパティに他のフォームにアクセスする方法を教えてください。

ところで、このパブリック プロパティを「public static」にしようとしました。これを使用してこれにアクセスできます:

Form1.Test

しかし、Form2 から 'Test' の値を変更できることに気付きました。そのため、私は公共の財産を使用しようとしていますが、運がありません。誰かが私にこれらのことを明確にすることができますか. 助けてくれてありがとう!

EDIT: (For follow up question) 

サー・ジョン・コーナーの答えは、私の質問に対する最良の答えです。しかし、フォローアップの質問があります。これらの「テスト」プロパティを「静的」にしようとしましたが、このプロパティを静的またはパブリック プロパティにしても、Form2 で編集できることに気付きました。自分自身を明確にするために、ここにサンプルがあります:

public partial class Form2 : Form
{
    private Form1 f1;
    public Form2(Form1 ParentForm)
    {
        InitializeComponent();
        f1 = ParentForm;
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        label1.Text = f1.Test;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        f1.Test = "This test has been changed!";

        this.Close();
    }
}

Form2 を閉じた後、「Test」の値を確認するために Form1_Load で再度ブレークしようとしたところ、変更されました。Form1 のパブリック プロパティを Form2 の readOnly にして編集できないようにするにはどうすればよいですか? 私に明確にしてください。どうもありがとう!

4

5 に答える 5

7

プロパティはインスタンス変数であるため、値は のインスタンスごとに異なる場合がありForm1ます。

親フォームからインスタンス変数にアクセスしようとしている場合、これを行う最も簡単な方法は、Form1 を Form2 のコンストラクターに渡すことです。

public partial class Form2 : Form
{
    private Form1 f1;
    public Form2(Form1 ParentForm)
    {
        InitializeComponent();
        f1 = ParentForm;
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        label1.Text = f1.Test;
    }
}

次に、Form1 から新しい Form2 を作成するときに、次の操作を実行できます。

Form2 frm2 = new Form2(this);

プロパティを読み取り専用にしたい場合は、単純にセッターを指定できません。

public string Test
{
    get { return _test; }
}
于 2013-02-02T16:06:59.830 に答える
1

このメソッド「静的」の使用

まずは Control label プロパティ Modifiers=Public

以下のプログラムコードで

public static Form1 frm1 = new Form1();
public static Form2 frm2 = new Form2();

以下のForm1コードで

Program.frm2.show();

以下のForm2コードで

label1.Text=Program.frm1.text; 
于 2013-02-02T16:51:34.867 に答える
0

frm1メインフォームオブジェクトではありません。これは、(イベント ハンドラーTestで) ロード時にプロパティが初期化される、新しく作成されたオブジェクトです。Form1_Load

于 2013-02-02T16:07:37.070 に答える
0

の最初のインスタンスは のインスタンスをForm1示し、Form2次にの別のインスタンスをForm2作成します。これは機能する可能性がありますが、次のイベントを設定します。Form1_testForm.Load

フォームが初めて表示される前に発生します。

Form1読み込もうとしているインスタンスを表示しないTestため、そのLoadイベントは発生せず、Test残りnullます。

@JohnKoerner が言及しているように、コンストラクターのオーバーロードまたはプロパティを追加して Form1 参照を渡すこともできますが、カップリングを減らすために、おそらくイベントにカプセル化された必要な変数のみを渡すことをお勧めします。Form2通常、 についてすべてを知る必要はありませんForm1

于 2013-02-02T16:08:56.777 に答える
-1

公衆

型またはメンバーには、同じアセンブリまたはそれを参照する別のアセンブリ内の他のコードからアクセスできます。

静的

クラスの static 修飾子は、クラスをインスタンス化できず、そのすべてのメンバーが静的であることを意味します。静的メンバーには、それを囲む型のインスタンスがいくつ作成されても、1 つのバージョンがあります。

静的クラスは基本的に非静的クラスと同じですが、1 つの違いがあります。静的クラスは外部でインスタンス化できないということです。つまり、 new キーワードを使用してクラス型の変数を作成することはできません。インスタンス変数がないため、クラス名自体を使用して静的クラスのメンバーにアクセスします。

ただし、静的コンストラクターのようなものがあります。静的クラスを含め、どのクラスもこれらのいずれかを持つことができます。それらは直接呼び出すことはできず、パラメーターを持つことはできません (クラス自体の型パラメーターを除く)。最初のインスタンスが作成される前、または静的メンバーが参照される前に、クラスを初期化するために静的コンストラクターが自動的に呼び出されます。次のようになります。

static class Foo() { static Foo() { Bar = "fubar"; }

public static string Bar { get; set; }

}

静的クラスはサービスとして使用されることが多く、次のように使用できます。

MyStaticClass.ServiceMethod(...);

于 2013-02-02T16:14:18.387 に答える