在返回类型的C#方法定义前添加“new”?

时间:2009-07-23 15:13:10

标签: c# .net methods

所以我最近在工作中遇到了这个C#语句:

public new string SomeFunction(int i)
{
     return base.SomeFunction(i);
}

我在网上搜索,但我想我可以在这里找到更好的答案。

现在,我猜这一切都是返回一个新字符串,其值与调用base.SomeFunction(i)返回的字符串相同......这是正确的吗?

此外,这个功能是否存在于其他语言中(具体是java)?

修改:
在我的具体情况下,base.SomeFunction受到保护,虚拟......这会有所作为吗?感谢

3 个答案:

答案 0 :(得分:9)

不,这意味着它在基类中隐藏 SomeFunction而不是覆盖它。如果基类中没有一个方法具有相同的签名,则会出现编译时错误(因为你试图隐藏那些不存在的东西!)

有关详细信息,请参阅this question。 (我不认为这是一个重复的问题,因为它是关于“新”的内容,而不仅仅是在缺席时讨论警告。)

我在这个问题的答案中重复了一些例子,只是为了保存点击...

以下是隐藏方法和覆盖方法之间区别的示例:

using System;

class Base
{
    public virtual void OverrideMe()
    {
        Console.WriteLine("Base.OverrideMe");
    }

    public virtual void HideMe()
    {
        Console.WriteLine("Base.HideMe");
    }
}

class Derived : Base
{
    public override void OverrideMe()
    {
        Console.WriteLine("Derived.OverrideMe");
    }

    public new void HideMe()
    {
        Console.WriteLine("Derived.HideMe");
    }
}

class Test
{
    static void Main()
    {
        Base x = new Derived();
        x.OverrideMe();
        x.HideMe();
    }
}

输出结果为:

Derived.OverrideMe
Base.HideMe

答案 1 :(得分:1)

'new'是成员隐藏关键字。来自文档:

  

当用作修饰符时,新的   关键字显式隐藏成员   继承自基类。当你   隐藏继承的成员,派生   该成员的版本取代了   基类版本。虽然你可以   隐藏成员而不使用   新修饰符,结果是警告。   如果你使用new来明确隐藏一个   会员,它抑制了这个警告和   记录派生的事实   版本旨在替代。

答案 2 :(得分:1)

示例代码背后的意图是在子代中使该函数公开,即使它在基础中受到保护。该语言不允许您在子项中使类成员 more 可见,因此这将声明一个恰好具有相同名称的新函数。这隐藏了基本功能,但是再一次,调用者首先不能访问那个,而这个函数调用基类函数。

简而言之,代码有点像黑客,但它确实有意义。但这可能暗示基地可能需要重构其功能。