解决 从未分配过的字段,并且将始终将其默认值作为null

匿名的

活跃的成员
加入
90日,2020年9月29日
消息
42
编程经验
Beginner
我想建立一个控制台应用程序,在那里我存储与一个人的ID相关的汽车列表。我的班级是 -
C#:
class Person
{
    public int PersonID
    {
        get;
        set;
    }

    public string cars
    {
        get;
        set;
    }
    public List<string> carlist
    {
        get;
        set;
    } 
}
当我尝试将汽车添加到列表时,我正在获得空指针异常(对象引用对象引用未设置为对象的实例)。请参阅下面的代码 -
C#:
do
{
    Person person = new Person();
    PersonDetails personDetails = new PersonDetails();

    Console.WriteLine("Enter the Person ID");
    
    person.PersonID = Convert.ToInt32(Console.ReadLine());

    char response;

    do
    {
        Console.WriteLine("Enter his cars");
        
        person.cars = Console.ReadLine();
        person.carlist.Add(person.cars);

        Console.WriteLine("More cars ? Press y to contine");
        
        response = Convert.ToChar(Console.ReadLine());
    } while (response == 'y');

    personList.Add(person);

    Console.WriteLine("Press y if you wannt add data");
    
    ch = Convert.ToChar(Console.ReadLine());
} while (ch == 'y');

我也会为公众名单发出警告<string>Carlist未分配,默认值将始终为null。
我该如何解决 ?
 
最后编辑了主持人:

约翰

C#论坛主持人
工作人员
加入
2011年4月23日
消息
1,159
地点
挪威
编程经验
10+
请使用编辑器插入代码:

InsertCode.png.
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,720
地点
悉尼,澳大利亚
编程经验
10+
这两个错误消息与之相关。第二个是告诉你你永远不会为你分配任何东西 卡莱斯特 财产,所以它永远是 空值。这是如此,为什么你得到一个惊喜 空值ReferenceException. here:
C#:
person.carlist.Add(person.cars);
你怎么能打电话 添加 在一个不存在的对象上?实现集合属性的正确方法是这样的:
C#:
class Person
{
    public int PersonID
    {
        get;
        set;
    }

    public string Cars
    {
        get;
        set;
    }

    public List<string> CarList => new List<string>();
}
这是什么创造一个新的 列表<string> 对象并在创建父对象时将其分配给属性,并且它还使属性只读,因此调用代码可以在该列表中添加和删除项目,但它无法用新的列表替换整个列表。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,720
地点
悉尼,澳大利亚
编程经验
10+
请注意,表达式体属性语法仅在最近最近的C#中支持。在旧版本中,您将完成以下操作:
C#:
private List<string> _carList = new List<string>();

public List<string> CarList
{
    get
    {
        return _carList;
    }
}
显式声明并初始化备份字段,然后返回属性回器中的字段值。我上一篇文章中的代码基本上扩展到该编译时。
 

匿名的

活跃的成员
加入
90日,2020年9月29日
消息
42
编程经验
Beginner
谢谢,但我现在无法将对象添加到我的列表(卡莱斯特)

C#:
 do
                {
                    Console.WriteLine("Enter his cars");
                    person.cars = Console.ReadLine();
                    person.carlist.Add(person.cars);

                    Console.WriteLine("More cars ? Press y to contine");
                    response = Convert.ToChar(Console.ReadLine());
                } while (response == 'y');

                personList.Add(person);

                Console.WriteLine("Press y if you wannt add data");
                ch = Convert.ToChar(Console.ReadLine());
            } while (ch == 'y');
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,720
地点
悉尼,澳大利亚
编程经验
10+
抱歉,是我的错。错误的语法。这:
C#:
public List<string> CarList => new List<string>();
应该是这样的:
C#:
public List<string> CarList { get; } = new List<string>();
正如它,每次具有属性值时都会创建和返回一个新列表,而不是在开始时创建一次并返回每次相同的列表。
 

匿名的

活跃的成员
加入
90日,2020年9月29日
消息
42
编程经验
Beginner
现在,数据存储在列表中,但我无法显示元素。不知道必须是什么原因 - 我正在使用Linq通过人ID对汽车进行分组。人员ID会成功打印,但是对于我获得system.collections.generic.list 1 system.string的元素。 LINQ表达式是错误的(因为我是新的道歉)。
C#:
  Console.WriteLine("Grouping people with cars");
            var listgroupwithID = from result in personList
                                  group result by result.PersonID ;

            foreach (var groupresult in listgroupwithID)
            {
                Console.WriteLine("Id :" + groupresult.Key);

                foreach (var name in groupresult)
                    Console.WriteLine("Cars : " + name.carlist);
 
Last edited:

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,893
地点
切萨皮克,va.
编程经验
10+
No there is nothing wrong with the LINQ. The issue is just forgetting the in C#, most of the objects' ToString() implementations just return their type name, and that collection type objects, like lists, don't automatically return the collection contents when you call ToString(). Console.WriteLine() effectively calls ToString().
 
Last edited:

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,720
地点
悉尼,澳大利亚
编程经验
10+
如果你想实际显示一个 细绳 包含列表中的所有项目,那么您实际上必须创建这样一个 细绳。它不会自动发生。 细绳.join. 通常是这样做的方法:
C#:
Console.WriteLine("Cars : " + string.Join(", ", name.carlist));
这将创建一个逗号分隔 细绳 包含列表中的所有项目。

此外,请开始使用适当的外壳。 personid. 很好,但是,正如我在我的代码中所做的那样,你应该使用 卡莱斯特 而不是 卡莱斯特。一般而言,只有局部变量和私有字段应以小写字母开头,并且多字标识符中的每个单词也应该以大写字母开头。您可以在使用的框架中看到它的所有类型和成员。你应该这样做。

对于记录,您通常不应该结束名称"List"任何一个。可能存在有效的原因,但在这种情况下并非真正。收集属性通常只能是它包含的复数。在这种情况下, 汽车 或者 卡姆克姆斯 会更合适。
 
最佳 底部