Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 静态成员未初始化-从数组元素获取System.NullReferenceException_C#_Winforms - Fatal编程技术网

C# 静态成员未初始化-从数组元素获取System.NullReferenceException

C# 静态成员未初始化-从数组元素获取System.NullReferenceException,c#,winforms,C#,Winforms,在我的C#练习中遇到另一个问题。这是一个简短的解释: 在Program.cs中,我有以下代码: namespace testApp { public class AppSettings { public static int appState { get; set; } public static bool[] stepsCompleted { get; set; } } public void Settings { appState = 0;

在我的C#练习中遇到另一个问题。这是一个简短的解释: 在Program.cs中,我有以下代码:

namespace testApp
{
  public class AppSettings
  {
    public static int appState { get; set; }
    public static bool[] stepsCompleted { get; set; }
  }

  public void Settings
  {
    appState = 0;
    bool[] stepsCompleted = new bool[]{false, false, false, false, false};
  }
}

static class MyApp
{
  static void Main()
  {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new gameScreen());
    AppSettings appSettings = new AppSettings();
  }
}
这在Form1.Designer.cs中:

namespace testApp
{
  private void InitializeComponent() {..}
  private void detectPressedKey(object sender, KeyPressEventArgs e)
  {
    if (e.KeyChar == (char)13) // Enter = code 13
    {
      if (AppSettings.appState == 0)
      {
        if (AppSettings.stepsCompleted[1] == false) // << here we have an EXCEPTION!!!
        {
          this.playSound("warn");
        }
      }
    }
  }
}
namespace testApp
{
私有void InitializeComponent(){..}
private void detectPressedKey(对象发送器,按键事件参数e)
{
如果(e.KeyChar==(char)13)//输入=代码13
{
如果(AppSettings.appState==0)
{

if(AppSettings.stepsCompleted[1]==false)//您没有在任何地方初始化
AppSettings。步骤已完成。事实上,
testApp.Settings
不会编译。由于您的
AppSettings
类具有静态成员,您可以从表单访问这些成员,并且假设您只需要一个实例来跟踪状态,您可以通过以下方式初始化它们:

然后需要从
Main
中删除该行:

AppSettings appSettings = new AppSettings();
静态构造函数保证在第一次访问之前被调用一次

编辑-完整工作样本

Program.cs


您没有在任何地方初始化
AppSettings.stepsCompleted
。事实上,
testApp.Settings
不会编译。由于您的
AppSettings
类具有静态成员,您可以从表单访问这些成员,并且假设您只需要一个实例来跟踪状态,您可以通过以下方式初始化它们:

然后需要从
Main
中删除该行:

AppSettings appSettings = new AppSettings();
静态构造函数保证在第一次访问之前被调用一次

编辑-完整工作样本

Program.cs


您没有为
AppSettings分配任何非null值。stepsCompleted
,因此它将为null。它确实存在,但没有值,因此尝试访问其元素将抛出NRE。您没有为
AppSettings分配任何非null值。stepsCompleted
,因此它将为null。它确实存在,但没有值,所以尝试访问它的元素会抛出一个NRE。好吧,你的建议和我有相同的例外…但意识到我应该删除
bool[]
在构造函数中完成的步骤前面,事实上我错过了它:)。现在它工作了,答案批准了!顺便说一句,我正在使用playSound()的嵌入式资源.Apols-我没有注意到更改-
new[]{false,false,false,false}
new bool[]{false,false,false,false}
应该两者都能工作-编译器可以推断出这是一个布尔数组。我的Resharper cleanup设置为删除它认为多余的任何内容。好吧,你的建议行了吗?我得到了相同的异常…但意识到我应该删除
bool[]
在构造函数中完成的步骤前面,事实上我错过了它:)。现在它工作了,答案被批准了!顺便说一句,我正在使用playSound()的嵌入式资源。Apols-我没有注意到更改-
新建[]{false,false,false,false,false}
新建bool[]{false,false,false,false}
这两种方法都应该有效-编译器可以推断这是一个布尔数组。我的Resharper cleanup设置为删除任何它认为多余的内容。
using System;
using System.Windows.Forms;

namespace testApp
{
    public static class AppSettings // May as well make the class static 
    {
        public static int appState { get; set; }
        public static bool[] stepsCompleted { get; set; }

        static AppSettings() // Static constructor
        {
            appState = 0;
            stepsCompleted = new[] { false, false, false, false, false };
        }
    }

    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new gameScreen());
        }
    }
}
using System.Windows.Forms;

namespace testApp
{
    public partial class gameScreen : Form
    {
        public gameScreen()
        {
            InitializeComponent();
        }

        private void gameScreen_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)13) // Enter = code 13
            {
                if (AppSettings.appState == 0)
                {
                    if (AppSettings.stepsCompleted[1] == false)
                    {
                        this.playSound("warn");
                    }
                }
            }
        }

        private void playSound(string someSound)
        {
            MessageBox.Show(string.Format("Sound : {0}", someSound));
        }
    }
}