作为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++;
}
}
}
}
提前致谢。
答案 0 :(得分:3)
您在两个不同的范围内声明了两个不同的变量
如果要访问全局声明的文件路径,请从文件路径的第二个声明中删除string []答案 1 :(得分:2)
引用变量时丢失@。
您还要宣布filePaths
两次。一旦进入类(并且从未定义)并且一次进入按钮单击事件处理程序,该处理程序超出该方法的范围。您只想在类中声明它并在方法中设置它,因此从方法中的行中删除string[]
。
答案 2 :(得分:0)
首先:在设置变量之前不应该启动计时器。
二:如果在开头定义,则不必重新定义变量类型。
答案 3 :(得分:0)
我可以在你的代码中看到的问题是declare string [] filePaths;在类级别,然后在timer1_Tick事件中使用它但字符串[] 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,那么它将被调用一次
答案 4 :(得分:0)
您似乎错误地使用了@
符号。字符串或字符串引用前面的@
符号用于禁用反斜杠的转义功能(\
)。通常你必须使用你目前拥有的额外反斜杠来逃避反斜杠(\\
)。
因此...
string directpath = "C:\\Users\\Optimus Prime\\Documents\\vocabaudio\\";
相当于
string directpath = @"C:\Users\Optimus Prime\Documents\vocabaudio\";