C# C:在没有参数的情况下,函数上的条件是什么?

C# C:在没有参数的情况下,函数上的条件是什么?,c#,C#,我正在使用一个API,该API使用使用out参数的函数。我想在while循环中使用其中一个out参数中的值。例如: static int counter = 0; static void getCounterValue(out int val) { val = counter; counter++; } static void Main() { // Right now, I'm having to do this: int checkVal = 0; //

我正在使用一个API,该API使用使用out参数的函数。我想在while循环中使用其中一个out参数中的值。例如:

static int counter = 0;

static void getCounterValue(out int val)
{
    val = counter;
    counter++;
}

static void Main()
{
    // Right now, I'm having to do this:
    int checkVal = 0; // I have to figure out an appropriate starting value.
    while (checkVal < 10) 
    {
        getCounterValue(out checkVal);
        Console.WriteLine("Still waiting.");
    }
    Console.WriteLine("Done.");
}

是否有更简单的语法来执行此操作?我想要一些更经典的东西,如while getCounterValue<10,但我必须处理out参数,因为它是一个我无法更改的API。

您不能直接执行任何操作,方法调用的返回值是while将使用的值,而不是您想要的值。如果这导致出现问题,则始终可以包装方法调用:

do
{
    getCounterValue(out checkVal);
    Console.WriteLine("Still waiting.");
} while (checkVal < 10)
int wrappedGetCounterValue()
{
   int i;
   getCounterValue(out i);
   return i;
}
或使用C7:

int wrappedGetCounterValue()
{
   getCounterValue(out int i);
   return i;
}
在你的while循环中使用它


您不能直接执行任何操作,方法调用的返回值是while将使用的值,而不是您想要的值。如果这导致出现问题,则始终可以包装方法调用:

int wrappedGetCounterValue()
{
   int i;
   getCounterValue(out i);
   return i;
}
或使用C7:

int wrappedGetCounterValue()
{
   getCounterValue(out int i);
   return i;
}
在你的while循环中使用它


可以使用带中断条件的无限循环:

while (true)
{
   int checkVal;
   getCounterValue(out checkVal);
   if (10 <= checkVal)
      break;

   Console.WriteLine("Still waiting.");
}

注意do..while checkVal<10选项之间的区别在于,如果第一个计数器值大于或等于10,则不会输出仍在等待的消息。除非复制循环中断条件checkVal<10,否则无法使用do..while循环执行此操作。

您可以使用无限循环中断条件:

while (true)
{
   int checkVal;
   getCounterValue(out checkVal);
   if (10 <= checkVal)
      break;

   Console.WriteLine("Still waiting.");
}

注意do..while checkVal<10选项之间的区别在于,如果第一个计数器值大于或等于10,则不会输出仍在等待的消息。使用do..while循环无法执行此操作,除非您将复制循环中断条件checkVal<10。

另一个选项,但以代码复制为代价,用于循环:


另一种选择是使用for loop,但会产生代码复制成本:



如果要完全隐藏out功能,必须使用包装器方法。如果您只关心有效值,并且有效性由定义良好如果您想要完全隐藏out功能,则必须使用包装器方法。如果您只关心有效值,并且有效性是由@fdmillion定义的,那么如果对getCounterValue的第一次调用输出10呢?您是否仍要打印仍在等待?while和do-while在功能上并不等效-后者总是至少有一次执行。@juharr-它基本上与OP的代码相同…总是有一次执行。这只是删除了checkVal的第一个赋值。原始示例输出“仍在等待”如果第一次调用getCounterValue输出10。@RufusL我猜这只是一个简单的例子,我想指出立即检查值的while循环和至少执行一次的do-while循环之间的区别。@fd000000如果第一次调用getCounterValue输出10怎么办?您是否仍要打印仍在等待?while和do-while在功能上并不等效-后者总是至少有一次执行。@juharr-它基本上与OP的代码相同…总是有一次执行。这只是删除了checkVal的第一个赋值。原始示例输出“仍在等待”如果对getCounterValue的第一次调用输出10。@RufusL我猜这只是一个例子,我想指出while循环和do-while循环之间的区别,while循环将立即检查值,do-while循环将至少执行一次。因为I是out参数,它必须被删除,但不必由调用方初始化。从VS2017开始,您可以就地声明参数:getCounterValueout int i;。因为i是一个out参数,所以它必须被删除,但不必由调用者初始化。从VS2017开始,您可以就地声明参数:getCounterValueout int i;。边做边做是首选的方式。“看阴沉沉的高拱门的回答。”奥利维耶雅科特·德斯康布斯,我已经看到了。阅读答案中的注释我的方式是否可取取决于对@juharr问题的回答。我的意思是:使用while true并使用break作为其内部的最后语句是没有意义的,当你可以写do{…}而checkVal@OlivierJacot Descombes同意时,这个答案的全部要点是省略第一个循环中仍在等待的消息。我现在已经讲清楚了。谢谢,多谢你,多谢你。“看阴沉沉的高拱门的回答。”奥利维耶雅科特·德斯康布斯,我已经看到了。阅读答案中的注释我的方式是否可取取决于对@juharr问题的回答。我的意思是:使用while true并使用break作为其内部的最后语句是没有意义的,当你可以写do{…}而checkVal@OlivierJacot Descombes同意时,这个答案的全部要点是省略第一个循环中仍在等待的消息。我现在已经讲清楚了。API void中方法的返回类型是什么?我知道这是在你们的例子中,但这个例子可能不符合实际情况。你们的API中方法的返回类型是void吗?我知道这是在你们的例子,但例子可能不符合实际情况 ly