1

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

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

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;

        }


    }

}
4

4 回答 4

6

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

避免此类问题的提示:

  1. 您可以以特殊方式命名实例成员,以明确变量是实例成员(例如m_member代替member)。
  2. 您可以在对实例成员的访问前加上前缀,this.以明确您要访问的变量。
  3. 您可以尝试避免将局部变量命名为与实例成员相同的名称。
于 2013-11-14T13:00:11.427 回答
3

问题出在你的ImgInitialize()方法上。

删除此行

Dictionary<string, Bitmap> imgLetters;

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

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

于 2013-11-14T13:00:01.237 回答
3

问题出在这里:

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

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

于 2013-11-14T13:00:11.690 回答
3

防止将来发生此类错误的友好提示:使用类成员时,附加this

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

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

于 2013-11-14T13:02:04.527 回答