C#在通用数据中使用getter和setter更新数据的正确方法(数据:INotifyPropertyChanged)。

问题描述 投票:0回答:1

我对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();
    }
}
c# datagridview getter-setter bindinglist
1个回答
1
投票

问:"问题是到底要不要把 "计算代码 "放到getter上。"

答:简答。做一次计算,在... 设置 而不是每次 得到.

答案很长。

我注意到你的 "代码 "属性是 绳子 但基本价值似乎是一个 浮动. 没关系,但我有几点优化建议。

  1. 很明显,输入的字符串 价值 属性设置器中的float.Parse()方法必须在某一时刻被解析,以便执行代码中显示的浮点计算。float.Parse()方法 将抛出一个硬性的Exception 就像这里写的那样。确保你在输入字符串中添加一些验证代码,如果不能被解析,则优雅地失败。
  2. 要触发PropertyChanged事件,我建议使用这里的表单:使用 名称 关键词,并使OnPropertyChanged成为protected虚拟的,这样继承类也可以启动该事件。

  3. 当然这只是我的观点,但我会在setter中进行一次计算,而不是在getter中。但如果是以float存储,我会在getter中做ToString()。

  4. 我不认为在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);
    }

由于很多事情都与 "样式点 "有关,所以除了我自己的观点之外,还有其他的观点。我相信有足够的实质内容,有理由把这个答案贴出来,希望能为你问的事情提供一些见解。

© www.soinside.com 2019 - 2024. All rights reserved.