我在EntityFramework的DBSET类中找到了以下代码段:
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();
}
这在DbSet
(DbSet<TEntity> : DbQuery<TEntity>
)类中:
/// <inheritdoc />
[SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate")]
[EditorBrowsable(EditorBrowsableState.Never)]
public new Type GetType()
{
return base.GetType();
}
为什么或何时使用new
关键字,然后调用基本实现?
让我们考虑替代方案。
-
不要覆盖或新的东西
问题:没有应用属性的代码。
-
只是覆盖它
问题:
GetType
不是虚拟的。
因此,您使用new
并打电话给base
。
真正的问题是[EditorBrowsable(EditorBrowsableState.Never)]
有什么重要的事情,以至于他们遇到了所有这些麻烦?我唯一的猜测是,他们觉得开发人员将GetType
与Intellisense中的ElementType
混淆。
我认为使用新关键字的原因是您要更改访问修饰符时。如果您的方法在基类中受到保护,则可以使用新关键字在孩子类中公开它。