仅返回base.method时,用新关键字隐藏方法的原因是什么?



我在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();
}

这在DbSetDbSet<TEntity> : DbQuery<TEntity>)类中:

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

为什么或何时使用new关键字,然后调用基本实现?

让我们考虑替代方案。

  1. 不要覆盖或新的东西

    问题:没有应用属性的代码。

  2. 只是覆盖它

    问题:GetType不是虚拟的。

因此,您使用new并打电话给base

真正的问题是[EditorBrowsable(EditorBrowsableState.Never)]有什么重要的事情,以至于他们遇到了所有这些麻烦?我唯一的猜测是,他们觉得开发人员将GetType与Intellisense中的ElementType混淆。

我认为使用新关键字的原因是您要更改访问修饰符时。如果您的方法在基类中受到保护,则可以使用新关键字在孩子类中公开它。

最新更新