Я знаю, что это шаг за пределы вашей текущей проблемы, но он будет важен в будущем и решит эту проблему: где создать экземпляр класса и как поделиться этим экземпляром.
Не создавайте экземпляры класса telnet
в любой форме. Используйте Dependency Injection
вместо . Создайте экземпляр Telnet
на верхнем уровне приложения и передайте его обеим формам.
Это поможет вам разделить проблемы в вашем приложении и упростит проведение модульного тестирования вашего приложения в будущем (потому что вы можете создать для них подделку Telnet
).
Что-то вроде:
public static void Main(string[] args)
{
// maybe get these from the command line, or from app.config
const string ipAddress = "10.0.0.1";
const string port = "80";
var telnet = new Telnet(ipAddress, port);
var mainForm = new MainForm(telnet);
mainForm.ShowDialog();
}
// ...
public class MainForm : Form
{
private Telnet telnet;
public MainForm(Telnet telnet)
{
this.telnet = telnet;
}
// Todo: Use telnet in other methods
private void ShowSubForm()
{
var subForm = new SubForm(telnet);
subForm.Show();
}
}
Это лучше, чем Singleton или статический экземпляр, потому что он позволит вам легче менять свое приложение в будущем, он позволит вам повторно использовать ваш класс Telnet
в будущем, не будет ограничивать вас только иметь один Telnet
экземпляр на программу, и вам будет намного легче писать модульные тесты для вашего кода, когда вы дойдете до этой точки.
Если вам необходимо получить информацию о том, какой IP-адрес и порт следует использовать из главной формы, используйте Factory Pattern , создайте фабрику в Main
и передайте ее в форму. Затем вызовите фабрику в конструкторе MainForm
:
public class TelnetFactory
{
public Telnet Create(string ipAddress, string portNumber)
{
return new Telnet(ipAddress, portNumber);
}
}
// ...
public class MainForm : Form
{
private TelnetFactory telnetFactory;
private Telnet telnet;
public MainForm(TelnetFactory telnetFactory)
{
this.telnetFactory = telnetFactory;
}
// Called by a UI action of some sort...
private void Connect(string ipAddress, string portNumber)
{
if(this.telnet != null)
{
this.telnet = telnetFactory.Create(ipAddress, portNumber);
}
}
// Todo: Use telnet in other methods
// Todo: Just pass the existing telnet instance to SubForm
}
Если вы создаете обе формы в третьем промежуточном классе, вместо создания одной формы из другой формы вы все равно можете использовать эти шаблоны. Просто создайте экземпляр Telnet
в этом промежуточном классе или передайте фабрику этому промежуточному классу.