簡體   English   中英

復制的私有成員變量是否比共享的受保護成員更好?

[英]Are duplicated private member variables preferable to a shared protected member?

這是我最近在C#代碼庫中注意到的一個慣用法:

class Base
{
   private readonly MemberClass _memberVariable;

   public Base(MemberClass memberValue)
   {
       _memberVariable = memberValue;
   }

   // methods accessing memberVariable...
}

class Derived : Base
{
   private readonly MemberClass _memberVariable;

   public Derived(MemberClass memberValue) : base(memberValue)
   {
       _memberVariable = memberValue;
   }

   // methods accessing memberVariable...
}

基類及其派生類均具有一個在其各自的構造函數中初始化的成員變量,但每個子類都具有其成員的private副本,而不是將成員聲明為在基類中protected並在其子類中可用。 。

我對此的第一反應是這是不必要的重復。 經過更多思考,我認為重復可能是合理的,因為它減少了基類和派生類之間的耦合量,並防止了基類的更改而導致子類的意外破壞。

protected成員在C#中是否“被認為有害”?

我認為受保護的字段是有害的,並且如果值始終保持相同,那么我也將認為數據復制有害。 但是,基類可以通過屬性公開私有字段的值:

class Base
{
   private readonly MemberClass memberVariable;

   protected MemberClass MemberProperty { get { return memberVariable; } }    

   public Base(MemberClass memberValue)
   {
       this.memberVariable = memberValue;
   }

   // methods accessing memberVariable or MemberProperty...
}

class Derived : Base
{
   public Derived(MemberClass memberValue) : base(memberValue)
   {
   }

   // methods accessing MemberProperty...
}

在C#6中,基類變得更簡單:

class Base
{
   protected MemberClass MemberProperty { get; }    

   public Base(MemberClass memberValue)
   {
       this.MemberProperty = memberValue;
   }

   // methods accessing MemberProperty...
}

那仍然是一個由私有readonly字段支持的受保護屬性-只是編譯器為您完成了所有樣板工作。

受保護的成員在C#中是否“被認為有害”?

成員一般? 不,肯定的。 有很多充分的理由在C#代碼中擁有protected成員。

此外,我認為您在示例中使用的代碼顯然已損壞。 始終擁有兩個完全相同的值的副本非常浪費,並且如果有的話,很可能會產生錯誤(一旦您擁有兩個應該具有相同值的字段,現在您就有機會使這些值不相同相同,因此在某個地方破壞了一些代碼)。


至於protected 區的具體問題? 在這里,我至少會在某種程度上不同意喬恩的觀點:對於readonly字段,恕我直言,在某些情況下完全可以。

將這樣的字段封裝在屬性中的主要原因是這樣,以便稍后可以詳細說明實現而不必重新編譯依賴的代碼(假定代碼在不同的程序集中)。

但是恕我直言,這樣一個領域很可能永遠不需要詳細說明它的實現。 通常將此類字段用作恆定值的來源。 除了返回字段值之外,具有更復雜功能的getter並不是全部都罕見(盡管這並非完全罕見)(我認為最大的例外是延遲初始化的值)。

目前,我們大多數人都在使用C#5或更早版本,並且在一段時間內可能是正確的。 在C#6語法廣泛可用之前,我要說的是, 在某些特定情況下 ,使用readonly protected字段是簡潔的一種很好的讓步,而不會造成重大的維護/正確性危害。

自然,代碼變得越復雜,良好,安全的抽象就越有用,並且您越有可能堅持使用真正封裝的只讀屬性。

但是作為絕對規則? 不,我認為沒有必要全面禁止readonly protected字段。

暫無
暫無

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

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