Recall方法,直到返回true

本文关键字:返回 true 方法 Recall | 更新日期: 2023-09-27 17:50:54

我有一个条件,我想调用一个方法,直到它返回true,如果返回true,则转到下一个语句,否则调用它自己

     var username= GetUniqueUserName();
     if(UtilityRepository.CheckUserName(username))
     {
                   // next statement
     }
     else
     {
      // recall CheckUser               
     }

Recall方法,直到返回true

您可以

while(UtilityRepository.CheckUserName(username))
{
   //code inside, if you need some, if not just leave this blank
}

//something after `CheckUserName` returned false.

使用while而不是if。(而不是条件。(

使用递归实现:

public void MyMethod()
{
    var username= GetUniqueUserName();
    MyImplementation(username);
}
private void MyImplementation(string userName)
{
    if (!UtilityRepository.CheckUserName(username))
    {
        MyImplementation(userName);
        return;
    }
    //actual stuff here
}

正如@asawyer所指出的,使用迭代实现,您的应用程序可能会陷入一个无限循环,让一个线程永久地向UtilityRepository提出相同的问题。使用递归实现,您可能会遇到StackOverflowException。这两种情况都相当不令人满意。您能否升级UtilityRepository以在"用户名状态已更改"时收到通知?

var username= GetUniqueUserName();
while ( UtilityRepository.CheckUserName(username) )
{
    //recall user
}
// next statement

或收费更高,但具有相同的功能方式:

var username= GetUniqueUserName();
bool flag = true;
while ( flag )
{
     if(UtilityRepository.CheckUserName(username))
     {
          // next statement
          flag = false;
     }
     else
     {
          // recall CheckUser               
     }
}

但这看起来很可怕,我认为你应该把你的.CheckUserName方法分成两个或多个分开的方法,所以你不需要在// recall Chechuser上留空格。