在setter中更改value关键字是错误的吗?

问题描述 投票:4回答:2

我有一个需要用旧值处理新值的setter。但是,如果该值<0.1,则需要将其设置为0.1。

我可以基于value关键字创建一个newValue变量,但这看起来有点浪费,在处理部分内,并不是很明显newValue是什么。

同样,如果我查看代码,我会期望“值”是传递给setter而不是被操作的东西。

写这个的最好方法是什么,使用newValue或value关键字?

public double NumberValue
{
    get => _numberValue;
    set
    {
        if (value < 0.1) value = 0.1;

        var multiplier = value / _numberValue;
        foreach (var item in Items)
        {
            item.SomeValue = item.SomeValue * multiplier;
        }
        _numberValue = value;
    }
}

我的方法最终得到了这个更简洁的解决方案

public double NumberValue
{
    get { return _numberValue; }
    set
    {                
        var newValue = Math.Max(0.1, value);
        ProcessValues(newValue);
        _numberValue = newValue;        
    }
}
c#
2个回答
5
投票

这就是我要做的事情:

public double NumberValue
{
    get => _numberValue;
    set
    {
        _numberValue = value < 0.1 ? 0.1 : value;
    }
}

@Matthew在评论中提出的另一种方法是使用Math.Max

public double NumberValue
{
    get => _numberValue;
    set
    {
        _numberValue = Math.Max(0.1, value);
    }
}

3
投票

从技术上讲,这无关紧要。关于可读性有什么不同。

在这里,我可能自己做_numberValue = value < 0.1 ? 0.1 : value;,因为所有的逻辑都很明确,这个相当惯用的陈述涵盖了一切。

如果逻辑更复杂,那么我可能更喜欢覆盖value或者我可能更愿意根据它变得多复杂来声明一个新变量。特别是如果有一页以上的代码,我可能会喜欢一个新的变量,所以在查看二进制文件底部的value被覆盖时,我不太清楚。

赞成覆盖也是将value夹在一个范围内的问题。一些更多断开连接的可能的覆盖使用不会像可读的那样。

与所有可读性问题一样,没有一个完美的答案,并且在简短的可读性优势和简洁的可读性优势之间始终存在紧张关系。

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