在catch块中返回空List

本文关键字:List 返回 catch | 更新日期: 2023-09-27 17:57:49

我有一个c#函数,它从Datatable中读取文件位置,并向调用方法返回一个包含所有文件lcoation的List。

Catch块中,我想返回一个带有false的空列表,这样调用方法就可以取消它的操作。

但是我无法编译return语句。

传入一个列表作为引用,并让函数返回一个布尔值true/false会更好吗?

这是我正在尝试的代码:

   public static List<string> getEmailAttachments(string emailID, System.Data.DataTable emails)
    {
        List<string> allAttachments;
        //System.Data.DataTable oTbl = new DataTable();
        try
        {
            System.Diagnostics.Debugger.Break();
            var results = from myRow in emails.AsEnumerable()
                          where myRow.Field<string>("itemID") == emailID
                          select myRow;
            System.Diagnostics.Debug.Print("attachments");
            foreach (DataRow myRow in results)
            {
                System.Diagnostics.Debug.Print(myRow.Field<string>("attachmentsPath"));
                allAttachments.Add(myRow.Field<string>("attachmentsPath"));
                //DataTable dt = (DataTable)myRow["attachmentsPath"];
                //DataTable oTbl = dt.Clone();
                //DataRow[] orderRows = dt.Select("CustomerID = 2");
                //foreach (DataRow dr in orderRows)
                //{
                //    oTbl.ImportRow(dr);
                //}
                // myTable.ImportRow(dr);
                //oTbl.Rows.Add(myRow);
                //oTbl.ImportRow(myRow);
            }
            return allAttachments;
        }
        catch (Exception ex)
        {
            logBuilder("common.getEmailAttachments", "Exception", "", ex.Message, "");
            return new List<string>emptyList(); // cannot compile
        }
    }

在catch块中返回空List

如果有人还在看。。。

使用IEnumerable<string>作为返回类型并且:

return Enumerable.Empty<string>();

更改此行:

return new List<string>emptyList(); // cannot compile

至:

 return new List<string>();

传递一个列表作为引用,并从函数中返回一个布尔值,这是个坏主意。您的方法名为getEmailAttachments,它加载附件,并且应该返回附件。如果你想检查加载附件的结果,我可以建议你返回null并检查返回的值。

我会采取稍微不同的方法。我会返回一个空列表,但也会将初始容量设置为零!

像这样:

return new List<string>(0);//notice the initial capacity to zero.

原因是内存消耗和优化。。。我知道这是一个微观优化,但它不会伤害任何东西。它实际上可能有利于整个应用程序。

使用

 return new List<string>();

自.Net Framework 4.6前后和Core.Net版本中,添加了一种更好的方法

return Array.Empty<T>();

这会分配一个数组(它是一个IList),并将其重新用于该类型的空数组的所有后续请求。它又快又干净。

试试这个。。

public static List<string> getEmailAttachments(string emailID, System.Data.DataTable emails)
    {
        List<string> allAttachments;
        //System.Data.DataTable oTbl = new DataTable();
        try
        {
            System.Diagnostics.Debugger.Break();
            var results = from myRow in emails.AsEnumerable()
                          where myRow.Field<string>("itemID") == emailID
                          select myRow;
            System.Diagnostics.Debug.Print("attachments");
            foreach (DataRow myRow in results)
            {
                System.Diagnostics.Debug.Print(myRow.Field<string>("attachmentsPath"));
                allAttachments.Add(myRow.Field<string>("attachmentsPath"));
                //DataTable dt = (DataTable)myRow["attachmentsPath"];
                //DataTable oTbl = dt.Clone();
                //DataRow[] orderRows = dt.Select("CustomerID = 2");
                //foreach (DataRow dr in orderRows)
                //{
                //    oTbl.ImportRow(dr);
                //}
                // myTable.ImportRow(dr);
                //oTbl.Rows.Add(myRow);
                //oTbl.ImportRow(myRow);
            }
            //return allAttachments;
        }
        catch (Exception ex)
        {
            logBuilder("common.getEmailAttachments", "Exception", "", ex.Message, "");
            allAttachments= new List<string>();
        }
        return allAttachments;
    }

怎么样

allAttachments.Clear();
return allAttachments;