为什么不是我的New()解雇?

时间:2010-08-08 21:05:56

标签: c#

我遇到以下代码问题。每当我在下面创建一个新的类实例并调用“Select”时,我得到的对象引用未设置为“this.db”上的对象实例

namespace SPI {

    class CompaniesDB
    {
        private DataContainer db;

        public void New() {
            this.db = new DataContainer();
        }
        public Company Select(int companyID) {
            return this.db.Company_Get(companyID).SingleOrDefault();
        }
    }
}

有人能指出为什么我的“New()”似乎没有创建新对象吗?

我对C#比较陌生。

4 个答案:

答案 0 :(得分:11)

您没有将构造函数命名为New。您可以使用类名称命名。

尝试

namespace SPI { 

    class CompaniesDB 
    { 
        private DataContainer db; 

        public CompaniesDB() { 
            this.db = new DataContainer(); 
        } 
        public Company Select(int companyID) { 
            return this.db.Company_Get(companyID).SingleOrDefault(); 
        } 
    } 
} 

构造函数的MSDN页面:http://msdn.microsoft.com/en-us/library/ms173115.aspx

答案 1 :(得分:1)

将New方法重命名为CompaniesDB?同时删除'void'修饰符。

答案 2 :(得分:1)

你打算让New()成为你的构造函数吗?如果是这样,C#中构造函数的语法会询问类的名称。所以你的构造函数应该是这样的:

public CompaniesDB()
{
    this.db = new DataContainer();
}
希望有所帮助。

答案 3 :(得分:0)

在这种情况下,DataContainer构造函数不需要参数,并且instantion不受New函数中变量的影响,因此您可以完全取消该函数。您可以在声明私有db变量时实例化DataContainer:

namespace SPI {

    class CompaniesDB
    {
        private DataContainer db = new DataContainer();

        public Company Select(int companyID) {
            return this.db.Company_Get(companyID).SingleOrDefault();
        }
    }
}

编辑,根据Mike Jolley的要求提供更多信息:

这实际上取决于偏好,两种解决方案都可以正常运行。

您可以使用以下代码:

namespace SPI { 

    class CompaniesDB 
    { 
        private DataContainer db;

        public CompaniesDB()
        {
            db = new DataContainer();
        }

        public Company Select(int companyID) { 
            return this.db.Company_Get(companyID).SingleOrDefault(); 
        } 
    } 
}

这段代码很好,您正在创建一个DataContainer实例,其引用将分配给db变量。当您想要开始使用它时,您确保db变量包含引用。

但是,此实例化始终是相同的,因此您可以在构造函数中删除赋值,并且默认情况下只创建一个普通的DataContainer。这还可以确保变量在实例化CompaniesDB对象时始终包含对DataContainer的引用:

namespace SPI { 

    class CompaniesDB 
    { 
        private DataContainer db = new DataContainer(); 

        public Company Select(int companyID) { 
            return this.db.Company_Get(companyID).SingleOrDefault(); 
        } 
    } 
}

如果DataContainer构造函数接受了参数,则需要构造函数:

namespace SPI { 

    class CompaniesDB 
    { 
        private DataContainer db;

        public CompaniesDB(string name)
        {
            db = new DataContainer(name);
        }

        public Company Select(int companyID) { 
            return this.db.Company_Get(companyID).SingleOrDefault(); 
        } 
    } 
}

引入参数意味着在构造函数中创建DataContainer实例会更好。