公共方法中的public对象在同一类中的另一个公共方法中不可见



我是一个努力学习和理解这种新的C#语言和OO风格的新手,我的大脑不像20年前那么敏锐。这里我们有一个到Access(.accdb)的简单数据库连接我正在实例化一个助手类,它包含两个方法,即makeconn和readfrondb方法,如下所示

public void Form1_Load(object sender, EventArgs e)  {
Clshelper chelp = new Clshelper();
chelp.makeconn(); 
chelp.readfromdb();
}

这是下面创建的helper类,因为我想在单独的方法中保留连接部分和我所做的任何类型的数据操作。但是,除非在方法makeconn中创建连接对象con1的行抛出异常,因为如果我按以下方式对其进行编码,则con1是NULL对象。

public class Clshelper {
public OleDbConnection con1;
public OleDbCommand cmd;
public Clshelper() {
Console.WriteLine("instantiated Cls_helper()");
}
public void  makeconn() {   
OleDbConnection con1 = new OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0; Data Source = D:\DATA.accdb");
}
public void readfromdb() {
con1.Open();
(...)
}

但是,如果我将创建con1连接对象的makeconn中的行放在readfromdb的顶部,并且只运行readfromdb,那么一切都会正常工作。那么,为什么readfromdb方法不能"看到"我在makeconn方法中创建的con1对象——我认为类中的任何变量对同一类中的所有方法都可见??

OleDbConnection con1 = // ...

实际上在CCD_ 1函数的范围内创建了一个全新的变量。虽然您有另一个名为con1的类范围变量,但它们是分开的变量,因此将值分配给一个(函数范围)变量不会将值分配到另一个(类范围)变量。

修复非常容易。与其声明一个新变量,不如使用您在类中已经声明的变量:

public void  makeconn() {
// Don't declare a new variable here:
con1 = new OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0; Data Source = D:\DATA.accdb");
}

有趣的旁注。如果您有一个与类作用域实例变量命名相同的函数作用域变量,则可以使用this关键字访问类作用域变量:

class MyClass {
private int myVar = 1;
private void myFunc(){
int myVar = 2; // function-scoped myVar overrides class-scoped myVar
int myOtherVar;
myOtherVar = myVar; // myOtherVar = 2 (function-scoped myVar)
myOtherVar = this.myVar; // myOtherVar = 1 (class-scoped myVar)
}
}

您的助手类无法遵循有关处理连接的良好做法。最终,这可能会导致耗尽可用的连接。当这种情况发生时,很难找到。这就是为什么在处理IDisposable对象时需要小心,以确保正确处理了它们。

以下是正确遵循此模式的一种方法:

public class ProductRepository
{
private readonly string _connectionString;
public MyRepository(string connectionString)
{
_connectionString = connectionString;
}
public List<Product> GetProducts()
{
using (var connection = new OleDbConnection(_connectionString))
using (var command = new OleDbCommand("command text", connection))
{
connection.Open();
//execute command and return results here
}
}
public void AddProduct(Product product)
{
using (var connection = new OleDbConnection(_connectionString))
using (var command = new OleDbCommand("command text", connection))
{
connection.Open();
//execute command here
}
}
}

使用Dapper(此处未显示)可以进一步简化它,因此您不必创建命令对象并将结果映射到强类型类/从强类型类映射结果。

相关内容

  • 没有找到相关文章

最新更新