2

我有一个带有全局变量的 Windows 窗体应用程序 - 一个名为testPath.

此字符串用于保存路径 - 默认情况下是C:\temp\. 当用户单击按钮时,将创建此目录(如果它不存在)。

还有一个文本框控件,以防用户想要更改路径的值。

在按钮的事件处理程序中,我尝试访问testPath并得到一个空引用。

我不会更改testPath任何地方的值,除非我将它传入和传出文本框控件。

我究竟做错了什么?全局变量如何在一秒钟内有一些东西,然后它指向一个空引用?

这是完整的代码:

public string testPath = @"C:\temp\";

public MainForm()
{
     //Windows Designer call
     InitializeComponent();

     //Show the testPath in the textBox (using Invokes)
     this.textBox1.Invoke(new MethodInvoker(delegate { this.textBox1.Text = testPath; } ));

     //here, testPath contains 'C:\temp\'
}

//Button "Click" handler
private void Button1Click(object sender, EventArgs e)
{
     //here, testPath contains a null reference!

     //If the user changed testPath in the textBox, we need to save it again
     this.textBox1.Invoke(new MethodInvoker(delegate { testPath = this.textBox1.Text; } ));

     //Create the path
     if(!Directory.Exists(testPath)) //If it does not exist already
     {
         Directory.CreateDirectory(testPath); 
     }

     //...Do something else

}
4

4 回答 4

8

我建议将其设为常数:

const string testPath = @"C:\temp\";

这将导致任何将值设置为编译器错误的尝试。使用该值无需更改即可工作。


根据评论进行编辑:

由于您想更改该值,我建议将其重新设计为属性:

private string _testPath = @"C:\temp\";
private string testPath 
{ 
    get { return _testPath; }
    set
    {
        _testPath = value;
    }
}

然后,您可以在该行上设置一个断点_testPath = value;,并在调试器中查看究竟是什么将其设置为null. 更正此问题后,我建议修复命名以匹配标准 .NET 命名约定。

于 2012-06-14T16:48:14.993 回答
3

我会尝试将该字段标记testPath为只读,并遵循编译器错误。

这是关于 const 和 readonly 之间差异 的教程。

编辑您可以查看为表单加载事件实现自定义处理程序并检查那里的状态。您还可以在构建对象、处理表单加载事件以及处理用户输入时使用 F10 逐步执行。请记住,刚进入函数时,所有变量在左大括号上显示为未初始化。您必须至少通过该功能一次才能看到它们。使用图钉在文本编辑器中密切关注您的变量。

于 2012-06-14T16:47:23.017 回答
1

更新:我不确定你为什么需要这个公共变量。如果您只是想使用“C:\temp\”之类的初始值来初始化控件,用户可以根据需要对其进行编辑。如果是这种情况,请在设计视图中打开表单,右键单击文本框 > 转到属性。在属性窗口中,将 Text 属性更改为“C:\temp\”,完成此操作后,您的文本框将被初始化为“C:\temp\”。在事件处理程序中,您可以简单地编写

private void button1_Click(object sender, EventArgs e)
{
     if (!Directory.Exists(this.textBox1.Text.Trim()))
        {
            Directory.CreateDirectory(this.textBox1.Text.Trim());
        }

}

原始:在表单初始化之后但在单击按钮之前,testPath 变量被修改为 null。由于它是一个公共变量,因此也可以从类外部访问和修改它。

重现此问题的一种简单方法 - 在 Program 类 > Main 方法中

[STAThread]
static void Main()
{
   Form1 obj = new Form1();
   obj.testPath = null;
   Application.Run(obj);
}

建议: 1. 将testPath设为常量或只读,判断是否被修改。2. 如果您不需要公开访问说明符,请将其更改为私有。

于 2012-06-14T17:13:32.653 回答
0

我建议不要在按钮单击事件范围之外声明路径,而是在方法中声明它。

像这样:

private void Button1Click(object sender, EventArgs e) 
{ 
     string testPath = @"C:\temp\"; 

     //Create the path if it does not exist      
     if(!Directory.Exists(testPath))      
          Directory.CreateDirectory(testPath);       
}
于 2012-06-14T16:46:14.837 回答