Самый безопасный способ передачи данных между формами в C# winforms
Я пытаюсь вспомнить урок, который мне кратко преподали в школе, о безопасной передаче данных между winforms.
Мой инструктор назвал это конвейерной обработкой, хотя я не уверен, что это правильный термин или просто его собственное название. Он заявил, что его метод более безопасен, чем самый простой способ публикации данных, чтобы все могли получить к нему доступ. Он сказал, что это было безопаснее, потому что его метод предотвращал доступ к данным из внешних программ или не связанных форм и процессов, и он приветствовал это как хорошую практику программирования.
Мой фундамент в программировании был очень слабым в то время. Мне не хватало более глубокого понимания того, что он мне сказал, и я просто повторял его шаги. Без каких-либо концепций, связывающих его учение, я легко забыл его метод.
Теперь я лучше разбираюсь в том, что делаю, и хочу с помощью простых вопросов и ответов установить самый безопасный и безопасный способ обмена данными между winforms. То есть метод, который сохраняет данные в безопасности и может переходить из формы A в форму B или из форм B, C, D... и т. Д., Как я их обозначаю, но никак не вытекает.
Чтобы указать, я ищу для обмена данными между формами в одном приложении. Возможно, когда-нибудь я попытаюсь поделиться данными между процессами, но сейчас я забочусь только о формах.
Чтобы сделать более конкретный пример, я пытаюсь передать простые строки имени versionNumber
а также lastEditDate
от Main
форма к About
форма, знание этого позволяет мне иметь кучу статических переменных, которые мне нужно изменить только в одном месте кода, которые могут быть переданы в любую форму, которую я желаю. Но мне нужен безопасный способ сделать это, на случай, если передача данных между формами путем определения глобально считается плохой практикой или небезопасной.
2 ответа
Таким образом, рассуждения, которые вы привели для того, чтобы просто иметь много открытых статических данных, не верны. Он не более или менее защищен от злонамеренных попыток других процессов получить доступ к информации. Он находится в памяти независимо от того, что вы делаете, поэтому вредоносный процесс (с достаточными привилегиями) может получить к нему доступ, несмотря ни на что, но, скорее всего, ему будет тяжело, несмотря ни на что. Если у вас есть вредоносный процесс / пользователь с таким уровнем разрешений, вы уже проиграли бой; они уже могут делать все, что хотят.
Проблемы с хранением всех ваших данных в открытых статических полях - это просто вопрос эффективной разработки, а не фактической безопасности. Когда данные могут быть изменены в любом месте всей вашей программы в любое время, это делает чрезвычайно сложным понимание того, что происходит в программе в любой конкретный момент времени, это действительно затрудняет поиск ошибок, поскольку могут быть проблемы практически везде в коде это действительно затрудняет привлечение новых разработчиков в проект, потому что они не могут просто открыть класс или два и понять их, они должны понимать все приложение, чтобы иметь возможность правильно рассуждать о том, что происходит в любом одна часть, из-за высокого уровня сцепления в вашем приложении.
Вы должны стремиться уменьшить связывание различных модулей в вашем приложении, сохраняя данные более локализованными. Это позволяет разработчику взглянуть на отдельный модуль (будь то форма, пользовательский элемент управления, некоторый рабочий класс и т. Д.), И ему нужно только понимать этот класс перед собой, не разбираясь во всех точках всего приложения. это также касается тех же переменных.
Вы также должны быть очень обеспокоены проблемами потоков, когда вы получаете доступ к общедоступным статическим переменным из нескольких потоков, поскольку почти наверняка вам потребуется несколько потоков в приложении winform.
Наконец, если вы храните все свои данные статически, это означает, что вы никогда не сможете иметь несколько экземпляров своих форм. Большинство форм, которые вы будете писать, с логической точки зрения, не должны требовать, чтобы в приложении никогда не было более одной из них. Если их данные локализованы только для них, нет проблем с созданием второй формы. Если все данные статичны, то формы в конечном итоге будут бороться друг с другом за эти данные.
Что касается того, как этого добиться, то основная цель здесь должна заключаться в том, чтобы область данных была настолько узкой, насколько вы можете (к чему вы должны стремиться во всех видах программирования), не допуская, чтобы переменные были доступны в местах, где они не нужно быть доступным
Случай, который вы описали, является довольно простой задачей для решения. Если форма создает другую форму, для которой требуются некоторые данные при построении, если эти данные необходимы для использования этой другой формы, просто создайте параметры в конструкторе для этих данных. Форма (или что-то еще), создающая ее, может затем передать эти необходимые данные. Если данные не требуются или не требуются непосредственно при построении, тогда другой вариант заключается в том, чтобы иметь свойства, которые позволяют "владельцу" этой формы передавать необходимые данные. Сделать это на самом деле не сложнее, чем создать публичное статическое поле; это просто создание публичного нестатического свойства.
Теперь, когда эти данные не являются статичными, вы знаете, что вместо того, чтобы получать к ним доступ откуда-либо, эта информация будет предоставляться тем, кто "владеет" этим конкретным экземпляром формы. Вы ограничиваете область, в которой можно получить доступ к данным, и разместить их там, где они нужны, и место, в котором они есть, а не "везде".
Я обычно объявляю свою переменную в program.cs в вашей ситуации, и достигаю ее из любого места как Program.xxx. но вам нужен не публичный способ достижения переменной...
Аххааа, другой способ заключается в следующем. когда вы создаете форму из другой формы. Запишите перегруженный конструктор для второй формы и передайте параметры этому конструктору. лайк:
Form2 frm = new Form2(myParameter);