在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
}
}
有人告诉我第一种方法更有效。这是真的?在字节上使用布尔值有任何不利之处吗?
答案 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;
答案是它被翻译成相同的汇编代码