Member 13462842 Ответов: 3

Где создать экземпляр в winform?


Привет, я изучаю C#, у меня есть простой математический класс, который я хотел бы использовать в Winform.
это работает, но что-то не ясно.

Это нормально или обычно создавать экземпляры здесь?

private void button1_Click(object sender, EventArgs e)
     {
         MathClass obj = new MathClass(x, y);
         textBox3.Text = obj.Add().ToString();
     }



class MathClass
    {
        private int _x;
        private int _y;

      public MathClass(int x,int y)
        {
            _x = x;
            _y = y;
        }
      public int Add()
        {
            return _x + _y;
        }
    }


Что я уже пробовал:

Я пытаюсь создать экземпляр :
1. вне метода button1_Click, но внутри частичного класса Form1, он показывает ошибку.
public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }

       int x = 0;
       int y = 0;

       MathClass obj = new MathClass(x, y);


2. внутри
private void InitializeComponent()

ошибки нет, но obj больше не может использовать внутреннюю форму Form1.

3 Ответов

Рейтинг:
25

OriginalGriff

Не добавляйте его в InitializeComponent: то есть для подготовки элементов управления и тому подобного, которые управляются дизайнером Visual Studio - как правило, вам вообще не нужно их редактировать.
Это совершенно справедливо:

private void button1_Click(object sender, EventArgs e)
     {
         MathClass obj = new MathClass(x, y);
         textBox3.Text = obj.Add().ToString();
     }
И мы создаем экземпляры объектов все время:
private void button1_Click(object sender, EventArgs e)
     {
         SaveFileDialog sfd = new SaveFileDialog();
         if (sfd.ShowDialog() == DialogResult.OK)
         {
             SaveFile(sfd.FileName);
         }
     }
но для именования может потребоваться некоторая работа: "obj" - это не очень хорошее название для чего-либо, поскольку оно подразумевает, что вы не знаете, что это за тип:
MathClass mc = new MathClass(x, y);
textBox3.Text = mc.Add().ToString();

Вы не можете сделать это так вне метода:
public Form1()
{
    InitializeComponent();
}

int x = 0;
int y = 0;

MathClass obj = new MathClass(x, y);
потому что создание объекта MathClass зависит от других переменных (x и y), и нет никакой гарантии, что они были инициализированы, когда он пытается создать экземпляр. Подумай об этом - что, если бы ты сделал это:
int x = y + 2;
int y = z - 3;
int z = 9;
Это требует, чтобы z был создан и инициализирован до x, что не очевидно, если вы сначала не прочитаете y!
Инициализация уровня класса должна быть простой: все более сложное должно быть в конструкторе формы, который ios выполняет только после завершения инициализации "базовой переменной".


Рейтинг:
19

BillWoodruff

Я думаю, что ваш дизайн нуждается в повторной работе: не должно быть никакой необходимости создавать экземпляр класса не раз чтобы вызвать его методы:

class MathClass
{
        public MathClass(){}
        
        public int Add(int x, int y))
        {
            return x + y;
        }

        public int Sub(int x, int y))
        {
            return x - y;
        }
}
Использование: Я предполагаю,что вам нужно получить ваши значения x, y из двух текстовых полей:
// in the Form
MathClass mathClassInstance = new MathClass();
'
// in the Buttom Click Event
private void button1_Click(object sender, EventArgs e)
{
    int x, y;
    
    if (Int32.TryParse(textBox1.Text, out x))
    {
        if (Int32.TryParse(textBox2.Text, out y))
        {
            textBox3.Text = mathClassInstance.Add(x, y).ToString();
            return;
        }
    }

    throw new ArgumentException("Bad input");
}


Richard Deeming

Для методов, которые не используют никаких членов экземпляра, не должно быть никакой необходимости создавать экземпляр класса вообще чтобы призвать их. :)

static class MathClass
{
    public static int Add(int x, int y) => x + y;
    public static int Sub(int x, int y) => x - y;
}

BillWoodruff

@richarddeeming

Привет, Ричард, я думал о том, чтобы показать OP статический класс, а также о том, чтобы показать класс, не определенный как статический, который предоставляет статические методы. Я решил сделать его проще, основываясь на своем чувстве уровня, на котором находится операция.

твое здоровье, Билл

Рейтинг:
1

Christian Graus

Вы не можете передавать параметры вне метода. Объявите его там, где вы находитесь, вне метода, и создайте его в конструкторе