C# 为什么方法在正常情况下只返回一种参数?

C# 为什么方法在正常情况下只返回一种参数?,c#,function,methods,return-value,method-call,C#,Function,Methods,Return Value,Method Call,我在工作面试中遇到过这样的问题,但我无法回答,也无法在面试后找到答案。他们问我“为什么方法在C#的正常条件下只返回一种参数?”?(ref out是返回多个参数的额外方式。但这不是正常情况)' -Tuple、list、dictionary、ext.=>毕竟它们只用于一种参数。为什么方法在正常情况下只返回一种参数? 因为微处理器的行为和汇编语言的历史 在面向对象编程中,例如在C#中,在类似英特尔的计算机上,方法只不过是机器代码中的过程 过程不返回任何内容,也不获取任何内容:它只是一个goto、一个j

我在工作面试中遇到过这样的问题,但我无法回答,也无法在面试后找到答案。他们问我“为什么方法在C#的正常条件下只返回一种参数?”?(ref out是返回多个参数的额外方式。但这不是正常情况)'

-Tuple、list、dictionary、ext.=>毕竟它们只用于一种参数。

为什么方法在正常情况下只返回一种参数?

因为微处理器的行为和汇编语言的历史

在面向对象编程中,例如在C#中,在类似英特尔的计算机上,方法只不过是机器代码中的过程

过程不返回任何内容,也不获取任何内容:它只是一个goto、一个jmp或一个调用,它是第一代CPU中的高级jmp

因此,为了创建CPU调用,发明了堆栈来传递参数并获得结果值(因此在高级语言中称为函数)

因此,当我们调用一个方法时,实际上(编译器为此生成机器代码),我们在堆栈中推送每个参数的值和/或引用,这些参数只有平台寄存器的最大大小(x32=16位,x64=64位-使用较少的值就像在多路路上使用单向)

在过程的开始,我们弹出值(编译器生成该值)

在程序机器代码的末尾,我们有一个RET汇编操作码/助记符指令

如果返回值是预期的,则在返回之前,它会被推送到堆栈中,供调用方使用,我们在其中返回它

使用
ref
关键字传递过程直接使用的内存指针:我们推送一个指针,调用proc,弹出指针,使用它,RET,仅此而已,但优化程度较低,因为使用CPU内部堆栈比外部内存访问快

除此之外,使用新的C#特性返回元组,实际上,它返回指向内存匿名数据结构的指针(4或8字节),就像它是类或结构对象的实例引用一样。当我们不想创建一个专用的类或结构时,它是有用的

这是编程的唯一方法,因为一个数学函数只返回一个值或一组值,在最后一种情况下,我们需要得到一组值,来处理,而不是被这些值淹没

所以这个问题的基本答案来自数学科学的结构,特别是和


为了更好地理解和提高您的计算技能,您可能会发现研究什么是工作以及如何工作很有趣。您可以开始,但它可能更简单,形成和补充从过去开始。

< P>除了Olivier Rogier关于机器代码中语言的实现的回答之外,还考虑了如何在语言中使用方法调用。例如:

x=2*(someMethod()+1)


如果
someMethod
可以返回多个值,那么在这个表达式中应该使用哪个值?如果你的回答是“语言可能要求你在调用站点说出哪一个”,那么恭喜,元组就是这样工作的——你返回一个值(一个元组)和多个组件,而不是返回多个值。

@HimBromBeere,他问为什么方法有固定的返回类型。因为C是强类型语言,如果一个方法说“我要生成一个整数”,它最好生成一个整数,或者编译器将其踢出。方法不返回“一种参数”。方法返回指定类型的值。该类型可以是您想要的任何类型(或您指定的),甚至可以是包含多个类型的列表(例如,
list
)。签名告诉返回值的类型。它将由编译器检查,通常有助于保持编程中的良好实践。不幸的是,除非面试官碰巧在这里,否则无法知道他们在这里寻找什么,也无法知道你是否准确地解释了他们的问题。有时看一看应试者如何思考这个问题,会告诉你更多关于他们编程能力的信息,而不是答案本身。