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是不可变的。
我所做的是坏习惯吗?如果是这样,我如何修复它而不失去我现在拥有的任何功能。
我不认为这是不好的做法。我们经常使用微软自己的OpenFileDialog
(及其姊妹对话框),允许您调用ShowDialog()
,一旦用户选择一个文件并单击OK按钮(实际上是打开或保存),子表单(对话框)就会消失,我们仍然可以访问FileName
属性以获得所选文件的名称。因此,这似乎是一种标准做法。
对象的可变性应该根据业务规则/流程来决定,或者从它所代表的对象继承。
表单本身不是来自应用程序域的对象的表示;它仅仅是可视化这些对象和/或与这些对象交互的一种方式(通过有界控件修改对象状态和/或删除/创建对象)。因此,表单永远不应该是不可变的——它具有与应用程序域无关的状态,并且该状态可以并且将会在您无法强制执行的情况下更改。
作为此类属性的示例,您有Position
,每当用户移动窗口时都会发生变化,Location
等等…