C#:在带参数的函数条件下?

时间:2017-03-22 22:08:26

标签: c#

我正在使用使用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。

5 个答案:

答案 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;
}
};