Как было предложено другими, быстрое решение может заключаться в том, чтобы сделать свойства статическими. Однако это, скорее всего, вызовет новые проблемы, такие как тестируемость, и нарушит принципы чистого кода.
Подход Singleton уже лучше, поскольку вы можете потенциально настроить его для возврата тестового объекта для модульных тестов. Однако получение Singleton требует статического метода, который может снова быть вызван повсеместно.
Таким образом, как статические свойства, так и синглеты увеличивают вероятность использования кода спагетти. Это потому, что у вас нет контроля над тем, кто может получить доступ к данным, а кто не может.
Вы точно не указали, сколько форм у вас есть, как они открываются и т. Д., Поэтому мне нужно будет сделать некоторые предположения.
Основной метод может выглядеть следующим образом:
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var data = new Trans();
var secondForm = new Form2 {Trans = data};
var mainForm = new Form1 {SubForm = secondForm, Trans = data };
Application.Run(mainForm);
}
И я изменил класс Trans так, что он не имеет статические элементы больше. Я также исправил этот класс, потому что у IMHO была проблема с копией/вставкой. Вполне вероятно, что вы внедрили все файлы _Sec_
для тестирования, поэтому их можно, вероятно, удалить (они возвращают один и тот же объект, что не решает каких-либо проблем).
class Trans
{
public List<string> name_list = new List<string>();
public List<string> family_list = new List<string>();
public List<string> phoneno_list = new List<string>();
public List<string> name_Sec_list { set { name_list = value; } get { return name_list; } }
public List<string> family_Sec_list { set { family_list = value; } get { return family_list; } }
public List<string> phoneno_Sec_list { set { phoneno_list = value; } get { return phoneno_list; } }
}
Что вы видите здесь?
- оба
Form1
и Form2
имеют доступ к данным, поэтому он решает вашу проблему.
Main()
способ имеет контроль над тем, кто получает какие данные. Все, кому нужны эти данные, получают данные.
- Никто не получает доступ к данным. В то время как каждый мог
new
сам Trans
, это было бы просто пусто.
- Поскольку нет ничего
static
больше, вы можете смело использовать new
экземпляры Trans
во время модульных тестов без каких-либо побочных эффектов
- формы не создает их зависимости самой. Зависимость теперь вводится в форму. Это позволяет заменить его макетным объектом с определенным тестовым поведением в единичном тесте. (Еще один вопрос: следует ли тестировать пользовательские интерфейсы в модульных тестах, но это другая тема).
Сделать этот класс или списки статическими и использовать ваши списки как: 'Trans.name_list', не создавая' new Trans() ' –
@MarkBenovsky Какой класс должен быть статическим? –
'public static class Trans', или вы можете сделать все свои списки' static' как 'name_list' –