我对C#很陌生,想知道处理通用数据的正确方法(不浪费任何资源)。
我有一个BindingList,用来绑定dataGridView.DataSource。
下面是更新Data值的示例代码。问题是把 "计算代码 "放在getter还是setter中更有效率。
如果有一种方法被认为是 "最佳实践",也请告诉我。
public class Data : INotifyPropertyChanged
{
private float number;
public string Code
{
get => Number; // get => Number / 100 which one is more efficient?
set { Number = value / 100; OnPropertyChanged(); }
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string name = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}
......在那里 数据 类是这样使用的。
public partial class Form1 : Form
{
private BindingList<Data> dataList = new BindingList<Data> { new Data { Code = "1" } };
protected override void OnHandleCreated(EventArgs e)
{
// When main form is ready to handle messages the binding happens.
base.OnHandleCreated(e);
myDataGridView.DataSource = dataList;
myDataGridView.Columns["Code"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
}
public Form1()
{
InitializeComponent();
}
}
问:"问题是到底要不要把 "计算代码 "放到getter上。"
答:简答。做一次计算,在... 设置 而不是每次 得到.
答案很长。
我注意到你的 "代码 "属性是 绳子 但基本价值似乎是一个 浮动. 没关系,但我有几点优化建议。
要触发PropertyChanged事件,我建议使用这里的表单:使用 名称 关键词,并使OnPropertyChanged成为protected虚拟的,这样继承类也可以启动该事件。
当然这只是我的观点,但我会在setter中进行一次计算,而不是在getter中。但如果是以float存储,我会在getter中做ToString()。
我不认为在setter中进行短时的计算有什么坏处。如果是某种长期运行的任务来进行计算,可以考虑使用方法来代替,并且可能以Task的方式异步进行。
public string Code
{
get => _number.ToString(); // 'Some' inefficiency here, but probably storing as float is preferred.
set
{
// I would offer that doing this ONCE in the setter
// is more efficient than calculating on every get.
float floatValue = float.Parse(value); // Warning: Will throw exception
// is value if unparsable input string
_number = floatValue / 100;
// Preferred form here is to use the 'nameof' keyword
OnPropertyChanged(new PropertyChangedEventArgs(nameof(Code)));
}
}
// I suggest some other notation than 'Number' because this
// is a private field and when you say 'Number' the expectation is
// a public property. I see this notation often in Google source code
// to indicate a 'private field' and have adopted it myself:
private float _number;
public event PropertyChangedEventHandler PropertyChanged;
// This is customarily 'protected virtual'
protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChanged?.Invoke(this, e);
}
由于很多事情都与 "样式点 "有关,所以除了我自己的观点之外,还有其他的观点。我相信有足够的实质内容,有理由把这个答案贴出来,希望能为你问的事情提供一些见解。