C#属性的get set方法不设置值

3

我在Google和Stack Overflow上搜索了我遇到的问题。不幸的是,我找不到正确的答案。

首先,我会展示我的类和App.config文件。

类: Form1 : Form

public partial class Form1 : Form
{
    Database db = new Database();

    public Form1()
    {
        InitializeComponent();
        db.Test();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        db.MdfConnectionString = ConfigurationManager.ConnectionStrings["MDFConnection"].ConnectionString;
    }
}

类: 数据库

class Database
{
    private string _mdfConnectionString;

    public string MdfConnectionString
    {
        get { return this._mdfConnectionString; }
        set { this._mdfConnectionString = value; }
    }

    public void Test()
    {
        MessageBox.Show(_mdfConnectionString);
    }

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
      <add name="MDFConnection" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|Database\AutoFill.mdf;Integrated Security=True;ApplicationIntent=ReadOnly" providerName="System.Data.SqlClient" />
    </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

在我的类Database.cs中,我有一个MessageBox.Show(_mdfConnectionString);会显示私有字符串(备份字段),但是由于某种奇怪的原因_mdfConnectionString总是为空。
在我的类Form1:Form中声明需要加载App.config中的连接字符串。
不要忘记提到ConfigurationManager.ConnectionStrings["MDFConnection"].ConnectionString;本身返回一个值,所以这里不是问题。
希望有人能帮助我解决这个问题。 编辑1 更改了代码以使其更清晰易懂。ExecuteQuery并不重要,所以我在Database.cs类中创建了一个简单的方法来调用消息框。
同时,可执行文件和Exe.config位于同一文件夹中执行。

9
需要翻译的内容:First thing to learn about is automatically implemented properties - you can get rid of your field declaration, and rewrite your property as public string MdfConnectionString { get; set; }自动实现属性是需要学习的第一件事情 - 您可以摆脱字段声明,并将属性重写为public string MdfConnectionString { get; set; } - Jon Skeet
2
你是否进入代码进行调试,看看 Form1_Load 方法是否真正被调用了?你是否检查了它是否已经正确连接到事件?或者你是不是在表单加载完成之前就使用了 db - Jon Skeet
你是在哪里调用 ExecuteQuery(...) 的? - Ondrej Svejdar
1
我不清楚为什么每个人都在使用可能拼错的字符串与ConfigurationManager一起,并且没有直接使用Properties.Settings.Default.ConnectionString。我们可以将连接字符串作为连接字符串类型的设置,通过项目属性中的设置选项卡进行管理。 - Thorsten Dittmar
3
在你的编辑中,构造函数在加载之前被触发。因此,当触发db.test()时,连接字符串将为NULL,就像我在下面的答案中所说的那样。 - Cageman
显示剩余15条评论
3个回答

3
我没有确切的答案,但在相同的情况下,我会问自己几个问题。
1.连接字符串是否已获得?例如,将解决方案拆分为调试,并在myConn上设置断点。

private void Form1_Load(object sender, EventArgs e) { var myConn = ConfigurationManager.ConnectionStrings["MDFConnection"].ConnectionString; db.MdfConnectionString = myConn; }

2.您当前的解决方案允许在没有连接字符串的情况下使用数据库类。将连接放入构造函数中是否更好,以消除潜在的错误?例如:

public class Database { private string _mdfConnectionString; public Database(string conn) { _mdfConnectionString = conn; } ... }

然后在表单加载时进行构造。
3.在Web开发中,有时您正在使用的实例与您认为的实例不同。如果一切都失败了,您可以尝试将类更改为Singleton(单例),但依赖注入(Dependency Injection)风格应该更好。
编辑 - 根据您的编辑,我相信您现在在加载窗体之前调用了Test方法。请尝试第二点(将连接字符串注入到构造函数中),这样您就知道不能没有连接字符串的情况下实例化该类。我已经在控制台中尝试过您的类,所以问题极有可能是加载顺序。DI将解决此问题。

我一直被告知不要在Web实例中使用数据库实例的单例。 - Cageman
@hockeyJ 1. 已经获取。即使执行此操作:db.MdfConnectionString =“测试Weeeeee”,仍然会导致空值。2. 我稍后会关闭这个漏洞,这样当连接字符串未定义时它就会失败,感谢您的指导 :) - Roemy
@Roemy - 如果你有连接,那么尝试在构造函数中传递它。这样,你就不应该能够在没有连接字符串的情况下实例化该类。Cageman - 我同意在最终产品中不使用单例模式。它是作为调查帮助而设计的,以防Roemy无法访问他所期望的实例。如果这不清楚,请原谅。 - JsAndDotNet

0
什么时候调用这个方法? 仅仅看你的代码,它似乎是在构造函数中被调用的,所以在构造函数中初始化字符串。
public Form1()
{
     db.MdfConnectionString = ConfigurationManager.ConnectionStrings["MDFConnection"].ConnectionString;
     InitializeComponent();
}

我已经尝试过了,但那也不起作用,值仍然为空。 - Roemy
就像HockeyJ所说的(第一点),请检查连接字符串是否在加载时被获取。 - Cageman

0

Form1:表单

public partial class Form1 : Form
{
    Database db = new Database();

    public Form1()
    {
        InitializeComponent();
        //db.Test(); // Removed!
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        db.MdfConnectionString = ConfigurationManager.ConnectionStrings["MDFConnection"].ConnectionString;
        db.Test(); // Returns a value! :D
    }
}

看起来我在加载表单本身之前加载了我的方法。


请注意,通常情况下您不应该自己编写答案。相反,接受帮助您的答案,并在评论中指出哪部分答案对您有所帮助。问题在于这不是一个论坛,因此答案不会始终保持相同的顺序。 - Thorsten Dittmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接