Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 访问对象的性能/代码可读性';s字段与制作副本_C#_Performance_Coding Style - Fatal编程技术网

C# 访问对象的性能/代码可读性';s字段与制作副本

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

我很难准确地解释我在标题中的意思,因此我将立即提供代码示例

看看下面的C代码:

在上面的示例中,我决定将
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);
    }
}
考虑到性能和可读性这两个因素,我想知道哪种风格更受欢迎/推荐

  • [Performance]在第二个示例中,编译器是否足够聪明,注意到只有一个线程才能访问
    giveway
    对象,因此访问
    giveway.CreatorID
    不必在每次调用时解析,而只需在第一次调用时解析?在性能方面,是否有使用第一种或第二种方法的建议?我知道类似的事情也在做,例如在
    for
    循环中,当我们使用字符串的
    Length
    属性时(当编译为CIL时,字符串的长度只计算一次)。若编译器并没有足够的智能来实现这一点,那个么最好将其存储在变量中
  • [可读性]您希望使用哪种方式?选择是否取决于我们访问给定字段的次数?如果该字段被访问2次或更多次,我倾向于复制它。错了吗?那么一条很长的“链”呢,比如
    giveaway.CreatorID.acgregations.Count
  • 在决定是否采用第一或第二种方法之前,我还有其他的因素要考虑吗?也许我问的根本不重要,因为答案应该是显而易见的 很抱歉,如果我所问的完全是胡说八道,这一点都不重要,但我不时地喜欢听到其他程序员对给定主题的看法,这样我可以在将来改进我的代码风格。目前,如果该字段被访问超过1次,我倾向于复制它,但我不知道它是必需的(从性能方面),还是推荐的(从代码可读性方面)


    提前感谢。

    使用临时变量作为微观优化没有意义,但作为可读性改进确实有意义

    除非
    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);
        }
    }