c#表单和不可变类

本文关键字:不可变 表单 | 更新日期: 2023-09-27 18:01:22

我理解如何以及为什么创建不可变的类,然而,同样的规则是否适用于WinForms和Subforms?请允许我详细说明。

主要形式:

private void addNewEmployeeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            int empcount = (comboEmail.Items.Count - 1);
            Employee retrive = null;

            using (Add addEmp = new Add(empcount))
            {
                DialogResult dr = new DialogResult();
                addEmp.FormBorderStyle = FormBorderStyle.FixedDialog;
                dr = addEmp.ShowDialog();
                if (dr == DialogResult.OK)
                {
                    retrive = addEmp.GetEmployee;
                    addtoTextFileCombo(retrive);
                }
            }

        }

子表单:

public partial class Add : Form
    {
        public Employee GetEmployee {get; private set;}
        public int CreateId { get; private set; }
        public Add(int id)
        {
            InitializeComponent();
            this.CreateId = id;

        }
        private void btnAdd_Click(object sender, EventArgs e)
        {
            try
            {
                this.CreateId++;
                this.GetEmployee = new Employee(CreateId, txtFirstName.Text, txtLastName.Text, txtEmail.Text);
                this.DialogResult = DialogResult.OK;
            }
            catch (ArgumentNullException msg)
            {
                MessageBox.Show(msg.Message);
            }
        }
    }

在我的子表单中,我使用getter/setter属性来创建Employee对象并将其传递回主表单。在我的子表单中使用Getter/Setter是可以的吗?

在创建不可变类时,使用只读变量并使用构造函数来设置它们。你根本不用setter,即使它是私有的。在这个例子中,Employee是不可变的。

我所做的是坏习惯吗?如果是这样,我如何修复它而不失去我现在拥有的任何功能。

c#表单和不可变类

我不认为这是不好的做法。我们经常使用微软自己的OpenFileDialog(及其姊妹对话框),允许您调用ShowDialog(),一旦用户选择一个文件并单击OK按钮(实际上是打开或保存),子表单(对话框)就会消失,我们仍然可以访问FileName属性以获得所选文件的名称。因此,这似乎是一种标准做法。

对象的可变性应该根据业务规则/流程来决定,或者从它所代表的对象继承。

表单本身不是来自应用程序域的对象的表示;它仅仅是可视化这些对象和/或与这些对象交互的一种方式(通过有界控件修改对象状态和/或删除/创建对象)。因此,表单永远不应该是不可变的——它具有与应用程序域无关的状态,并且该状态可以并且将会在您无法强制执行的情况下更改。

作为此类属性的示例,您有Position,每当用户移动窗口时都会发生变化,Location等等…