C# 我自己的类,有一个实例,但是得到;“需要对象引用”;

C# 我自己的类,有一个实例,但是得到;“需要对象引用”;,c#,C#,我正在努力学习C。我已经完成了几门在线课程,我正在尝试在没有教程的情况下创建一些真正的基本代码来嵌入我所学的内容……但我做得不太好:-( 如果这是一个太基本的问题或以前已经回答过,我很抱歉-我已经搜索过“需要对象引用”,在大多数情况下,问题似乎是有人试图使用实例方法,比如静态方法,但我(我想)没有这样做 我正在尝试做一些非常基本的事情——创建一个包含Person对象的字典,并使用一个允许添加Person的方法,该方法还可以返回字典中当前项目的计数 代码如下: public class TestC

我正在努力学习C。我已经完成了几门在线课程,我正在尝试在没有教程的情况下创建一些真正的基本代码来嵌入我所学的内容……但我做得不太好:-(

如果这是一个太基本的问题或以前已经回答过,我很抱歉-我已经搜索过“需要对象引用”,在大多数情况下,问题似乎是有人试图使用实例方法,比如静态方法,但我(我想)没有这样做

我正在尝试做一些非常基本的事情——创建一个包含Person对象的字典,并使用一个允许添加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; }

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

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

    private Dictionary<string, Person> peopleList = new Dictionary<string, Person>();
private Dictionary peopleList=new Dictionary();
但也有同样的问题

我知道我错过了一些明显的东西…但我看不出来。有人能帮忙吗


非常感谢。

如果要从静态方法使用成员和方法,则需要将其设置为静态

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;
    }    
}
公共类TestClass
{
私有静态字典人物列表;
公共静态TestClass()
{
peopleList=新字典();
}
公共静态int AddPerson(Person p)
{
添加(p.Name,p);
返回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
{
私人字典人物列表;
公共测试类()
{
peopleList=新字典();
}
公共int AddPerson(个人p)
{
添加(p.Name,p);
返回peopleList.Count;
}    
}

但是,如果执行此操作,则必须创建一个
TestClass
实例来调用
AddPerson
方法。

或者可以创建一个负责添加元素的类static

public static class Util
{
    public static int AddPerson(Person p, Dictionary<string, Person> list)
    {
        list.Add(p.Name, p);
        return list.Count;
    }  
}  
公共静态类Util
{
公共静态int AddPerson(Person p,字典列表)
{
列表。添加(p.名称,p);
返回列表。计数;
}  
}  

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

当您拥有一个对象时:

public class A() 
{
    public string Code { get;set; }
}
必须实例化此对象才能访问其属性“Code”。 也就是说,该属性代码链接到实例化对象“A”

但静态用于使方法、属性或对象在没有实例化对象的情况下可访问。这意味着,这些项在没有实例化对象的情况下始终可用。如果它们引用了实例化对象,则在未实例化该方法时调用该方法可能会造成问题

这在您的示例中发生

(TLDR;)解决问题的方法是从方法中删除“static”

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

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

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

确定AddPerson为什么是静态的?您肯定希望它链接到对象的实例吗你的类可以有两个列表?其次,如果你调用static,它将没有一个列表可连接..而且你还没有展示如何为初学者创建你添加的人:不幸的是,
Main()
必须是静态的。但是在你自己的代码中,你应该尽可能避免
静态的
。好的-谢谢。对不起-太多新的关键字和想法在我的脑海中游荡,而且还没有整理好。谢谢你的帮助。我在你编辑你的答案时发布了我的答案。现在删除它
public static int AddPerson(TestClass testClass, Person p)
{
    testClass.PeopleList.Add(p.Name, p);
    return testClass.PeopleList.Count;
}