我有这个方法,我想返回一个字符串,我将在另一个方法中使用但不是当我将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());
}
}
答案 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)
您可能无法在此处返回正确的字符串,因为该方法未通过其后置条件。你要求它阅读一份文件,但事实并非如此。你有三个有意义的选择:
如果你不从你的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之后它。
代码不再是您自己的代码,但它应该让您清楚地了解我建议您如何处理此特定问题;你应该能够适应它并在你自己的代码中使用它而不会出现太多问题。