添加';新';在C#方法定义的返回类型前面?

添加';新';在C#方法定义的返回类型前面?,c#,.net,methods,C#,.net,Methods,所以我最近在工作中遇到了这个C#声明: public new string SomeFunction(int i) { return base.SomeFunction(i); } 我在网上搜索过,但我想我可以在这里找到更好的答案 现在,我猜这只会返回一个新字符串,其值与调用base.SomeFunction(I)返回的字符串值相同。。。这是正确的吗 另外,这个特性是否存在于其他语言中(特别是java) 编辑: 在我的特定情况下,base.SomeFunction是受保护的,而不是虚

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

public new string SomeFunction(int i)
{
     return base.SomeFunction(i);
}
我在网上搜索过,但我想我可以在这里找到更好的答案

现在,我猜这只会返回一个新字符串,其值与调用
base.SomeFunction(I)
返回的字符串值相同。。。这是正确的吗

另外,这个特性是否存在于其他语言中(特别是java)

编辑:
在我的特定情况下,
base.SomeFunction
是受保护的,而不是虚拟的。。。这有区别吗?谢谢

不,这意味着它在基类中隐藏了
SomeFunction
,而不是重写它。如果基类中没有具有相同签名的方法,则会出现编译时错误(因为您试图隐藏不存在的内容!)

有关更多信息,请参阅。(我不认为这是一个重复的问题,因为这是关于什么是“新”的问题,而不仅仅是在没有警告时谈论警告。)

重复我回答这个问题的例子,只是为了保存点击

下面是隐藏方法和重写方法之间区别的示例:

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

“new”是成员隐藏关键字。从文档中:

当用作修改器时,新的 关键字显式隐藏成员 从基类继承的。当你 隐藏继承的成员、派生的 成员的版本将替换 基类版本。虽然你可以 隐藏成员而不使用 新的修改器,结果是一个警告。 如果使用“新建”显式隐藏 成员,它将抑制此警告并 记录了以下事实: 该版本旨在作为替代品


示例代码的目的是使函数在子函数中公开,即使它在基函数中受到保护。该语言不允许您使类成员在子类中更可见,因此这将声明一个新函数,该函数恰好具有相同的名称。这隐藏了基函数,但是调用方一开始就没有访问该函数的权限,而该函数调用基函数中的函数


简而言之,这段代码有点像黑客,但它确实有意义。不过,这可能是一个提示,说明base可能需要重构其功能。

那么如何命中derived.HideMe?通过将变量声明为derived而不是base类型。回答我刚才提出的一个问题也会很有帮助: