簡體   English   中英

C#StyleCop - 對於像當前類成員這樣的基類成員使用“this。”前綴?

[英]C# StyleCop - Using “this.” prefix for base class members like current class members or not?

StyleCop有一個關於使用“this”的規則。 調用類成員的前綴(SA1101)。

這個規則是否適用於從其基類繼承的類的成員(例如方法)。

例:

class BaseClass
{
    protected void F1()
    {
        ...
    }
}    

class ChildClass : BaseClass
{
    protected void F2()
    {
        ...
    }

    protected void F3()
    {
        this.F2(); // This is correct acording to SA1101

        // F1 is a member of base class and if I dont put this prefix, stylecop will not show any message.
        this.F1(); // Is this correct?
        F1();      // Or this?
    }
}

我知道這只是為了更好的可讀性。

StyleCop Rule SA1101文檔實際上提到了這一點:

只要代碼包含對本地類的實例成員調用沒有以“this”為前綴的基類 ,就會違反此規則。

(重點由我自己添加)。 所以是的,規則需要this. 每次訪問實例成員時,無論該成員是在本地類中還是從基類繼承。

如果考慮對象繼承的規則,即使實際在BaseClass聲明了F1() ,它也會被ChildClass繼承,因此將其稱為this.F1()是有效的。 這就是StyleCop告訴你的事情。 通過this調用前綴,可以明確地調用類的當前運行時實例的F1() 實例方法。

實際上,將其稱為F1()this.F1()實際上是同義詞,但使用this前綴時,含義/意圖會變得更清晰。

你根本不應該在這里使用base前綴(即使它會編譯)因為F1()不是虛擬的並且在ChildClass被覆蓋。 使用base前綴的唯一原因是,當您重寫了虛擬基類成員並希望從覆蓋成員中顯式調用該基類成員時。 如果你確實使用了base前綴而沒有F1()是虛擬的, 那么在你創建F1()虛擬並在ChildClass添加覆蓋之前,一切都會有效。 此時,對base.F1()任何調用都將繼續調用BaseClass.F1()而不是ChildClass的新覆蓋。

我認為這是正確的,因為規則適用於所有方法,無論它們是否在基礎上定義。 就個人而言,我不是這個規則的忠實粉絲所以我只是禁用它。

我喜歡用base。 base.F1()為您的情況。 這可以防止意外地引用局部變量,並且可以直觀地提醒成員來自何處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM