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

本文关键字:返回类型 什么 方法 定义 | 更新日期: 2023-09-27 18:35:32

MSDN 签名和重载包含以下方法签名定义:

方法

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

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

在方法签名的定义中忽略(不包括)返回类型有什么好处?你能举个例子吗?

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

这可能是部分不正确的,我确信这只是完整答案的一部分,但让我们看看我是否可以澄清至少一部分。既然你问了很多问题,我就尽量回答大部分问题。

  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;
    }
    

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

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

重载,

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

public void foo(int data) {};
public int foo(int data) {};

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

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

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

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?
}
它是这样写的,这是

有原因的:)