C# 访问对象的性能/代码可读性';s字段与制作副本
我很难准确地解释我在标题中的意思,因此我将立即提供代码示例 看看下面的C代码: 在上面的示例中,我决定将C# 访问对象的性能/代码可读性';s字段与制作副本,c#,performance,coding-style,C#,Performance,Coding Style,我很难准确地解释我在标题中的意思,因此我将立即提供代码示例 看看下面的C代码: 在上面的示例中,我决定将giveaway.CreatorID作为局部变量进行复制,以省去每次访问对象时解析对象字段的需要。在最坏的情况下,它总共被访问了4次 也可以在不这样做的情况下编写上述内容: internal static async Task OnGroupGiveawayCreated(Giveaway giveaway) { if (giveaway == null) { retu
giveaway.CreatorID
作为局部变量进行复制,以省去每次访问对象时解析对象字段的需要。在最坏的情况下,它总共被访问了4次
也可以在不这样做的情况下编写上述内容:
internal static async Task OnGroupGiveawayCreated(Giveaway giveaway) {
if (giveaway == null) {
return;
}
if (giveaway.CreatorID == 0 || !await MySQL.UserExists(giveaway.CreatorID).ConfigureAwait(false)) {
return;
}
// Date
DateTime today = DateTime.Now;
if (today.Month == 9 && today.Day == 9) {
await MySQL.InsertAchievement(40, giveaway.CreatorID).ConfigureAwait(false);
await OnAchievementGot(giveaway.CreatorID).ConfigureAwait(false);
}
}
考虑到性能和可读性这两个因素,我想知道哪种风格更受欢迎/推荐
giveway
对象,因此访问giveway.CreatorID
不必在每次调用时解析,而只需在第一次调用时解析?在性能方面,是否有使用第一种或第二种方法的建议?我知道类似的事情也在做,例如在for
循环中,当我们使用字符串的Length
属性时(当编译为CIL时,字符串的长度只计算一次)。若编译器并没有足够的智能来实现这一点,那个么最好将其存储在变量中giveaway.CreatorID.acgregations.Count
提前感谢。使用临时变量作为微观优化没有意义,但作为可读性改进确实有意义 除非
Giveaway
是一个struct
,否则编译器不可能知道该对象仅由一个线程访问。但是,它不需要知道这一点,因为它假定无论如何都会发生这种情况:除非CreatorID
标记为volatile
,否则编译器保留只访问它一次的权利,并在后续调用中使用缓存副本。这是一个很长的说法“编译器足够聪明,可以为您制作一个副本”
制作命名副本的一个重要可读性结果是,它可以避免读者水平滚动。这是一件大事,因为水平滚动会降低读者的阅读速度。如果你能给一个变量起一个简短的名字而不至于发疯,那就努力吧。(
creatorID
很好;cid
可能不够描述性)。事实上Giveaway
是一个类,所以编译器不能假设它只能由一个线程访问。感谢您的想法,这对我决定保持制作这种本地副本的习惯以提高代码可读性有很大帮助。
internal static async Task OnGroupGiveawayCreated(Giveaway giveaway) {
if (giveaway == null) {
return;
}
if (giveaway.CreatorID == 0 || !await MySQL.UserExists(giveaway.CreatorID).ConfigureAwait(false)) {
return;
}
// Date
DateTime today = DateTime.Now;
if (today.Month == 9 && today.Day == 9) {
await MySQL.InsertAchievement(40, giveaway.CreatorID).ConfigureAwait(false);
await OnAchievementGot(giveaway.CreatorID).ConfigureAwait(false);
}
}