首页 > 解决方案 > 我自己的类,有一个实例,但得到“需要对象引用”

问题描述

我正在努力学习 C#。我已经完成了几门在线课程,现在我正在尝试创建一些没有教程的非常基本的代码来嵌入我所学的内容......而且我做得不太好:-(

如果这是一个太基本的问题或之前已经回答过,我深表歉意 - 我已经搜索了“需要对象引用”,并且在大多数情况下,问题似乎是有人试图使用像静态这样的实例方法方法,但这不是(我认为)我所做的......

我正在尝试做一些非常基本的事情 - 创建一个 Dictionary 以包含 Person 对象,并使用一种方法允许添加一个还返回字典中项目的当前计数的人员。

这是代码:

public class TestClass
{
    private Dictionary<string, Person> peopleList;

    public TestClass()
    {
        peopleList = new Dictionary<string, Person>();
    }
    public static int AddPerson(Person p)
    {
        peopleList.Add(p.Name, p);
        return peopleList.Count;
    }

}

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }

}

我在顶部还有以下声明:

using System.Collections.Generic;

在我的代码中,我尝试创建一个构造函数来初始化 Dictionary 对象,但是每当我尝试使用 peopleList,(在 AddPerson 中)我得到“非静态字段、方法或属性需要对象引用'TestClass.peopleList'”。

我还尝试在不使用构造函数的情况下初始化字段,如下所示:

    private Dictionary<string, Person> peopleList = new Dictionary<string, Person>();

但遇到了同样的问题。

我知道我错过了一些明显的东西......但无法发现它。任何人都可以帮忙吗?

非常感谢。

标签: c#

解决方案


如果要从静态方法中使用成员和方法,则需要将它们设为静态。

public class TestClass
{
    private static Dictionary<string, Person> peopleList;

    public static TestClass()
    {
        peopleList = new Dictionary<string, Person>();
    }
    public static int AddPerson(Person p)
    {
        peopleList.Add(p.Name, p);
        return peopleList.Count;
    }    
}

如果你不这样做,你正试图从一个没有实例调用的方法访问和实例成员/方法。这没有任何意义,也无法正常工作。编译器告诉你这个。

另一种选择(在这种情况下也是更好的选择)是不让它成为静态的。然后你也会得到正确的行为:

public class TestClass
{
    private Dictionary<string, Person> peopleList;

    public TestClass()
    {
        peopleList = new Dictionary<string, Person>();
    }
    public int AddPerson(Person p)
    {
        peopleList.Add(p.Name, p);
        return peopleList.Count;
    }    
}

但是,如果这样做,则必须创建一个实例TestClass来调用该AddPerson方法。


推荐阅读