【问题标题】:Why my recursive function calling itself again after returning the value in c#?为什么我的递归函数在返回 c# 中的值后再次调用自身?
【发布时间】:2013-11-04 13:09:58
【问题描述】:

我在 C# 中有函数,这是:

public int checkUplinkID(string memID, string original_mem)
{
    string original_memID = original_mem;
    int retValue = 0;
    DataTable dt = new DataTable();
    using (SqlConnection mCon = new SqlConnection())
    {
        mCon.ConnectionString = ConStr;
        try
        {
            mCon.Open();
            using (SqlCommand mCom = new SqlCommand())
            {
                mCom.Connection = mCon;
                mCom.CommandText = "Get_UplinkID";
                mCom.Parameters.AddWithValue("@memID", memID);
                mCom.CommandType = CommandType.StoredProcedure;

                SqlDataAdapter da = new SqlDataAdapter(mCom);
                da.Fill(dt);
                if (dt.Rows.Count > 0 && retValue != 1)
                {
                    string n_upid = dt.Rows[0]["uplineId"].ToString();
                    if (n_upid.ToLower() == original_memID.ToLower())
                    {
                        retValue = 1;

                    }
                    else if( n_upid.ToLower() != original_memID.ToLower())
                    {
                        if (n_upid.ToLower() == "self")
                        {
                            retValue = 0;
                        }
                        else
                        {
                            checkUplinkID(n_upid, original_memID);  // its coming back here after returning and its returning '0' 
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            mCon.Close();
            mCon.Dispose();
        }
    }

    return retValue;

}

现在的问题是在 retValue = 1 之后它正在返回,但它会返回到 checkUplinkID 函数并生成 retValue = 0 并返回它。 那我该怎么办?

我在 aspx.cs 页面中调用此函数,如下所示:

 int getchk = iobj.checkUplinkID(memid, memberId); 

iobj 是该方法所在类的对象。

【问题讨论】:

    标签: c# function recursion


    【解决方案1】:

    您很可能希望将checkUplinkID 的返回值分配给retValue

    else
    {
        retValue = checkUplinkID(n_upid, original_memID);  // its coming back here after returning and its returning '0' 
    }
    

    哦,你的 catch 块的风格很糟糕:
    除了删除原始堆栈跟踪之外,它不会做任何事情,因此您将不知道异常最初源自何处。只需删除 catch 块即可。

    【讨论】:

      【解决方案2】:

      如果我理解正确,递归调用的结果不会被使用。您需要存储该值:

      retValue = checkUplinkID(n_upid, original_memID);
      

      否则不使用递归调用的结果,“最外层”方法调用的retValue保持为0。

      【讨论】:

        【解决方案3】:

        您忘记了递归的基本概念,即 BASE 案例,即递归停止并返回解决所有其他调用的地方。这就是你的递归没有停止的原因;

        【讨论】:

          猜你喜欢
          • 2022-11-10
          • 2020-03-29
          • 2021-03-26
          • 2014-08-11
          • 2021-11-13
          相关资源
          最近更新 更多