代码之家  ›  专栏  ›  技术社区  ›  AndreaNobili

为什么在方法的返回类型上会出现这种不一致的可访问性错误?

c#
  •  0
  • AndreaNobili  · 技术社区  · 7 年前

    我正在做一个.NET项目。在DAO类中(使用ADO.NET,但这并不重要),我有这样一个方法:

    public static List<Inoltro> GetListaInoltriUltimiGiorni(int IdUor, string Protocollista, int NumeroGiorni, DBConnection config)
    {
        string query = PROT_INOLTRO.INOLTRI_ULTIMI_N_GIORNI_BY_UOR_AND_PROTOCOLLISTA;
    
        List<Inoltro> result = new List<Inoltro>();
    
        using (SqlConnection con = ArxeiaConnection.getARXEIAStringConnection(config.Tenant + "_" + config.Database))
        {
            using (SqlCommand cmd = new SqlCommand(query, con))
            {
                try
                {
                    cmd.Parameters.AddWithValue("@IdUor", IdUor);
                    cmd.Parameters.AddWithValue("@Protocollista", Protocollista);
                    cmd.Parameters.AddWithValue("@NumeroGiorni", NumeroGiorni);
    
                    con.Open();
    
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        if (reader.HasRows)
                        {
                            // Read advances to the next row.
                            while (reader.Read())
                            {
                                .........................................
                                .........................................
                                .........................................
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    con.Close();
                    throw ex;
                }
            }
        }
    
        return result;
    }
    

    如您所见,我正在创建并返回此对象:

    List<Inoltro> result = new List<Inoltro>();
    

    不一致的可访问性:返回类型 List<Inoltro> 比方法MyClass.GetListaInoltriUltimiGiorni(..)更难访问

    1 回复  |  直到 7 年前
        1
  •  3
  •   Eric Lippert    7 年前

    你的方法是 public 但是 Inoltro internal 平民的 方法,该方法公开 内部的 平民的

    首先是 try catch using 已经做了一个 Close 试一试 .

    第二,为了你将来的参考,千万不要说 throw ex; catch . 说 throw; 重新抛出异常。差别是微妙的。 重新抛出捕获的异常。 掷骰子; 重新引发异常,但将堆栈跟踪重置为当前跟踪,而不是原始跟踪。

    掷骰子; 当你 例如,由于当前代码和调用者之间存在信任边界,因此希望隐藏异常的来源。但是,在这种情况下,最好还是抛出一个新的通用异常。

    第三,我不明白为什么你们两个都有 while if 检查集合是否有行。当然,如果集合是空的,那么 Read 将返回false,因此不需要 如果 正当

    第四,这只是一个风格点;通常我们会格式化

    using (SqlConnection con = ArxeiaConnection.getARXEIAStringConnection(config.Tenant + "_" + config.Database))
    {
        using (SqlCommand cmd = new SqlCommand(query, con))
        {
    

    像

    using (SqlConnection con = ArxeiaConnection.getARXEIAStringConnection(config.Tenant + "_" + config.Database))
    using (SqlCommand cmd = new SqlCommand(query, con))
    {
    

    有一个好朋友是很常见的 使用 使用 ,在这种情况下,不必要的大括号和缩进不会使代码更容易理解。