Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与公共类中的公共方法有关的实例成员问题_C#_Static Members - Fatal编程技术网

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()
方法标记为静态。