C# 与公共类中的公共方法有关的实例成员问题
在公共类中:C# 与公共类中的公共方法有关的实例成员问题,c#,static-members,C#,Static Members,在公共类中: public static class LogReporting 我有以下方法: public void RunTimerJobs() { SPAdministrationWebApplication centralAdmin = SPAdministrationWebApplication.Local; try { foreach (SPService service in cent
public static class LogReporting
我有以下方法:
public void RunTimerJobs()
{
SPAdministrationWebApplication centralAdmin = SPAdministrationWebApplication.Local;
try
{
foreach (SPService service in centralAdmin.Farm.Services)
{
Guid traceGuid = new Guid("d3beda82-38f4-4bc7-874f-ad45cebc9b35");
Guid eventGuid = new Guid("3ea057b3-0391-4c33-ac8d-412aecdda97d");
var traceJob =
from jobDefinition in service.JobDefinitions
where jobDefinition.Id == traceGuid
select jobDefinition;
if (traceJob != null && traceJob.Count() == 1)
{
traceJob.First().RunNow();
}
var eventJob =
from jobDefinition in service.JobDefinitions
where jobDefinition.Id == eventGuid
select jobDefinition;
if (eventJob != null && eventJob.Count() == 1)
{
eventJob.First().RunNow();
}
}
}
catch (Exception ex)
{
//Loggers.SharePointLogger logger = new Loggers.SharePointLogger();
//logger.WriteTrace(ex.Message, LogProduct.MonitoringView, LogTraceSeverity.Unexpected);
}
但是,它不允许我引用RunTimerJobs()
“不能在静态类中声明实例成员”来编译
据我所知,我声明的“实例成员”中没有一个可以标记为静态的,因此设置(即静态类)是否存在一个基本问题,或者我是否缺少一些小片段?编译器在这里非常清楚。您正在声明一个静态类,而静态类只能包含静态成员。所以这没关系:
public class NonStaticClass
{
public void InstanceMethod() {}
}
public static class StaticClass
{
public static void StaticMethod() {}
}
这没关系:
public class NonStaticClass
{
public void InstanceMethod() {}
}
public static class StaticClass
{
public static void StaticMethod() {}
}
但这不是:
public static class StaticClass
{
public void InstanceMethod() {}
}
如果您想声明实例成员,为什么要将
LogReporting
声明为静态类?编译器在这里非常清楚。您正在声明一个静态类,而静态类只能包含静态成员。所以这没关系:
public class NonStaticClass
{
public void InstanceMethod() {}
}
public static class StaticClass
{
public static void StaticMethod() {}
}
这没关系:
public class NonStaticClass
{
public void InstanceMethod() {}
}
public static class StaticClass
{
public static void StaticMethod() {}
}
但这不是:
public static class StaticClass
{
public void InstanceMethod() {}
}
如果要声明实例成员,为什么要将
LogReporting
声明为静态类?当类标记为static时,它的所有成员都应该是静态的(不允许创建实例)。您可以在上阅读有关静态类的更多信息
因此,如果您希望使用实例(非静态)方法,则从类定义中删除静态关键字:
public class LogReporting
{
public void RunTimerJobs()
{
//...
}
}
在这种情况下,您应该创建LogReporting
实例来调用您的方法:
LogReporting log = new LogReporting();
log.RunTimerJobs();
您的另一个选择-使您的方法成为静态的:
public static class LogReporting
{
public static void RunTimerJobs()
{
//...
}
}
在这种情况下,您不需要日志报告的实例
:
LogReporting.RunTimerJobs();
当类标记为static时,它的所有成员都应该是静态的(不允许创建实例)。您可以在上阅读有关静态类的更多信息 因此,如果您希望使用实例(非静态)方法,则从类定义中删除静态关键字:
public class LogReporting
{
public void RunTimerJobs()
{
//...
}
}
在这种情况下,您应该创建LogReporting
实例来调用您的方法:
LogReporting log = new LogReporting();
log.RunTimerJobs();
您的另一个选择-使您的方法成为静态的:
public static class LogReporting
{
public static void RunTimerJobs()
{
//...
}
}
在这种情况下,您不需要日志报告的实例
:
LogReporting.RunTimerJobs();
您是否尝试过:
publicstaticvoid RunTimerJobs()
您是否尝试过:
publicstaticvoid RunTimerJobs()
对于静态类,成员也必须是静态的。如果无法将成员设置为静态,则必须将类设置为非静态
如果可以的话,使用非静态类通常是一个好主意,因为静态类增加了单元测试的复杂性,因为它们不容易模拟出来。当然,如果您有使用静态类的正当需要,那么一定要这样做。对于静态类,成员也必须是静态的。如果无法将成员设置为静态,则必须将类设置为非静态
如果可以的话,使用非静态类通常是一个好主意,因为静态类增加了单元测试的复杂性,因为它们不容易模拟出来。当然,如果您有使用静态类的正当需要,那么请务必这样做。您的类是静态的,因此您不能拥有任何实例成员,因为您永远不会实例化该类 为了能够使用
RunTimerJobs()
方法,您需要创建LogReporting
类的实例,即
LogReporting logReporting = new LogReporting();
logReporting.RunTimerJobs();
但这显然不起作用,因为您的类被定义为静态
,而无法创建它的实例
使您的方法静态
或从类
声明中删除静态
关键字-具体取决于您的要求
我在您的方法中没有看到与实例相关的逻辑,因此将其标记为静态
应该是安全的
记住
类可以混合使用实例和静态成员,只要该类未标记为static
和
只有当您知道所有成员(属性、方法等)也将是静态的时,才将类标记为静态的
您的类是静态的,因此您不能有任何实例成员,因为您永远不会实例化该类
为了能够使用RunTimerJobs()
方法,您需要创建LogReporting
类的实例,即
LogReporting logReporting = new LogReporting();
logReporting.RunTimerJobs();
但这显然不起作用,因为您的类被定义为静态
,而无法创建它的实例
使您的方法静态
或从类
声明中删除静态
关键字-具体取决于您的要求
我在您的方法中没有看到与实例相关的逻辑,因此将其标记为静态
应该是安全的
记住
类可以混合使用实例和静态成员,只要该类未标记为static
和
只有当您知道所有成员(属性、方法等)也将是静态的时,才将类标记为静态的
我将进入并将工作添加到预先存在的文件中。在团队负责人的建议下,我将其放在这个日志报告中。我假设他忘记/忽略了它是一个静态类。@WJGUITARMAN查看您的代码,它没有执行任何与实例相关的逻辑,因此可以安全地假设您可以将RunTimerJobs()
方法标记为静态。我将进入并将工作添加到一个预先存在的文件中。在团队负责人的建议下,我将其放在这个日志报告中。我假设他忘记了/忽略了它是一个静态类。@wjjGuitarman查看您的代码,它没有执行任何与实例相关的逻辑,因此可以安全地假设您可以将RunTimerJobs()
方法标记为静态。