C# while语句中的三元表达式是否在每个循环中求值

C# while语句中的三元表达式是否在每个循环中求值,c#,C#,我有一个简单的循环来计算两个数字的hcf,以抵消一个分数 我想知道while条件中的三元表达式是否会在每个循环中重新计算,因此应该在计算之前计算一次,并作为一个变量存储以提高性能 public Fraction LowestForm() { int hcf = 1; int counter =2; while (counter <= (Numerator < Denominator ? Nume

我有一个简单的循环来计算两个数字的hcf,以抵消一个分数

我想知道while条件中的三元表达式是否会在每个循环中重新计算,因此应该在计算之前计算一次,并作为一个变量存储以提高性能

 public Fraction LowestForm()
        {
            int hcf = 1;
            int counter =2;
            while (counter <= (Numerator < Denominator ? Numerator : Denominator))
            {
                if (Numerator % counter == 0 && Denominator % counter == 0)
                {
                    hcf = counter;
                }  
                counter++;
            }
            return new Fraction(Numerator / hcf, Denominator / hcf);
        }
公共分数最低形式()
{
int-hcf=1;
int计数器=2;

while(counterYes,否则while语句如何知道何时完成?它需要在每次迭代中重新计算表达式的整体,以便知道何时可以退出循环


也就是说,当CIL被创建时,它很可能会在循环外对其进行优化。

是的,否则while语句如何知道何时完成?它需要在每次迭代中重新计算表达式的整体,以便知道何时可以退出循环


也就是说,当CIL被创建时,它很可能在循环外对其进行优化。

实际上这取决于。如果有任何表达式(或任何子表达式,特定类型的子表达式并不重要,并且子表达式的位置,即在循环条件下或在循环体内部也不重要)不依赖于在循环中修改的变量,可以从循环中移出并只计算一次,优化器会这样做。C#有非常好的优化器

在调试生成中,不会优化任何内容。将重新计算每个表达式


作为首要任务,我建议您提高代码的清晰度和可读性。除此之外,尽量减少开发工作代码的时间。您只需要在关键代码段或当您看到优化器由于某种原因工作不好时,才需要帮助优化器。这种情况很少发生,但有时会发生。

实际上这取决于s、 如果任何表达式(或任何子表达式,子表达式的特定类型不重要,并且子表达式的位置,即在循环条件下或循环体内部也不重要)不依赖于在循环中修改的变量,可以从循环中移出并只计算一次,优化器会这样做。C#有非常好的优化器

在调试生成中,不会优化任何内容。将重新计算每个表达式



作为第一要务,我建议您提高代码的清晰度和可读性。除此之外,尽量减少开发工作代码的时间。您只需要在关键代码段或当您看到优化器由于某种原因工作不好时,才需要帮助优化器。这种情况很少发生,但有时会发生。

即使编译器没有这样做不要优化抖动(我认为)C#是否只有一个编译器?如果没有,那么这个问题的答案不取决于使用的是哪一个编译器吗?为了以防万一,不妨提一下。@Rainbolt该行为在语言规范中有定义,该语言的任何编译器都有义务遵守它,以便将其视为C#编译器。@Servy the beh在本例中,无论表达式是在循环外解析一次还是在循环内解析多次,avior都是完全相同的。@Rainbolt除非它们是常量,否则它基本上无法证明这一点。命名约定表明它们是属性,而不是字段,所以我们甚至不知道这些属性获取程序是什么他们可能使用随机数生成器在每次调用时返回不同的值,即使编译器没有优化,抖动也可以(我认为)C#是否只有一个编译器?如果没有,那么这个问题的答案不取决于使用的是哪一个编译器吗?为了以防万一,不妨提一下。@Rainbolt该行为在语言规范中有定义,该语言的任何编译器都有义务遵守它,以便将其视为C#编译器。@Servy the beh在本例中,无论表达式是在循环外解析一次还是在循环内解析多次,avior都是完全相同的。@Rainbolt除非它们是常量,否则它基本上无法证明这一点。命名约定表明它们是属性,而不是字段,所以我们甚至不知道这些属性获取程序是什么做。他们可能会使用随机数生成器在每次调用时返回不同的值。但是,这是一种良好的做法,您自己做而不是依赖于优化器吗?此外,我添加了计数器递增器!很好!@JamesHughes依赖于优化器?将所有这些放在一行中有什么好处?我想如果你定义了局部变量,它的可读性会更好。不要担心你定义的额外变量。它不会伤害任何人body@M.kazemAkhgary您可以在循环内部定义变量,这样就不会解决James Hughes的评论问题l计算一次,使代码更可读。如果
分子
分母
是编译时常量,则是,编译器可以在编译时执行该操作,但如果不是(它们看起来像基于命名约定的属性)它是一个编译器,从某种意义上说,它正在将一种语言编译成另一种语言。它不是一个C编译器,因为它不是在编译C代码。MS C编译器将C代码编译成MSIL代码,运行时是一个与C编译器完全分离的实体,它编译这些代码当程序运行时,输入机器代码。这是一个很好的实践,而不是依赖优化器吗?另外,我添加了计数器递增器!很好!@JamesHughes依赖优化器?将所有这些都放在一行中有什么好处?如果定义local,可读性会更好