-1

我有这个方法,我想返回一个我将在另一个方法中使用的字符串,但是当我将 return 语句放在 for 循环中时,该方法仍然要求返回。我怎样才能正确地构造它,以便我可以返回我想要的字符串。

public string ReadDocument(string fileName)
        {
            try
            {
                theImage = codecs.Load(Enhance(fileName), 0, CodecsLoadByteOrder.BgrOrGray, 1, -1); 
                for (int num = 1; num <= theImage.PageCount; num++)
                {
                    BarcodeData dataArray = engine.Reader.ReadBarcode(theImage, LogicalRectangle.Empty, 0, null);
 qrCode = dataArray.Value;

                    if (theImage.Page < theImage.PageCount)
                        theImage.Page++;       
                    return dataArray.Value;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
4

4 回答 4

4

为了编译此代码,您应该考虑在发生异常以及循环从未运行时需要返回的值(是的,如果在运行时返回的值严格低于 1,则for可能会发生这种情况)。theImage.PageCount例如,您可以返回null

public string ReadDocument(string fileName)
{
    try
    {
        theImage = codecs.Load(Enhance(fileName), 0, CodecsLoadByteOrder.BgrOrGray, 1, -1); 
        for (int num = 1; num <= theImage.PageCount; num++)
        {
            BarcodeData dataArray = engine.Reader.ReadBarcode(theImage, LogicalRectangle.Empty, 0, null);
            qrCode = dataArray.Value;

            if (theImage.Page < theImage.PageCount)
            {
                theImage.Page++;
            }

            return dataArray.Value;
        }

        return null;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
        return null;
    }
}
于 2013-07-02T20:34:08.057 回答
3

您可能会收到错误,例如并非所有代码路径都返回值,因为您没有从catch语句返回任何内容。

您可以只保存dataArray.Value字符串中的值,然后在 catch 语句之外(最后)返回这个值。

public string ReadDocument(string fileName)
{
    string value = string.Empty;
    try
    {
        theImage = codecs.Load(Enhance(fileName), 0, CodecsLoadByteOrder.BgrOrGray, 1, -1);
        for (int num = 1; num <= theImage.PageCount; num++)
        {
            BarcodeData dataArray = engine.Reader.ReadBarcode(theImage, LogicalRectangle.Empty, 0, null);
            qrCode = dataArray.Value;

            if (theImage.Page < theImage.PageCount)
                theImage.Page++;
            value = dataArray.Value;
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
    return value;
}

更新:如果你想返回列表,那么只需将返回类型更改为List<string>,然后将项目添加到字符串并像这样返回它

List<string> myValues=new List<string>();
for (int num = 1; num <= theImage.PageCount; num++)
        {
            BarcodeData dataArray = engine.Reader.ReadBarcode(theImage, LogicalRectangle.Empty, 0, null);
            qrCode = dataArray.Value;
        if (theImage.Page < theImage.PageCount)
            theImage.Page++;
        myValues.Add(dataArray.Value);
    }

然后返回myValues

于 2013-07-02T20:32:38.770 回答
0

当您在这里阅读单个条形码时,我建议使用IEnumerable<string>andyield return运算符,而不是立即实际连接字符串。

这就是我的意思;我在这里有一些示例“页面”,它们当然是您程序中的实际数据,但它为我们提供了一些可以使用的东西:

    // Example "pages", which would be individual barcodes read using OP's BarcodeReader, but we need some sample data to demonstrate the purpose.
    private string[] _pages = new string[] { "Mung", "Foo", "Bar", "Cookie" };

然后,您将ReadDocument按照以下方式在某处编写您的方法:

    public IEnumerable<string> ReadDocument()
    {
        // Iterate over the pages, and use yield return to add every individual page to the IEnumerable.
        // Using the current Page and the PageLength in your for loop removes the need of having to manually check
        // whether we've reached the end of the pages further down the loop.
        for (int i = 0; i < _pages.Length; i++)
        {
            // BarcodeData dataArray = engine.Reader.ReadBarcode(theImage, LogicalRectangle.Empty, 0, null);
            // qrCode = dataArray.Value;

            yield return _pages[i]; // dataArray.Value in your own code.
        }
    }

这将为您提供您刚刚阅读的所有页面IEnumerable,您可以foreach稍后再获取各个页面,或者您可以通过执行以下操作来组合所有页面的字符串

ReadDocument().Aggregate(string.Empty, (current, s) => current + s);

这种方法比直接将所有读取的页面合并到一个字符串中的好处是,您仍然可以访问原始形式的所有数据,并且您可以自由地对其进行操作,而无需Split()事后进行操作。

该代码不再完全是您自己的代码,但它应该让您清楚地了解我建议您如何解决这个特定问题;您应该能够适应它并在您自己的代码中使用它,而不会出现太多问题。

于 2013-07-02T21:47:07.707 回答
0

您可能无法在此处返回正确的字符串,因为该方法的后置条件失败。您要求它阅读文档,但它没有。您有三个有意义的潜在选择:

  1. 返回空值。然后,您必须在调用者中处理 null。
  2. 不要捕获异常,如果你不能处理它——让调用者处理它。
  3. 捕获异常,但重新抛出它,用其他类型包装以反映您的方法失败的后置条件。

如果你不从你的捕获中重新抛出,编译器希望你返回一些东西——因此,null。

于 2013-07-02T20:37:29.720 回答