C#winform:从其他表单访问公共属性&;静态属性和公共属性之间的区别
我试图理解静态属性和公共属性之间的区别。但当我试图以其他形式访问我的公共属性“Test”时,它显示为“null” 表格一:C#winform:从其他表单访问公共属性&;静态属性和公共属性之间的区别,c#,winforms,public,C#,Winforms,Public,我试图理解静态属性和公共属性之间的区别。但当我试图以其他形式访问我的公共属性“Test”时,它显示为“null” 表格一: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private string _test; public string Test { get { return _test; }
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();
}
}
这是表格2:
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”
请帮助我如何访问其他表单的公共属性
顺便说一句,我试图使这个公共属性成为“公共静态”。我可以通过以下方式访问此文件:
Form1.Test
但我注意到,我可以从表2中更改“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关闭后,我试图在Form1_Load中再次中断以检查“Test”的值,结果它被更改了!如何将Form1中的公共属性设置为Form2中的只读属性且无法编辑?请向我澄清。谢谢大家 您的属性是一个实例变量,因此
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);
如果希望属性为只读,则不能指定setter:
public string Test
{
get { return _test; }
}
frm1
不是您的主要表单对象。它是新创建的对象,属性Test
在加载时初始化(在Form1\u Load
事件处理程序中)。Form1的第一个实例显示Form2
的一个实例,然后Form2
创建Form1
的另一个实例。这可能会起作用,但您在事件中设置了\u test
,其中:
在窗体首次显示之前发生
您没有显示要从中读取的Test
的Form1
实例,因此它的Load
事件将不会发生,并且Test
将保持null
您可以添加构造函数重载或属性来传递@JohnKoerner提到的Form1引用,但我更愿意只传递所需的变量,甚至可能封装在事件中,以减少耦合Form2
通常不需要了解所有关于Form1
public
该类型或成员可由同一程序集或引用它的另一程序集中的任何其他代码访问
静态
类上的static修饰符意味着不能实例化该类,并且其所有成员都是静态的。无论创建了多少封闭类型的实例,静态成员都有一个版本
静态类基本上与非静态类相同,但有一个区别:静态类不能从外部实例化。换句话说,您不能使用new关键字创建类类型的变量。因为没有实例变量,所以可以使用类名本身访问静态类的成员
但是,有一个静态构造函数。任何类都可以有其中之一,包括静态类。不能直接调用它们&不能有参数(类本身上的任何类型参数除外)。在创建第一个实例或引用任何静态成员之前,会自动调用静态构造函数来初始化类。看起来像这样:
静态类Foo()
{
静态Foo()
{
Bar=“fubar”;
}
}
静态类通常用作服务,您可以这样使用它们:
MyStaticClass.ServiceMethod(…) 此方法的使用“静态” 首先,控件标签属性修饰符=公共 在下面的程序代码中
public static Form1 frm1 = new Form1();
public static Form2 frm2 = new Form2();
label1.Text=Program.frm1.text;
在下面的Form1代码中
Program.frm2.show();
在下面的Form2代码中
public static Form1 frm1 = new Form1();
public static Form2 frm2 = new Form2();
label1.Text=Program.frm1.text;
谢谢这个人,请看我的后续问题编辑,我希望我的问题清楚。就这样!谢谢你的帮助,约翰!你给了我很好的教训!抱歉,我是个新手:(