忽略方法签名定义中的返回类型有什么好处?

时间:2016-02-21 20:03:37

标签: c# .net overloading

MSDN Signatures and overloading包含以下方法签名定义:

  

方法的签名包括方法的名称和   每种形式的类型和种类(价值,参考或输出)   参数,按从左到右的顺序考虑。 a的签名   方法具体不包括返回类型 ,也不包括   包括可以为最右边指定的params修饰符   参数。

我期望看到的是方法签名应该包含返回类型,但它不包含。

忽略(不包括)返回类型到方法签名定义的利润是多少?你能举个例子吗?

3 个答案:

答案 0 :(得分:1)

这可能部分不正确,我确信这仅仅是完整答案的一部分,但让我们看看我是否能够澄清其中的至少一部分。既然你问过很多问题,我会尽量回答。

  1. 您不能忽略方法的返回类型 - 每次定义方法时,都必须定义一个返回类型(不包括匿名方法,这与此无关)。您始终会以voidstringint或其他方式开始您的方法定义。
  2. 覆盖不等于过载 - 重载方法意味着您可以使用不同的版本指定相同的方法。假设您有一个返回两个整数之和的方法。您可以定义以下方法:

    public int Sum()
    {
        return 1 + 1;
    }
    

    您可以通过声明另一个方法签名来重载此方法,该方法接受参数以使方法以稍微不同的方式工作,例如:

    public int Sum(int a)
    {
        return 1 + a;
    }
    

    在这里,您将有一个方法的两个不同的签名,您可以以不同的方式调用。 覆盖方法意味着您将方法的行为更改为全新方法。假设我的基类具有可覆盖的方法:

    public int Sum()
    {
        return 1 + 1;
    }
    

    覆盖这意味着:

    public override int Sum()
    {
        return 1 - 1;
    }
    

    覆盖意味着您取代原始方法并使用相同的签名

  3. 是的,就是这样。因为您只能定义一个具有相同签名的方法。 关于方法签名和返回类型,您必须了解的是它们不相关。请考虑以下方法:

    public int Sum(int a)
    {
        return 1 + a;
    }
    public int Sum(string a)
    {
        int b = int.Parse(a);
        return 1 + b;
    }
    

    这些方法具有相同的返回类型,但具有不同的签名,因为它们接受不同的参数。第一个采用整数,第二个采用字符串值。然而,它们产生相同的输出。

答案 1 :(得分:0)

是的,它没有。方法签名仅涉及方法名称,参数,是否ref / out并且它不包含返回类型。

重载,解决方案基于方法签名发生,因此有两个方法如下所示根本不会重载,因为它们只是因返回类型而不同。

public void foo(int data) {};

public int foo(int data) {};

答案 2 :(得分:0)

  

忽略退货类型有什么好处?你能举个例子吗?

我不确定这不是基于意见的,但最后提供方法重载应该是完成“同样的事情”,只是使用不同的输入。方法的返回类型不应该改变,否则它们可能不应该具有相同的名称,对吧?

  

术语“重载”和“覆盖”是否相关?

overloading正在提供新的方法签名,以实现相同的目标。

重载示例:

public string AddTotesToInput(string input)
{
    return string.format("totes {0}", input);
}

public string AddTotesToInput(int input)
{
    return string.format("totes {0}", input.ToString());
}

请注意上面的内容,他们使用不同的方法签名做同样的事情。

overriding为现有方法签名提供了新的实现。

示例:

public class Foo
{
    public virtual string AddTotesToInput(string input)
    {
        return string.format("totes {0}", input);
    }
}

public class NewFoo : Foo
{

    // requirements changed, and now we need "totes mcgotes" on new implementations of the Foo class
    public override string AddTotesToInput(string input)
    {
        return string.format("totes mcgotes {0}", input);
    }        

}
  

术语“方法签名”是否与“覆盖”相关?

我猜?您是否覆盖了特定的方法签名,因此它们必须是正确的?

  

“方法签名”的定义是否应包含退货类型?

不,但是,再次,似乎是一个意见问题。

从@ Rahul的回答中稍微考虑一下你是否有类似的课程

// Note that it's not possible for this to compile as they have the same name and method signature
public class Foo
{
    public void foo(int data) {};

    public int foo(int data) {};
}

作为这个类的消费者,我将如何指定被调用的内容?

示例:

public void DoStuff()
{
    int testData = 5;
    Foo f = new Foo();
    f.foo(testData);  // which one would get called?
}

有一个原因是它按原样编写:)