【问题标题】:Dictionary in C# WinForms App causing null referenceC# WinForms App 中的字典导致空引用
【发布时间】:2013-11-14 12:58:30
【问题描述】:

我正在使用 Visual Studio 2013 创建 Visual C# Windows Forms 应用程序,但我没有使用 Designer 来设置表单。

我正在尝试使用字典来存储位图,以便以后可以按名称调用它们。但是当我调试脚本时,我得到了错误:

An unhandled exception of type 'System.NullReferenceException' occurred in SimpleForm.exe
Additional information: Object reference not set to an instance of an object.

从行:

width = imgLetters["a"].Width;

任何帮助将不胜感激。

减少仍然产生错误的代码版本:

using System;
using System.Drawing;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace SimpleForm
{

    public class Test : Form
    {

        static Bitmap bmpLetterA;
        static Bitmap bmpLetterB;
        static Bitmap bmpLetterC;
        private Dictionary<string, Bitmap> imgLetters;

        public Test()
        {

            ImgInitialize();
            ImgWidth();

        }

        private void ImgInitialize()
        {

            Dictionary<string, Bitmap> imgLetters;

            bmpLetterA = new Bitmap("a.png");
            bmpLetterB = new Bitmap("b.png");
            bmpLetterC = new Bitmap("c.png");

            imgLetters = new Dictionary<string, Bitmap>();

            imgLetters.Add("a", bmpLetterA);
            imgLetters.Add("b", bmpLetterB);
            imgLetters.Add("c", bmpLetterC);

        }

        private void ImgWidth()
        {

            int width = 0;
            width = imgLetters["a"].Width;

        }


    }

}

【问题讨论】:

  • 你有两个变量叫做imgLetters,一个在整个类中可见,第二个在ImgInitialize中创建。发生的事情是:当您为ImgLetters 分配一个值时,您分配给ImgInitialize 中指定的变量/对象,而不是类中的私有变量/对象。这意味着类中的 imgLetters 具有默认值,即 NULL,从 ImgInitialize 中删除 imgLetters 的声明或按照答案之一中的建议使用 this 关键字。

标签: c# winforms visual-studio dictionary


【解决方案1】:

ImgInitialize 中删除Dictionary&lt;string, Bitmap&gt; imgLetters; 行。这将创建一个与成员变量同名的局部变量。然后它被填充,但从未使用过,而成员变量保持未初始化。

避免此类问题的提示:

  1. 您可以以特殊方式命名实例成员,以明确变量是实例成员(例如 m_member 而不是 member)。
  2. 您可以在对实例成员的访问前加上this.,以明确您要访问哪个变量。
  3. 您可以尽量避免将局部变量命名为与实例成员相同的名称。

【讨论】:

    【解决方案2】:

    问题出在这里:

    private void ImgInitialize()
    {
        Dictionary<string, Bitmap> imgLetters;
    

    这个变量shadows类的字段private Dictionary&lt;string, Bitmap&gt; imgLetters;。从方法 ImgInitialize 中删除此声明,它会正常工作。

    【讨论】:

      【解决方案3】:

      防止以后出现此类错误的友情提示:使用类成员时,附加this

      this.imgLetters = new Dictionary<string, Bitmap>();
      this.imgLetters.Add("a", bmpLetterA);
      this.imgLetters.Add("b", bmpLetterB);
      this.imgLetters.Add("c", bmpLetterC);
      

      这样,即使你有同名的局部变量也不会干扰。

      【讨论】:

        【解决方案4】:

        问题出在您的ImgInitialize() 方法中。

        删除此行

        Dictionary<string, Bitmap> imgLetters;
        

        您正在做的是创建一个与全局变量同名的局部变量。因此,您正在向其添加值。当方法完成时,由于其作用域,它会丢失。

        此时您的全局变量仍为空,这就是发生错误的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-15
          • 1970-01-01
          • 2014-04-30
          • 1970-01-01
          • 2021-10-03
          • 2016-12-26
          相关资源
          最近更新 更多