2012-12-06 53 views
0

裏面一個公共類的公共方法實例成員問題:關於在公共類

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,因此設置(即靜態類)還是隻是一個基本問題,或者上午我錯過了一些小片段?

回答

1

你的類是靜態的,因此你不能有任何實例成員,因爲你永遠不會實例化這個類。

爲了能夠使用RunTimerJobs()方法,你需要創建LogReporting類的instance,即

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

這顯然是因爲你的類定義爲static雖然不會工作,你不能創建它的實例。

要麼你的方法static或從你的class聲明中刪除static關鍵字 - 取決於你需要什麼。

我在您的方法中看不到實例相關的邏輯,所以它應該是可以安全地將其標記爲static

記住

類可以有實例和靜態成員的混合物,只要該類沒有標記靜態

只有當你知道,所有成員(屬性,方法等)將是靜態的,以及標記類靜態。

1

編譯器在這裏很清楚。您正在聲明一個靜態類,而靜態類只能包含靜態成員。所以這是好的:

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

這是好的:

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

但是,這並不:

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

如果你想聲明實例成員,你爲什麼要申報LogReporting作爲一個靜態類?

+0

我打算將工作添加到預先存在的文件中。在團隊領導的建議下,我把它放在這個'LogReporting'中。我假設他忘記/忽略了這是一個靜態類。 – wjhguitarman

+1

@wjhguitarman看着你的代碼,它沒有執行任何實例相關的邏輯,所以假設你可以將'RunTimerJobs()'方法標記爲靜態,這應該是安全的。 – Marko

1

當類標記爲靜態,則所有它的成員應該是靜態(實例的創建是不允許的)。你可以閱讀更多關於msdn的靜態類。

所以,如果你想有實例(非靜態)方法,然後從類定義靜態關鍵字:

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

在這種情況下,你應該創建LogReporting實例調用你的方法:

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

另一種選擇適合你 - 讓你的方法靜態

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

在這種情況下你不需要的LogReporting實例:

LogReporting.RunTimerJobs(); 
0

你嘗試:

public static void RunTimerJobs()

0

對於靜態類成員也必須是靜態的。如果你不能使成員靜態,那麼你也必須使這個類不是靜態的。

如果可以的話,使用非靜態類通常是一個好主意,因爲靜態類增加了單元測試的複雜性,因爲它們不容易被模擬出來。當然,如果你有一個合法的需要使用靜態類,那麼一定要這樣做。