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

时间:2011-07-07 19:22:08

标签: c# static member

所以我有一个功能:

List<string> names = new string();

private static void getName(string name)
{
    names.add(name);
}

当我尝试编译时,我得到一个: '非静态字段'通知需要“对象引用”。 我该怎么做才能使这个成员(名称)与getName兼容?

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

5 个答案:

答案 0 :(得分:10)

您需要告诉系统您感兴趣的名称列表。它是对象状态的一部分,是类的实例......但是哪一个?也许您已经创建了该类的几个实例 - 也许您已经创建了该类的 no 实例。静态方法没有可见性 - 那么您希望它从哪个实例获取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。你需要提供这些信息。

适合您情况的一些选项:

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

顺便说一句,对于添加名称的东西,这是一个非常奇怪的方法名称。这也有些不同寻常......

答案 1 :(得分:2)

如果要从静态方法中使用它,则需要使names为静态:

 // If this is static, you can use it from your static method
 static List<string> names = new List<string>();

问题是getName在您的类型上定义了,而不是在该类型的实例上定义。但是,names已定义,因此您的类型的每个实例都会获得自己的值。

答案 2 :(得分:1)

names是一个对象,它将存在于类的实例中,例如MyClass mc = new MyClass();然后您可以访问mc.names。可以使用类名调用静态字段而不使用类的实例,例如MyClass.getName("");会奏效。因此,当您在逻辑上思考时,该类不包含名称,只有“该类的实例”包含它。因此,您要么将该列表设置为静态,并且当您调用MyClass.names或将getName方法设置为非静态时,它将是“相同的List实例”,并且它将仅从实例调用,因此不会{{ 1}}是可能的,但MyClass.getName("")这是你正在努力做的事情。

答案 3 :(得分:0)

静态方法无法访问类字段。要么使名称为静态,要么使getName()非静态。你是什​​么意思“兼容”。问问自己......这个方法需要是静态的吗?它的目的是什么,你打算如何使用它?

答案 4 :(得分:0)

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