1

誰かが私が得た理由を説明してもらえますか:

「割り当てられていないローカル変数 number_of_column の使用」 for: if (i < number_of_column -1)

これを処理する最良の方法は何ですか?

static void Main(string[] args)
{ 
    int number_of_column;
    if (Directory.Exists(path))
    {
        var file = dir.GetFiles().OrderByDescending(f => f.LastWriteTime).First();
        string file1 = file.ToString();
        Console.WriteLine(file1);
        StreamReader sr = new StreamReader(path + "\\" + file1);
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            if (start == true)
            {
                string[] line1 = line.Split(',');
                number_of_column = line1.Count();
                i = 0;
                foreach (string s in line1)
                {
                    if ((s != "0") || (!string.IsNullOrEmpty(s)))
                    {
                        col[i] = "checked";

                    }
                    i++;
                }
            }
            else
            {
                if (line.Contains("Timestamp") && line.Contains("LiveStandby") && line.Contains("peak"))
                {
                    start = true;

                }
            }
        }
        sr.Close();

        i=0;
        foreach (string s in col)
        {
            if (i < number_of_column -1)
            {
4

5 に答える 5

7

while ループに入らない場合、変数には値が割り当てられていません。

if で else ブランチをヒットした場合、変数には値が割り当てられていません。

これらが、このエラー メッセージが表示される理由です。

変数を宣言するときに値を割り当てることで、これを修正できます。

C# では、使用する前にローカル変数を初期化する必要があります。メンバー変数の場合、これは必要ありません。デフォルト値が自動的に割り当てられます。

于 2013-02-28T16:48:42.843 に答える
2

コードを完全に洗練

  1. fileその後file1は冗長でしたが、ステートメントをマージして、意味的にさらに意味のあるものにすることができます。

  2. if (start == true)不必要に複雑ですif(start)

  3. likeusing Statementを正しく使用するには、 woule be better を使用してください。IDisposableStreamReader

  4. Path.Combine Method2 つの文字列をパスに結合する必要があります。

  5. 配列を順番に繰り返し処理しているため、2 つforeachの s は である方がよいでしょう。for

  6. number_of_column配列の反復のためにカウントを格納しているだけであることを使用する必要がないことを理解するのは難しくありません。


コード:

static void Main(string[] args) {
    int number_of_column; // never used

    if(Directory.Exists(path)) {
        var file1=(
            from f in dir.GetFiles()
            orderby f.LastWriteTime
            select f
            ).First().ToString();

        Console.WriteLine(file1);

        using(var sr=new StreamReader(Path.Combine(path, file1)))
            for(String line; null!=(line=sr.ReadLine()); ) {
                if(start) {
                    var line1=line.Split(',');

                    for(var i=0; i<line1.Length; ++i) {
                        var s=line1[i];

                        if("0"!=s||!String.IsNullOrEmpty(s))
                            col[i]="checked";
                    }

                    continue;
                }

                if(
                    line.Contains("Timestamp")
                    &&
                    line.Contains("LiveStandby")
                    &&
                    line.Contains("peak"
                    ))
                    start=true;
            }

        for(var i=0; i<col.Length; ++i) {
            // following lines are no more needed
            // if(i<number_of_column-1) {
            // }
        }
    }
}
于 2013-02-28T17:18:28.300 に答える
0

最初の行を次のように変更してみてください。

static void Main(string[] args){ int number_of_column = 0;if (Directory.Exists(path))

またはフォーマット済み:

static void Main(string[] args)
{
    int number_of_column = 0;
    if (Directory.Exists(path)) ...
于 2013-02-28T16:49:39.507 に答える
0

これは、初期値を割り当てていないことを意味します。

これを交換してください

int number_of_column;

int number_of_column = 0;

これで問題が解決します。

于 2013-02-28T16:49:39.787 に答える
0

副作用を防ぐためのメカニズムとして、C# では、初期化されていない変数 (宣言されているが明示的に値が設定されていない変数) の使用が許可されていません。そのため、エラーが発生します。ゼロに初期化すると、問題が解決します。

于 2013-02-28T16:52:37.023 に答える