0

作为 c# 的新手,我不明白变量是如何在对象之间传递的。当我执行这个程序时,我的数组变量“filePaths”返回 null。它是一个基本的窗口窗体。我正在制作一个显示单词并播放声音的程序。

具体错误是“未处理 NullReferenceException。

这是我的特定代码。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Media;

namespace Kindersect
{
public partial class form1 : Form
{
    string[] filePaths;
    string directpath = "C:\\Users\\Optimus Prime\\Documents\\vocabaudio\\";
    int counter = 0;
    int c = 0;
    public form1()
    {
        InitializeComponent();
    }

    public void button1_Click(object sender, EventArgs e)
    {
        timer1.Enabled = true;
        string[] filePaths = Directory.GetFiles(directpath, "*.wav");
        foreach(string k in filePaths)
        {
            c++;
        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (counter < c)
        {
            label1.Text = filePaths[counter];
            SoundPlayer simpleSound = new SoundPlayer(filePaths[counter]);
            simpleSound.Play();
            counter++;
        }

    }
}

}

提前致谢。

4

5 回答 5

3

您正在声明两个不同的变量......在不同的范围内

如果要访问全局声明的文件路径,请从文件路径的第二个声明中删除 string[]

于 2012-07-04T20:08:32.670 回答
2

引用变量时丢失@'s。

你也声明filePaths了两次。一次在类中(并且从未定义),一次在超出该方法范围的按钮单击事件处理程序中。您只想在类中声明它并在方法中设置它,因此string[]从方法中的行中删除。

于 2012-07-04T20:06:46.123 回答
0

第一:您不应该在设置变量之前启动计时器。

二:如果在开头定义了变量类型,则不必重新定义。

于 2012-07-04T20:09:34.067 回答
0

我在您的代码中看到的问题是 declare string[] filePaths; 在类级别,然后在 timer1_Tick 事件中使用它,但 string[] filePaths; 永远不要获得分配给它的值,因为您在 button1_Click 行中有一个类似的名称变量: string[] filePaths = Directory.GetFiles(@directpath, "*.wav"); 但此 filePaths 数组的范围仅在 button1_Click 内

So to resolve your issue please change

string[] filePaths = Directory.GetFiles(@directpath, "*.wav");

to 

filePaths = Directory.GetFiles(@directpath, "*.wav");

我建议您以这种方式使用您的方法,代码更小更清晰,变量更少:

public void button1_Click(object sender, EventArgs e)
{
    timer1.Enabled = true;
}

    private void timer1_Tick(object sender, EventArgs e)
    {
        filePaths = Directory.GetFiles(directpath, "*.wav");
        if (counter < filePaths.Length)
        {
            label1.Text = filePaths[counter];
            SoundPlayer simpleSound = new SoundPlayer(filePaths[counter]);
            simpleSound.Play();
            counter++;
        }

    }

如果您可以通过这种方式在 Form_Load 事件中使用 Directory.GetFiles,它将只被调用一次

于 2012-07-04T20:10:56.147 回答
0

看起来您使用的@符号不正确。字符串或字符串引用前面的@符号旨在禁用反斜杠 ( \) 的转义功能。\\通常,您必须像当前拥有的 ( )那样使用额外的反斜杠来转义反斜杠。

所以...

string directpath = "C:\\Users\\Optimus Prime\\Documents\\vocabaudio\\";

相当于

string directpath = @"C:\Users\Optimus Prime\Documents\vocabaudio\";

另请参阅:@(at) 登录文件路径/字符串

于 2012-07-04T20:14:06.210 回答