非静态字段,方法或属性需要对象引用

时间:2011-08-10 19:16:07

标签: c# function

嘿所有我是C#的新手,我试图像这样调用函数 closeComm()

    public void closeComm()
    {
        commIRToy.ClosePort();
        commProj.ClosePort();
        commTV.ClosePort();
        commAV.ClosePort();
    }

    public static void loadAnotherRemote()
    {
        closeComm();
    }

但是,这给了我一个错误:非静态字段,方法或属性需要对象引用

当我这样尝试时:

    public static void closeComm()
    {
        commIRToy.ClosePort();
        commProj.ClosePort();
        commTV.ClosePort();
        commAV.ClosePort();
    }

    public static void loadAnotherRemote()
    {
        closeComm();
    }

我可以调用该函数,但是所有的commIRToy,commProj,co​​mmTV和commAV都有的错误。非静态字段,方法或属性需要对象引用相反的错误我反过来了....

6 个答案:

答案 0 :(得分:3)

您需要将commIRToycommProjcommTVcommAV字段设为静态,或者从loadAnotherRemote方法中删除静态关键字

答案 1 :(得分:1)

非静态方法对类的特定实例进行操作。访问成员变量时,它访问从中调用的实例的成员。 static 方法不需要调用任何特定实例。由于它不是通过实例调用的,因此它不能引用任何特定于实例的变量,只能引用静态变量。

在您的示例中,我假设(没有看到所有代码)您可以将所有方法和属性设置为静态以使其工作。

这意味着您应该在static等声明前添加单词commIRToy

static PCComm.CommunicationManager commIRToy = new PCComm.CommunicationManager();

这将使它成功 - 但从长远来看,我不会说它是最好的设计。

答案 2 :(得分:1)

您收到第一个错误,因为loadAnotherRemote()是静态的,但正在尝试调用非静态方法。
您收到第二个错误,因为在您现在调用静态方法时,变量commIrTroy等是类的实例而不是静态的。
虽然因为我不确定这些方法的背景,但很难给你一个答案。

答案 3 :(得分:1)

简答:

试试这个:

public static void loadAnotherRemote()
{
    new TypeThatContainsCloseComm(…).closeComm();
}

更长的回答:

首先,您需要了解static:声明的任何内容static不属于某个类型的任何特定实例,但属于本身。也就是说,如果你有静态方法TypeThatContainsCloseComm.closeComm,那么你可以用:

来调用它
   TypeThatContainsCloseComm.closeComm(…)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
//     name of the type!

但是,所有未声明static的方法只能在特定的实例上调用,因为它们属于它们:

   var commProj = new TypeThatContainsClosePort();  // <- create a instance here
   commProj.ClosePort();
// ^^^^^^^^
// instance of a type!

现在,回到原始代码:

public void closeComm()
{
    commIRToy.ClosePort();
    commProj.ClosePort();
    commTV.ClosePort();
    commAV.ClosePort();
}

public static void loadAnotherRemote()
{
    // this method is static, therefore we are not "within" an object instance
    closeComm();  // ERROR: closeComm is not static, therefore you need
                  // some object instance to call it!
}

......回到第二次尝试:

public static void closeComm()
{
    commIRToy.ClosePort();  // ERROR if commIRToy, commProj, commTV, commAV
    commProj.ClosePort();   //       are not declared static, because we're
    commTV.ClosePort();     //       in a static method and thus "outside" an
    commAV.ClosePort();     //       object instance, yet these fields are
}                           //       declared within one.

public static void loadAnotherRemote()
{
    closeComm();  // this call is fine now, since `closeComm` is static,
                  // no object instance is required to call it.
}

答案 4 :(得分:0)

在类的上下文中执行static方法。您可以随时调用classname.StaticMethod(),因为编译器可以明确地理解它。

省略static时,定义在对象(类的实例)的上下文中执行的方法,通常使用new classname();创建。

无法编译对closeComm()的调用,因为编译器不知道执行该方法的对象。

你可以从和实例方法调用static方法,但不是相反,除非你有一个上下文对象。

如果需要在特定对象的上下文中调用closeComm()(可能是因为你有很多实例),loadAnotherRemote()方法需要一个对象引用。

答案 5 :(得分:0)

C#规格:

  

10.6.2静态和实例方法

     

当方法声明包含静态修饰符时,该方法是   据说是一种静态的方法。当没有静态修饰符时,   方法被称为实例方法。

     

静态方法不能在特定实例上运行,它是一个   编译时错误,以静态方法引用它。

MSDN:

  

静态会员

     

静态方法,字段,属性或事件甚至可以在类上调用   当没有创建类的实例时。如果有任何实例   该类是创建的,它们不能用于访问静态   会员。只存在一个静态字段和事件副本,静态   方法和属性只能访问静态字段和静态   事件即可。静态成员通常用于表示数据或   不响应对象状态而改变的计算;对于   例如,数学库可能包含用于计算的静态方法   正弦和余弦。

在我看来,您正试图使用​​静态方法管理实例。如果是这样,如果您只需要一次管理一个实例或者让静态方法管理静态实例列表,请考虑使用单例模式。如果不是,那么该方法不会是静态的,因此除非它不仅仅是closeComm();,否则它将毫无用处。

此致,Maxime