我有以下代码:
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'
答案 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);
}
}
}