我正在使用使用out
参数的函数的API。我想在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。
答案 0 :(得分:5)
您不能直接执行任何操作,方法调用的返回值是while
将使用的值,而不是您想要的值。如果这导致问题,您可以始终包装方法调用:
int wrappedGetCounterValue()
{
int i;
getCounterValue(out i);
return i;
}
或者使用C#7:
int wrappedGetCounterValue()
{
getCounterValue(out int i);
return i;
}
并在while
循环中使用它。
while (wrappedGetCounterValue() < 10)
....
答案 1 :(得分:3)
do
{
getCounterValue(out checkVal);
Console.WriteLine("Still waiting.");
} while (checkVal < 10)
答案 2 :(得分:2)
你可以使用带有中断条件的无限循环:
push()
注意 while (true)
{
int checkVal;
getCounterValue(out checkVal);
if (10 <= checkVal)
break;
Console.WriteLine("Still waiting.");
}
选项之间的区别在于,如果第一个计数器值大于或等于10,则不会输出do..while (checkVal < 10)
消息。您不能使用{ {1}}循环,除非您将复制循环中断条件"Still waiting"
。
答案 3 :(得分:1)
另一种选择(但代码重复的代价)是使用for
循环:
int checkVal;
for (getCounterValue(out checkVal); checkVal < 10; getCounterValue(out checkVal))
{
Console.WriteLine("Still waiting.");
}
Console.WriteLine("Done.");
答案 4 :(得分:0)
如果要完全隐藏out
功能,必须使用包装器方法。如果您只关心“有效”值并且有效性由<10
表达式明确定义,那么您可以隐藏该包装中的<10
表达式,并在您的Nullable<int>
中使用static int counter = 0;
static void getCounterValue(out int val)
{
val = counter;
counter++;
}
static Nullable<int> getValidCounterValue()
{
int outResult;
getCounterValue(out outResult);
if (outResult < 10)
{
return null;
}
else
{
return outResult;
}
}
static void Main()
{
Nullable<int> checkVal = new Nullable<int>();
while (!checkVal.HasValue)
{
checkVal = getValidCounterValue();
Console.WriteLine("Still waiting.");
}
Console.WriteLine("Done. Valid value is:" + checkVal.Value.ToString());
}
码。这在语义上是正确的。
var findParentByClassName = function(element, targetClass) {
if (element) {
element.parentElement === null;
console.log("No parent found");
} if else {
element.parentElement !=== targetClass;
console.log("No parent found with that class name");
} else {
var currentParent = element.parentElement;
while (currentParent.className !== targetClass && currentParent.className !== null) {
currentParent = currentParent.parentElement;
}
return currentParent;
}
};