C#在静态函数中访问非静态成员

C#在静态函数中访问非静态成员,c#,static,member,C#,Static,Member,所以我有一个函数: List<string> names = new string(); private static void getName(string name) { names.add(name); } 列表名称=新字符串(); 私有静态void getName(字符串名称) { 名称。添加(名称); } 当我尝试编译时,我得到一个: “非静态字段需要对象引用”通知。 要使此成员(名称)与getName兼容,我必须做些什么 我需要它是非静态的或转换的,因为我想

所以我有一个函数:

List<string> names = new string();

private static void getName(string name)
{
    names.add(name);
}
列表名称=新字符串();
私有静态void getName(字符串名称)
{
名称。添加(名称);
}
当我尝试编译时,我得到一个: “非静态字段需要对象引用”通知。 要使此成员(名称)与getName兼容,我必须做些什么


我需要它是非静态的或转换的,因为我想将结果放入其他非静态函数和表单中。

如果要从静态方法内部使用它,则需要将
名称设置为静态:

 // If this is static, you can use it from your static method
 static List<string> names = new List<string>();
//如果这是静态的,您可以从静态方法使用它
静态列表名称=新列表();

问题在于
getName
是在您的类型上定义的,而不是在该类型的实例上定义的。但是,
名称
已定义,因此类型的每个实例都有自己的值。

静态方法无法访问类字段。将名称设置为静态,或将getName()设置为非静态。你说的“兼容”是什么意思。问问你自己。。。该方法是否需要是静态的?它的用途是什么?您打算如何使用它?

您不能以这种方式访问它,您需要实例化包含成员的类。

您需要告诉系统您感兴趣的名称列表。它是对象状态的一部分,类的一个实例。。。但是哪一个呢?可能您已经创建了该类的多个实例-可能您没有创建该类的任何实例。静态方法对此不可见-那么您希望它从哪个实例获取
names
变量值

再举一个例子,假设我们有这样一个类:

public class Person
{
    public double MassInGrams { get; set; }
    public double HeightInMetres { get; set; }

    public static double ComputeBodyMassIndex()
    {
        // Which person are we interested in?
    }
}

Person p1 = new Person { MassInGrams = 76203, HeightInMetres = 1.8 };
Person p2 = new Person { MassInGrams = 65000, HeightInMetres = 1.7 };

double bmi = Person.ComputeBodyMassIndex();
你希望结果是什么?您已要求
Person
类计算“BMI”,但没有告诉它要计算谁的BMI。你需要给它这些信息

针对您的情况的一些选项:

  • 名称
    改为静态
  • 将该方法更改为实例方法
  • 传入类的一个实例
  • 创建类的实例,可能会返回它
  • 以其他方式获取类的实例

顺便说一句,这是一个非常奇怪的方法名称,它添加了一个名称。它也有点非常规…

名称
是一个将存在于类实例中的对象,例如
MyClass mc=new MyClass()
然后您可以访问
mc.names
。静态字段可以在没有类实例的情况下仅使用类名进行调用,例如
MyClass.getName(“”)将起作用。因此,当你从逻辑上思考时,类不包含名称,只有“该类的实例”包含它。因此,您要么使该列表也是静态的,当您调用
MyClass.names
时,它在任何地方都是“相同的列表实例”,要么使getName方法非静态的,并且它将仅从实例调用,因此不可能使用
MyClass.getName(“”)
,但是
mc.getName(“”)
这是一个你到底想做什么的问题。

为什么getName是静态的?这是一个假设的简化情况。方法名应该是
AddName(string name)
@Drake:你可以从实例访问静态成员,但不能反过来。你能解释一下实例方法的解决方案吗。使用我创建的示例。我认为names当前是一个引用。@Drake:
names
将是对
列表
实例的引用-您需要对包含类的实例的引用。请看我的
Person
示例,以了解出现问题的原因。一旦你理解了这个问题,你可能会对该做什么有更多的想法。@Drake-为了
ComputeBodyMassIndex()
系统需要知道该在哪个人身上进行计算。因此,您传入一个Person对象,您的
ComputeBodyMassIndex()
现在接收该Person
public static double ComputeBodyMassIndex(Person p)
,然后可以计算BMI。在本例中,您希望将
字符串添加到
列表
。问题是
names
是类的一部分,当您创建该类的对象时,您可以直接访问名称。这不是我调用的函数,因此不适用。这是我需要访问的win32回调函数。回调是静态的,我的列表不是。@Drake:当你说它是win32回调函数时,你不清楚你的确切意思。你的意思是说,它以某种方式作为委托传递到Win32函数,然后被回调?如果是这样,只需将其作为实例方法,并使用正确的目标构造适当的委托即可。