在方法签名定义中忽略返回类型有什么好处
本文关键字:返回类型 什么 方法 定义 | 更新日期: 2023-09-27 18:35:32
MSDN 签名和重载包含以下方法签名定义:
方法的签名由方法的名称和 每个形式 的类型和种类(值、引用或输出) 参数,按从左到右的顺序考虑。签名 方法具体不包括返回类型,也不包括返回类型 包括可能为最右侧指定的参数修饰符 参数。
我期望看到的是方法签名应该包含返回类型,但它没有。
在方法签名的定义中忽略(不包括)返回类型有什么好处?你能举个例子吗?
这可能是部分不正确的,我确信这只是完整答案的一部分,但让我们看看我是否可以澄清至少一部分。既然你问了很多问题,我就尽量回答大部分问题。
- 不能忽略方法的返回类型。
-每次定义方法时,都必须定义返回类型(不包括匿名方法,这与匿名方法无关)。您将始终以void
、string
、int
或其他方式开始您的方法定义。 -
覆盖不等于重载。
-重载方法意味着您可以使用不同的版本指定相同的方法。假设您有一个返回两个整数之和的方法。您可以定义以下方法: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; }
重写意味着您取代具有相同签名的原始方法。
-
是的,会的。因为您只能定义一个具有相同签名的方法。关于方法签名和返回类型,您必须了解的是它们不相关。请考虑以下方法:
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?
}
它是这样写的,这是有原因的:)