C#
Как использовать класс на других формах в C#
Чтобы использовать один класс на разных формах в C#, вынесите класс в отдельный файл, сделайте его public, проверьте namespace и создавайте объект там, где он нужен. Если формы должны работать с одним и тем же объектом, передавайте этот объект через конструктор, а не создавайте случайные копии
Создайте общий класс
Например, у вас есть корзина:
public class CartService
{
private readonly List<string> _items = new();
public void Add(string title)
{
_items.Add(title);
}
public int Count => _items.Count;
}
Сохраните класс в отдельном файле CartService.cs. Обычно он лежит в том же проекте, что и формы
Проверьте namespace
Если класс и формы находятся в одном пространстве имен, дополнительных действий может не понадобиться. Если в разных, добавьте using:
using MyShop.Services;
Ошибка The type or namespace name could not be found часто означает, что файл не добавлен в проект, класс не public или не подключен нужный namespace
Использование на одной форме
private readonly CartService _cart = new();
private void addButton_Click(object sender, EventArgs e)
{
_cart.Add(productTextBox.Text);
countLabel.Text = _cart.Count.ToString();
}
Так форма хранит объект сервиса и вызывает его методы
Где должен лежать код класса
Не пишите общий класс внутри файла формы, если он нужен в нескольких местах. Технически вложенные классы возможны, но для учебного и рабочего проекта понятнее отдельный файл: CartService.cs, OrderCalculator.cs, UserSettings.cs. Тогда класс легче найти, переиспользовать и подключить к другой форме без копирования кода
Если класс отвечает за расчеты или хранение данных, он не должен знать про кнопки и Label. Форма вызывает класс, а не наоборот. Это помогает не смешивать интерфейс и логику
Один объект на двух формах
Если Form1 и Form2 должны работать с одной корзиной, создайте объект в Form1 и передайте во вторую форму:
private readonly CartService _cart = new();
private void openButton_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2(_cart);
form2.Show();
}
В Form2:
public partial class Form2 : Form
{
private readonly CartService _cart;
public Form2(CartService cart)
{
InitializeComponent();
_cart = cart;
}
private void addButton_Click(object sender, EventArgs e)
{
_cart.Add("Товар из второй формы");
}
}
Теперь обе формы работают с одним объектом, а не с двумя разными корзинами
Нужно ли static
static кажется быстрым решением: сделал общий класс и обращайся откуда угодно. Но для состояния приложения это часто приводит к путанице. Данные трудно сбросить, тестировать и контролировать. Для учебного WinForms-проекта лучше передавать объект явно. Так видно, какая форма от чего зависит
static нормально подходит для чистых вспомогательных методов, например форматирования строки. Но для корзины, пользователя, заказа, настроек и выбранных данных обычно нужен обычный объект
Частые ошибки
Первая ошибка — создать класс в файле, но оставить его internal или в другом namespace. Вторая — создавать новый объект класса на каждой форме и удивляться, почему данные не общие. Третья — делать все поля публичными. Четвертая — использовать static для всего приложения без причины
Мини-задача: создайте класс CounterService с методом Increment() и свойством Value. Передайте один объект CounterService в две формы. На каждой форме сделайте кнопку увеличения и проверьте, что счетчик общий
Что почитать дальше по C#
- Классы и свойства в C#: первый пример
- List, Dictionary и LINQ в C#
- C# и .NET Framework: что выбрать новичку
- Рубрика C#
Что почитать дальше по C#
Если нужен общий маршрут по теме, откройте рубрику C#. Для соседних задач пригодятся эти разборы:
- C# с нуля: первый проект через dotnet new
- Как создать форму в си шарп: первый Windows Forms пример
- Как установить .NET SDK для C#
- Классы и свойства в C#: первый пример