从方法中正确返回字符串

时间:2013-07-02 20:28:39

标签: c#

我有这个方法,我想返回一个字符串,我将在另一个方法中使用但不是当我将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 个答案:

答案 0 :(得分:4)

为了编译这段代码,您应该考虑在异常的情况下需要返回的值以及如果for循环从未运行(是的,如果theImage.PageCount返回一个,则会发生这种情况在运行时严格低于1的值)。例如,您可以返回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;
    }
}

答案 1 :(得分: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

答案 2 :(得分:0)

您可能无法在此处返回正确的字符串,因为该方法未通过其后置条件。你要求它阅读一份文件,但事实并非如此。你有三个有意义的选择:

  1. 返回null。然后,您必须在调用者中处理null。
  2. 如果您无法处理异常,请不要捕获异常 - 让调用者处理它。
  3. 抓住异常,但重新抛出异常,用其他类型换行以反映你方法的后置条件失败。
  4. 如果你不从你的catch中重新抛出,编译器希望你返回一些东西 - 因此,null。

答案 3 :(得分:0)

当您在此处阅读单个条形码时,我建议您使用IEnumerable<string>yield 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);

这种方法直接将所有读取页面合并为字符串的好处是,您仍然可以访问原始形式的所有数据,并且可以自由地操作它,而不需要{{1之后它。

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