C# C:在没有参数的情况下,函数上的条件是什么?
我正在使用一个API,该API使用使用out参数的函数。我想在while循环中使用其中一个out参数中的值。例如: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; //
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