C#跨不同对象访问变量

时间:2012-07-04 20:05:35

标签: c# variables object

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

    }
}

}

提前致谢。

5 个答案:

答案 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\";

另请参阅:@(at) sign in file path/string