StringBuilder实例中的运行时错误

rem*_*rem 0 c# string stringbuilder

请帮助我理解这段代码有什么问题.(我正在尝试构建一个字符串,从文本文件中逐行获取部分字符串).

我 在行上得到一个运行时错误"在对象引用未设置为对象的实例中"strbuild.Append(str);

        StreamReader reader = new StreamReader("buf.txt", System.Text.Encoding.ASCII);
        StringBuilder strbuild = new StringBuilder();
        strbuild = null;

        while (reader.Peek() >= 0)
        {
            string str = null;
            str = reader.ReadLine().ToString();

            string segment = str.Substring(0, 1);

            if (segment == "A")
            {
                strbuild.Append(str); //here  i get an error
            }
            else if (segment == "B")
            {
                strbuild.Append("BET");
            }

        }
        printstr = strbuild.ToString();
        reader.Close();

        MessageBox.Show(printstr);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 10

看看这些线:

StringBuilder strbuild = new StringBuilder();
strbuild = null;
Run Code Online (Sandbox Code Playgroud)

你有什么期望发生的时候,你再调用strbuild.Append(...)?为什么你设置strbuild为null?

你似乎喜欢两行变量初始化 - 这是另一个例子:

string str = null;
str = reader.ReadLine().ToString();
Run Code Online (Sandbox Code Playgroud)

这将更容易阅读,因为:

string str = reader.ReadLine();
Run Code Online (Sandbox Code Playgroud)

(ReadLine已经返回一个字符串,因此您不需要调用ToString()结果.)

不过,我建议你使用using的语句StreamReader-否则,当抛出一个异常,你就可以让读者开放.

一个好处TextReader.ReadLine()是它在你完成后返回null.你不需要偷看,然后阅读.

最后,如果您只测试单个字符,则不需要子字符串 - 只需使用字符串索引器来获取字符.所以,你可以:

StringBuilder builder = new StringBuilder();

// Consider using File.OpenText
using (StreamReader reader = new StreamReader("buf.txt", Encoding.ASCII))
{
    string line;
    // Normally side-effect + test is ugly, but this is a common and
    // neat idiom
    while ((line = reader.ReadLine()) != null)
    {
        // TODO: What do you want to happen for empty lines?
        char segment = str[0];
        if (segment == 'A')
        {
            builder.Append(line);
        }
        else if (segment == 'B')
        {
            builder.Append("BET");
        }
    }
}
MessageBox.Show(builder.ToString());
Run Code Online (Sandbox Code Playgroud)


Adr*_*der 6

初始化后,您将stringbuilder设置为null.

更改

StringBuilder strbuild = new StringBuilder(); 
strbuild = null; 
Run Code Online (Sandbox Code Playgroud)

StringBuilder strbuild = new StringBuilder(); 
Run Code Online (Sandbox Code Playgroud)

遗漏了这条线

strbuild = null;
Run Code Online (Sandbox Code Playgroud)