返回布尔值和错误消息C#

时间:2016-12-27 11:25:58

标签: c# methods

我是C#的一个非常新的开发人员,我在创建DLL时遇到了一些问题。我需要创建一个DLL,外部系统将使用它从我的数据库中检索一些信息。基本上,他们会向我发送一个ID,我需要发回相关的信息。这是我的代码:

public bool GetLotInfo (string SupplierCode, out stLotInfo LotInfo, out string ErrorMessage)
{
  //collect info
}

如何返回字符串ErrorMessage,因为该方法是Bool?

4 个答案:

答案 0 :(得分:3)

查看您的方法签名,只需设置它:

public bool GetLotInfo (string SupplierCode, out stLotInfo LotInfo, out string ErrorMessage)
    {
      //collect info
//Oops, error:
ErrorMessage = "Something bad happened";
    }

这是有效的,因为ErrorMessage被声明为out参数。

答案 1 :(得分:2)

只需分配

public bool GetLotInfo (string SupplierCode, out stLotInfo LotInfo, out string ErrorMessage)
{
    //collect info

    // LotInfo is out parameter and must be assigned...
    LotInfo = new stLotInfo(...);

    // ... as well as ErrorMessage 
    ErrorMessage = "My Message";

    return true;     
}

...

stLotInfo myLotInfo;
string myMessage;

if (GetLotInfo("MyCode", out myLotInfo, out myMessage)) {
    //TODO: Put a relevant code with myLotInfo and myMessage 
}

答案 2 :(得分:2)

out参数是ref参数的特例;它们通过引用传递,并且必须在方法返回之前设置。您可以详细了解他们herehere

在您的情况下,可能的实施草图将是:

public bool GetLotInfo(string supplierCode, out StLotInfo lotInfo, out string errorMessage)
{
    try
    {
        lotInfo = ... //whatever you need to do
        errorMessage = null;
        return true;
    }
    catch (MyExpectedException e) //Put here the specific exceptions you are expecting,
                                  //Try to avoid catching the all encompassing System.Exception
    {
        errorMessage = e.Message;
        lotInfo = null;
        return false;
    }
    finally
    {
        //any clean up you need to do.
    }
}

另外,作为补充建议,请尝试遵循c#命名准则:

  1. 类应该是驼峰式的,第一个字母应该是大写的:StLotInfo而不是stLotInfo
  2. 参数和参数应该是驼峰式的,第一个字母应该是小写的:supplierCode而不是SupplierCodeerrorMessage而不是ErrorMessage等。
  3. 除非经常使用和接受,否则请尽量避免缩写:St中的StLontInfo是什么?

答案 3 :(得分:0)

在C#7.0中,你也可以使用元组:

var result = GetLotInfo("test");
WriteLine($"Success: {result.success}");
WriteLine($"Message: {result.message}");
WriteLine($"Lot: {result.lotInfo}");

方法调用:

Handler mHandler;

private void loopMocking(){
    mHandler.post(mMockRunnable);
}

private Runnable mMockRunnable = new Runnable() {
    @Override
    public void run() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            newLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
        }

        newLocation.setTime(System.currentTimeMillis());
        lm.setTestProviderLocation(LocationManager.GPS_PROVIDER, newLocation);

        mHandler.postDelayed(mMockRunnable, 1000); // At each 1 second
    }
};

查看有关元组here

的更多信息