Bytevs boolean for OrderBy

时间:2019-05-06 21:15:11

标签: linq sorting boolean byte ienumerable

在bool上使用字节进行排序是否对性能有好处?

例如,给出一些代码:

var foo = items.OrderByDescending(item => item.SomeProperty);

获得SomeProperty值的现有代码为:

public byte SomeProperty
{
    get
    {
        if (a == b)
            return 1;
        else
            return 0;
    }
}

我想将其重构为:

public bool SomeProperty
{
    get 
    {
        a == b
    }
}

有人告诉我第一种方法更有效。这是真的?在字节上使用布尔值有任何不利之处吗?

1 个答案:

答案 0 :(得分:1)

效率几乎不会影响处理效率。开发代码的效率会更高:代码易于理解吗?易于重复使用类似物品?如果内部结构在不更改界面的情况下进行更改,是否易于更改?容易测试吗?

设计房屋时,您的第一个问题应该是:我的房屋代表什么?这是什么意思?它是否具有用户期望的标识符和类型,还是因为他们不知道它的含义而不得不在文档中查找?

例如,如果您有一个表示可持久性的类(例如文件),并且发明了一个属性,那么该属性将更易于理解:

class Persistable
{
    public int IsPersisted {get;}
    public bool IsPersisted {get;}
    ...

读者会立即知道哪个意思?

因此,到目前为止,关于持久性的想法可以有两个值,分别表示“尚未持久”和“持久”。一个布尔值就足够了。但是,如果您预见到在不久的将来,关于持久性的想法将会改变,例如,可持久性可以是“尚未持久”,“持久”,“在持久后更改”,“删除”。如果您预见到这一点,则必须决定是否最好退还布尔值。也许您应该返回一个枚举:

public PersistencyState State {get;}

结论设计属性和方法的标识符和类型,以使用户的学习曲线较低,并且可预见的更改不会产生重大影响。确保属性易于测试和维护。在极少数情况下,可移植性是一个问题。

这些项目比两次代码更改对您的效率影响更大。

返回您的问题

如果您考虑SomeProperty代表什么,并且认为:它代表a和b相等,则应使用:

公共布尔EqualAB => a == b

如果您的问题是应该使用“ get”还是=>,则第一个将调用类似的子例程,而第二个方法将插入代码。如果=>之后的部分很大,并且您在数百个位置上使用了它,那么您的代码将变得更大。

但是再说一遍:如果您的收益确实很大,应该将其设为财产吗?

public string ElderName
{
    get
    {
        myDataBase.Open()
        var allCustomers = myDataBase.FetchAllCustomers().ToList();
        var eldestCustomer = this.FindEldestCustomer(allCustomers);
        return eldestCustomer.Name;
    }
}

如果在1000个位置上使用=>表示法,这将对代码大小产生公平的影响。但老实说,将其放在属性而不是方法中的设计人员不应该获得有效的代码。

最后,我在这里在stackoverflow中问是否有区别:

string Name {get => this.name;}
string Name => this.name;

答案是它被翻译成相同的汇编代码