2017-09-06 20 views
6

我發現下面的代碼片段中的EntityFramework的DbSet類:當僅返回base.method時,用new關鍵字隱藏方法的原因是什麼?

public new Type GetType() 
{ 
    return base.GetType(); 
} 

我不知道爲什麼基本方法是隱藏的,所有的基類有方法來實現調用基地。

這是object.GetType()

[SecuritySafeCritical] 
[__DynamicallyInvokable] 
[MethodImpl(MethodImplOptions.InternalCall)] 
public extern Type GetType(); 

這是DbQuery類:

/// <inheritdoc /> 
[EditorBrowsable(EditorBrowsableState.Never)] 
[SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")] 
public new Type GetType() 
{ 
    return base.GetType(); 
} 

而且這是在DbSetDbSet<TEntity> : DbQuery<TEntity>)類:

/// <inheritdoc /> 
[SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")] 
[EditorBrowsable(EditorBrowsableState.Never)] 
public new Type GetType() 
{ 
    return base.GetType(); 
} 

爲什麼或當你會使用new關鍵字,然後調用基地實施?

+4

我看到的唯一目的是將它從Intellisense('EditorBrowsable'屬性)中隱藏起來。我不知道爲什麼它需要。 –

+0

@IvanStoev我也考慮過這個問題,但爲什麼在'DbQuery'和'DbSet'類中呢? – Mafii

+1

好問題:)當然冗餘,在重構等過程中可能會被遺忘。這些重載/覆蓋的整體需求是一個謎 - 你可以看到一個叫做'隱藏對象方法'的同一個區域複製/粘貼在許多地方[源](https://github.com/aspnet/EntityFramework6/blob/master/src/EntityFramework/Infrastructure/DbQuery.cs)沒有額外的評論*爲什麼*是代碼。 –

回答

3

讓我們考慮替代方案。

  1. 不要覆蓋或新的東西

    問題:有要應用的屬性沒有代碼。

  2. 只是覆蓋它

    問題:GetType不虛。

讓你在使用new一起base一個電話就走了。

真正的問題是什麼這麼重要[EditorBrowsable(EditorBrowsableState.Never)]他們去了所有這些麻煩?我唯一的猜測是,他們覺得開發人員會在智能感知中混淆GetTypeElementType

+0

謝謝,現在有道理。我只是好奇他們爲什麼再次在'DbSet'中添加同樣一段代碼,這已經在'DbQuery'中。 – Mafii

1

我想你會使用新關鍵字的一個原因是當你想改變訪問修飾符。如果您的方法在基類中受到保護,您可以使用new關鍵字在您的子類中公開它。

+0

這恐怕不能回答我的問題。基類「GetType」也是公共的,你可以在我發佈的代碼中看到。 – Mafii

相關問題