声明要在别处使用的变量

时间:2014-01-25 00:07:38

标签: c#

我有以下代码:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        string Elementsfile;
        if (File.Exists(Application.StartupPath + "\\checkfiles.lst"))
        {
            string path = Application.StartupPath + "\\checkfiles.lst";

            // Open the file to read from.
            foreach (string readText in File.ReadLines(path))
            {
                var elements = readText.Split('|');
                Elementsfile = elements[0];
                string HashString = elements[1];
                string ByteSize = elements[2];
                Console.WriteLine(Elementsfile + HashString + ByteSize);
            }
        }

        string filePath = Elementsfile;
}

我正在尝试声明这些变量:

string Elementsfile = elements[0];
string HashString = elements[1];
string ByteSize = elements[2];

......并在课堂上的其他地方使用它们。

当我尝试使用它们时,例如:string filePath = Elementfile;,我收到错误

Use of unassigned local variable 'ElementsFile'

4 个答案:

答案 0 :(得分:5)

您必须在更广泛的范围内定义它们,更具体地说,在实例级别上定义它们。

class X {
   string ElementsFile;
   string HashString;

   void method(){
        ElementsFile = "file.txt"; // notice how you just assign the values 
        HashString = "something";  // instead of redefining them as string
   }
}

现在,类中的每个非静态方法都可以使用这些变量。如果你在方法中重新定义它们,那么这也是有效的,但是它将隐藏在实例级别定义的变量。

在您的示例中,您将在foreach块中定义它们。这是比实例和方法范围更深层次的另一个层次。如果您只想在同一方法中重用这些变量但在foreach之外,那么您可以为该方案调整相同的逻辑:

class X {  
   void method(){
        string ElementsFile;
        string HashString;

        foreach(something) {
            ElementsFile = "file.txt"; 
            HashString = "something";  
        }

        // Use the variables here
   }
}

答案 1 :(得分:2)

c#具有块范围。这意味着变量仅在定义它们的块中可见。

所以你应该在正确的水平上定义它们:

public class MyClass
{
    string myClassVar; // this one is usable throughout the class

    void MyMethod()
    {
        string myMethodVar; // This one is visible inside this method
        string path = Application.StartupPath + "\\checkfiles.lst";

        // Open the file to read from.
        foreach (string readText in File.ReadLines(path))
        {
            var elements = readText.Split('|');
            string Elementsfile = elements[0];    // these ones are visible inside the for loop
            string HashString = elements[1];
            string ByteSize = elements[2];
            Console.WriteLine(Elementsfile + HashString + ByteSize);
        }
     }
}

要回答您的问题,您应该在方法之外定义变量(或者至少是for循环)。请注意,如果执行foreach,则只会保存循环写入的最后一个值,因为每次迭代都会覆盖这些值。

答案 2 :(得分:0)

那么你应该让它们成为你班级的领域而不是局部变量。或者你应该至少在foreach循环的范围之外声明它们,以便在相同方法的其他代码块中访问它们。

答案 3 :(得分:0)

其他问题通常是正确的,但他们忽略了代码中的一个潜在错误。当您遍历这些行并修改变量时,每次都会覆盖以前的值。因此,一旦循环完成,您将只有非常最后行的值。您可能希望执行更类似的操作将文件解析为列表:

public class HashEntryModel { //name it whatever represents a single line in your file
  public string ElementsFile { get;set;}
  public string Hash { get;set;}
  public string ByteSize { get;set;} //sounds like an integer?  Perhaps instead of string declare as int and parse with int.TryParse?
}

public class SomeClass()
{
 public List<HashEntryModel> HashEntries {get;set;}

 public SomeClass(){
   HashEntries = new List<HashEntryModel>();
 }

 public void SomeMethod() 
 {
  string path = Application.StartupPath + "\\checkfiles.lst";

  // Open the file to read from.
  foreach (string readText in File.ReadLines(path))
  {
    var elements = readText.Split('|');
    HashEntryModel current = new HashEntryModel();
    current.ElementsFile = elements[0];
    current.Hash = elements[1];
    current.ByteSize = elements[2];

    HashEntries.Add(current);//add the entry we just parsed to the list
  }

  //now anywhere in this class we can loop through the entries:

  foreach(HashEntryModel item in HashEntries)
  {
    Console.WriteLine(item.ElementsFile + item.Hash + item.ByteSize);
  }

 }

}