C# accessing variables across different objects
作为C_的新手,我不理解变量是如何在对象之间传递的。执行此程序时,数组变量"filepaths"返回空值。它是一个基本的Windows窗体。我正在制作一个能显示单词和播放声音的程序。
特定错误为"NullReferenceException未处理"。
这是我的特殊代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | 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++; } } } |
}
事先谢谢。
您正在声明两个不同的变量…在不同的范围内
如果要访问全局声明的文件路径,请从文件路径的第二个声明中删除字符串[]
引用变量时丢失@。
你也要申报两次
您似乎错误地使用了
所以…
1 | string directpath ="C:\\Users\\Optimus Prime\\Documents\\vocabaudio\"; |
等于
1 | string directpath = @"C:\Users\Optimus Prime\Documents\vocabaudio"; |
另请参见:@(at)登录文件路径/string
我在代码中看到的问题是:在类级别声明string[]filepaths;然后在timer1_tick event中使用它,但在string[]filepaths中使用它;永远不要获取分配给它的值,因为在button1中有一个类似的名称变量单击line:string[]filepaths=directory.getfiles(@directpath,"*.wav");但此filepaths数组的作用域仅位于按钮1"单击"内。
1 2 3 4 5 6 7 | So to resolve your issue please change string[] filePaths = Directory.GetFiles(@directpath,"*.wav"); to filePaths = Directory.GetFiles(@directpath,"*.wav"); |
我建议您以这种方式使用您的方法,使用更小、更清晰、变量更少的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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++; } } |
如果您能以"加载事件"的形式使用directory.getfiles,那么它只会被调用一次。
首先:在设置变量之前不应该启动计时器。
第二:如果在开头定义了变量,则不必重新定义变量类型。