我自己的类,有一个实例,但得到"需要一个对象引用"

时间:2018-06-14 08:21:21

标签: c#

我正在努力学习C#。我已经完成了几个在线课程,而且我试图创建一些真正的基本代码而不用现在的教程来嵌入我学到的东西.......我和我#39;我做得不好: - (

如果这是一个过于基本的问题或之前已经回答过,我表示道歉 - 我已经完成了对#34的搜索;需要一个对象引用"在大多数情况下,问题似乎是有人试图使用静态方法之类的实例方法,但这不是(我认为)我所做的......

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

以下是代码:

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中)我得到了#34;需要一个对象引用对于非静态字段,方法或属性&#39; TestClass.peopleList&#39;&#34;。

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

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

但是遇到了同样的问题。

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

非常感谢。

3 个答案:

答案 0 :(得分:1)

如果要使用静态方法,则需要使成员和方法保持静态。

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方法。

答案 1 :(得分:0)

或者您可以创建一个静态类来处理添加元素。

public static class Util
{
    public static int AddPerson(Person p, Dictionary<string, Person> list)
    {
        list.Add(p.Name, p);
        return list.Count;
    }  
}  

答案 2 :(得分:0)

我在这里看到其他人的回复,但我认为他们可能不会向您澄清您的问题,因为您可能不知道代码中的“静态”含义。让我们从那里开始。

当你有一个物体时:

public class A() 
{
    public string Code { get;set; }
}

必须实例化此对象才能访问其属性“代码”。 意思是,该属性代码链接到实例化对象'A'。

但静态用于使方法,属性或对象可访问,而不会被异常实例化。意思是,这些项在没有实例化对象的情况下始终可用。如果它们具有对实例化对象的引用,则在未实例化时调用该方法时会出现问题。

在您的示例中会发生这种情况。

(TLDR;)简单解决问题的方法是从方法中删除“静态”。

或者,如果您希望将此方法用作静态,则需要对其进行扩展:

public static int AddPerson(TestClass testClass, Person p)
{
    testClass.PeopleList.Add(p.Name, p);
    return testClass.PeopleList.Count;
}

但是这也要求你在类中公开PeopleList以便访问它。这是因为在创建静态方法时,它不属于该对象的实例,而只是属于该对象的所有实例而不属于该实例。它存在于它之外。