关于公共类中的公共方法的实例成员问题

时间:2012-12-06 20:50:07

标签: c# static-members

公共课内:

    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()“无法在静态类中声明实例成员” 据我所知,我声明的'实例成员'都没有被标记为static,所以设置(即静态类)只是一个基本问题,还是我错过了一些小片段? / p>

5 个答案:

答案 0 :(得分:1)

编译器在这里很清楚。您声明了一个 static 类,而静态类只能包含 static 成员。所以这没关系:

public class NonStaticClass
{
    public void InstanceMethod() {}
}

这没关系:

public static class StaticClass
{
    public static void StaticMethod() {}
}

但这不是:

public static class StaticClass
{
    public void InstanceMethod() {}
}

如果您想声明实例成员,为什么要将LogReporting声明为静态类?

答案 1 :(得分:1)

当课程标记为静态时,所有成员都应该是静态的(不允许创建实例)。您可以在msdn上阅读有关静态类的更多信息。

因此,如果您想要实例(非静态)方法,请从类定义中删除 static 关键字:

public class LogReporting
{
     public void RunTimerJobs()
     {
         //...
     }
}

在这种情况下,您应该创建LogReporting实例来调用您的方法:

LogReporting log = new LogReporting();
log.RunTimerJobs();

另一种选择 - 使您的方法静态

public static class LogReporting
{
     public static void RunTimerJobs()
     {
         //...
     }
}

在这种情况下,您不需要LogReporting的实例:

LogReporting.RunTimerJobs();

答案 2 :(得分:1)

您的类是静态的,因此您不能拥有任何实例成员,因为您永远不会实例化该类。

为了能够使用RunTimerJobs()方法,您需要创建instance类的LogReporting,即

LogReporting logReporting = new LogReporting();
logReporting.RunTimerJobs();

这显然不会起作用,因为您的课程定义为static而您无法创建实例。

根据您的要求,制作您的方法static或从static声明中删除class关键字。

我发现您的方法中没有与实例相关的逻辑,所以安全地标记为static

<强>记住

  

只要类没有标记为 static ,类就可以混合使用实例和静态成员。

  

当您知道所有成员(属性,方法等)也是静态的时,只将类标记为静态。

答案 3 :(得分:0)

你有没有尝试过:

public static void RunTimerJobs()

答案 4 :(得分:0)

对于静态类,成员也必须是静态的。如果您无法使成员成为静态,那么您也必须使该类非静态。

如果可以的话,使用非静态类通常是个好主意,因为静态类会增加单元测试的复杂性,因为它们不能轻易地被模拟。当然,如果你有合法的需要使用静态类,那么一定要这样做。