C#跨不同对象访问变量

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++;
        }

    }
}

}

事先谢谢。


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

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


引用变量时丢失@。

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


您似乎错误地使用了@符号。字符串或字符串引用前面的@符号用于禁用反斜杠的转义功能(\)。通常情况下,您必须使用与当前相同的附加反斜杠来避免反斜杠(\\)。

所以…

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,那么它只会被调用一次。


首先:在设置变量之前不应该启动计时器。

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