嘿所有我是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,commTV和commAV都有的错误。非静态字段,方法或属性需要对象引用相反的错误我反过来了....
答案 0 :(得分:3)
您需要将commIRToy
,commProj
,commTV
和commAV
字段设为静态,或者从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