#c# #.net #winforms #forms #reference
#c# #.net #winforms #формы #ссылка
Вопрос:
У меня есть класс, созданный в Form1
, и я хочу вызвать его Form2
, это возможно?
Например:
public TheClass thClass; //member from Form1
/* ... */
public void foo() {
thClass = new TheClass(...);
}
Форма 2:
public void baa() {
Form1 form1 = new Form1();
form1.thClass.MethodName( .. ) ;
}
Я получаю следующую ошибку при вызове .baa()
метода в Form2
:
Object reference not set to an instance of an object.
Каков наилучший способ сделать это? ref
?
Я хочу, чтобы это не создавало экземпляр thClass снова.
Надеюсь, это понятно. Заранее спасибо.
Ответ №1:
Вы получаете это исключение, потому thClass
null
что в вашем примере вы должны вызвать foo()
перед использованием thClass
.
Поля ссылочного типа не представляют собой ничего особенного — к ним можно получить доступ, как к любому другому общедоступному полю класса (и Form1
является классом). В общем случае вы захотите вместо этого использовать свойство и избегать открытых полей, поскольку любое их изменение приведет к нарушению существующих потребителей — свойство, которое может быть установлено только классом-владельцем, который вы могли бы выразить как
public TheClass SomeClass {get; private set;}
Комментарии:
1. Я получаю ту же ошибку ..
.foo()
метод вызывается вForm1
этом недостаточно, чтобы я мог вызвать.baa()
Form2
?2. вы получили это в обратном порядке в своем примере — вы должны сначала вызвать
foo()
, затем вы можете вызватьform1.thClass.MethodName()
Ответ №2:
Лучшим способом сделать это может быть передача экземпляра класса в Form1 конструктору Form2.
// Code from Form 1
public partial class Form1 : Form
{
private TheClass thClass;
public Form1()
{
InitializeComponent();
}
public void foo()
{
thClass = new TheClass(...);
}
private void button1_Click(object sender, EventArgs e)
{
Form2 objForm2 = new Form2(thClass);
objForm2.Show();
}
}
// Code From Form 2
public partial class Form2 : Form
{
private TheClass thClass;
public Form2(TheClass thCls)
{
thClass = thCls;
InitializeComponent();
}
private void baa(object sender, EventArgs e)
{
thClass.MethodName( .. );
}
}
Ответ №3:
вы должны вызвать Foo() для инициализации «thClass»….
public void baa() {
Form1 form1 = new Form1();
form1.foo();
form1.thClass.MethodName( .. ) ;
}
Комментарии:
1.
.foo()
вызывается вForm1
2. Я не вижу, где вызывается … объявляется… но не вызывается
Ответ №4:
поскольку вы инициализируете thClass в методе foo, вы просто вызываете метод перед использованием thClass
public void baa() {
Form1 form1 = new Form1();
form1.foo();
form1.thClass.MethodName( .. ) ;
}
или вы можете инициализировать напрямую
public void baa() {
Form1 form1 = new Form1();
form1.thClass = new TheClass(...);
form1.thClass.MethodName( .. ) ;
}