当我在类方法中声明私有字符串时,C#并不是所有代码路径都返回一个值

时间:2016-07-02 21:17:49

标签: c#

我是C#的新手。事实上,这是我用这种特殊语言的第一个项目。

在以下代码中:

namespace FuelBurnImport {

    class DataWriter {

        private string qs = "SELECT * FROM fuel_burn_data_meta;";

        public DataWriter(BurnDataHeader bdh, BurnDataFlight bdf) {
            SqlConnection cn = OpenCN();
            // work in progress.  more to be added here...
        }



        private SqlConnection OpenCN() {

            private string cs = @"Data Source=server; APP=FuelBurnImporter; Initial Catalog=database; Integrated Security=true";

                return new SqlConnection(cs).Open();
        }

    }

}

我在OpenCN()私有方法

中收到了智能感知错误
  • OpenCN()方法声明显示Not all code paths return a value

    {方法声明后的OpenCN() {expected "}"

    private string cs的结尾也说expected "}"

    cs中的new SqlConnection(cs)does not exist in current context

    new SqlConnection(cs).Open()错误说"命名空间无法直接包含成员..."

但是,如果我从private前面删除private string cs,则所有这些错误都会消失,而且看起来很开心。

我是否以某种方式滥用private方法?我是否滥用私人字符串声明?我有一种感觉,即使我从字符串字段声明前删除private,它仍然会破坏。

5 个答案:

答案 0 :(得分:2)

方法中的字符串声明是本地的,因此将其设为私有是没有意义的。因此,您在此处使用private关键字提交语法错误(在我看来,语义错误)。变量cn不可能泄漏,因为它无法从其他方法中访问,同一个对象的不同实例在同一个对象上有不同的“cs”事物(我不确定但你可以在方法之外创建一个private static const字符串如果你真的想在变量的声明中看到“私有”,那么在方法中使用它。

先修复此问题。

在实际返回之前,“using”语句将自动关闭连接,并且您将返回已关闭的连接。这可能会也可能不会导致语法错误,但如果确实如此,我会说它应该更明确。

答案 1 :(得分:0)

  1. 使用块"}" - 返回null因为使用块只返回值而不是函数

  2. 无需在函数内声明私有字符串

  3. 更好的方式实现功能

    private SqlConnection OpenCN() 
    {
        string cs = @"Data Source=server; APP=FuelBurnImporter; Initial Catalog=database; Integrated Security=true"; SqlConnection cn = new SqlConnection(cs);
        cn.Open(); 
        return cn;
    }
    

答案 2 :(得分:0)

  1. 使cn成为该类的私有成员;
  2. 不要在OpenCN中使用{}或以其他方式处理cn;
  3. 在您的班级上实施IDisposable。
  4. https://msdn.microsoft.com/en-us/library/b1yfkh5e(v=vs.110).aspx

答案 3 :(得分:0)

请勿将using放入OpenCNusing确保处理创建的变量。如果你这样做,你将返回一个已经关闭的SqlConnection

相反,请将OpenCN更改为:

    private SqlConnection OpenCN()
    {
        var cs = @"Data Source=server; APP=FuelBurnImporter; Initial Catalog=database; Integrated Security=true";

        var cn = new SqlConnection(cs);
        cn.Open();
        return cn;
     }

另外,不要从构造函数中调用OpenCN。当您创建DataWriter的实例时,这将创建一个打开的连接。在您需要之前,请勿创建和打开连接。这样你就可以创建它,打开它,使用它,然后尽快处理它(它也会关闭它)。

无论采用哪种方法实际执行某些SQL,都要在那里创建连接。如果您从那里拨打OpenCN,那么您可以

using(var connection - OpenCN())
{
    //execute your SQL using the connection
}

答案 4 :(得分:0)

关于您的错误,只需从连接字符串声明中删除private关键字:

private string cs = @"Data Source=server; APP=FuelBurnImporter; Initial Catalog=database; Integrated Security=true";

但是,您会遇到一些问题,因为您的连接会在使用完成后立即关闭。此外,不建议长时间打开您的连接。只需创建using语句,并在需要执行查询时打开连接。