Dev 200 Asked: 2020-04-11 10:05:56 +0800 CST 2020-04-11 10:05:56 +0800 CST 2020-04-11 10:05:56 +0800 CST 函数的参数和参数之间有什么区别? 772 在不考虑特定编程语言的情况下,就函数而言,参数和参数之间有什么区别? 还要考虑到,根据我从“干净代码”一书中的理解,建议传递给函数的参数越少(如果可能没有),它变得越有效,为什么? 如果你可以添加一个更好的例子:) lenguaje-agnóstico 3 Answers Voted Best Answer Lucas D.A.W. 2020-04-11T10:13:37+08:002020-04-11T10:13:37+08:00 参数是过程的内在属性,因为它包含在其定义中。例如,计算两个整数之和的过程将需要两个参数,每个参数一个。通常,可以使用任意数量的参数(或根本没有)来定义过程。如果过程具有参数,则其定义中指定它们的部分称为参数列表。 同时,参数是调用函数时分配给变量参数的实际值。 进行函数调用时,传入的“值”称为参数。 在实践中,这两个术语之间通常没有明确的区别。 我把MSDN的官方文档留给你。 NaCl 2020-04-11T10:44:26+08:002020-04-11T10:44:26+08:00 除了我们的同事sakulino在他的回答中所说的之外,我还想贡献一些东西,因为参数和参数之间的主要区别简而言之与“标识符和值”相同。 但是我对您的要求的补充如下: 还要考虑到,根据我从“干净代码”一书中的理解,建议传递给函数的参数越少(如果可能没有),它变得越有效,为什么? 小编辑: 嗯,函数的有效性取决于它是如何创建的以及它是否实现了它的目的。 也就是说,因为在大多数操作系统中,所有编译的代码都执行一个动作,代码本身不会被计算机解释(否则它们将是人类!),但计算机唯一能理解的是整个程序的0组合1。 碰巧在位级别调用函数时,没有传递任何参数,但所有这些字节都加载到寄存器中,想象以下示例: mi_funcion(5, 3, "Hola"); 计算机不知道它得到了什么,所以它只是反向解释函数参数(在某些系统上): lea eax, <direccion_del_string_'Hola'> ; Tercer argumento mov ebx, 3 ; Segundo argumento mov ecx, 5 ; Primer argumento. call mi_funcion ; Llama a mi_funcion 这不是真正的汇编程序 并在函数体中进行相应的移动以避免使用内存地址。 没有参数的函数之所以能比有参数的函数效率更高,是因为计算机只解释一次调用,即参数越多,寄存器分配的次数越多,因此会慢一点(或者至少是这样的)我的理解) 在没有参数的函数中,您只需执行以下操作: mi_funcion: xor eax, eax nop ret call mi_funcion 并准备好了。 JYass 2020-04-11T10:43:26+08:002020-04-11T10:43:26+08:00 使用少量参数的想法正是寻求:干净、可读的代码,易于理解、编写、阅读和维护。如果你找到一个函数,例如有 16 个参数,那么它就不容易阅读。 例如,假设您有一个注册新客户的功能,并且您像这样使用它: IngresarNuevoCliente("Nombre1", "Nombre2", "Nombre3", "Apellido1", "Apellido2", "ApellidoCasada", fechaNacimiento, "Genero", "NumeroIdentificacionUnica", "Dirección", telefono) 可以看到,这是一个很长的指令,要完全看一遍才能观察内容,而且写的时候很容易弄丢参数的顺序(我个人也遇到过),使错误,如果它们属于同一类型,则不会显示没有错误(例如,您将姓氏更改为名字)并且将更难以检测到问题。如果你在调试,也很难遵循参数的顺序。如果反过来,该函数IngresarNuevoCliente属于业务逻辑并调用另一个函数来存储此信息,这还不包括在内,该函数也将具有 N 个参数。 这是非常不同的,例如,使用一个类Cliente,创建一个对象cliente并在获取信息时为其赋值: cliente.primerNombre = cajaTextoPrimerNombre.Text; cliente.segundoNombre = cajaTextoSegundoNombre.Text; . . . cliente.telefono = cajaTextoTelefono.Text; 然后像这样创建新客户端: IngresarNuevoCliente(cliente); 它的写入和读取更清晰,在调试期间您可以分析对象,并且信息将以更易读的方式提供。 如果您以后需要捕获更多客户信息怎么办?您只需修改类,您现在可以在不修改函数的情况下捕获此信息,这将向函数添加更多参数,使其更复杂且容易出错,以及它调用的所有函数。 完全避免参数的想法对我来说似乎有点牵强,总的来说,这些都是好的做法,而不是一成不变的法律,随着您获得编写代码的经验,您将知道要考虑哪些以及为什么要考虑。
参数是过程的内在属性,因为它包含在其定义中。例如,计算两个整数之和的过程将需要两个参数,每个参数一个。通常,可以使用任意数量的参数(或根本没有)来定义过程。如果过程具有参数,则其定义中指定它们的部分称为参数列表。
同时,参数是调用函数时分配给变量参数的实际值。
进行函数调用时,传入的“值”称为参数。
在实践中,这两个术语之间通常没有明确的区别。
我把MSDN的官方文档留给你。
除了我们的同事sakulino在他的回答中所说的之外,我还想贡献一些东西,因为参数和参数之间的主要区别简而言之与“标识符和值”相同。
但是我对您的要求的补充如下:
小编辑: 嗯,函数的有效性取决于它是如何创建的以及它是否实现了它的目的。
也就是说,因为在大多数操作系统中,所有编译的代码都执行一个动作,代码本身不会被计算机解释(否则它们将是人类!),但计算机唯一能理解的是整个程序的
0
组合1
。碰巧在位级别调用函数时,没有传递任何参数,但所有这些字节都加载到寄存器中,想象以下示例:
计算机不知道它得到了什么,所以它只是反向解释函数参数(在某些系统上):
这不是真正的汇编程序
并在函数体中进行相应的移动以避免使用内存地址。
没有参数的函数之所以能比有参数的函数效率更高,是因为计算机只解释一次调用,即参数越多,寄存器分配的次数越多,因此会慢一点(或者至少是这样的)我的理解)
在没有参数的函数中,您只需执行以下操作:
并准备好了。
使用少量参数的想法正是寻求:干净、可读的代码,易于理解、编写、阅读和维护。如果你找到一个函数,例如有 16 个参数,那么它就不容易阅读。
例如,假设您有一个注册新客户的功能,并且您像这样使用它:
可以看到,这是一个很长的指令,要完全看一遍才能观察内容,而且写的时候很容易弄丢参数的顺序(我个人也遇到过),使错误,如果它们属于同一类型,则不会显示没有错误(例如,您将姓氏更改为名字)并且将更难以检测到问题。如果你在调试,也很难遵循参数的顺序。如果反过来,该函数
IngresarNuevoCliente
属于业务逻辑并调用另一个函数来存储此信息,这还不包括在内,该函数也将具有 N 个参数。这是非常不同的,例如,使用一个类
Cliente
,创建一个对象cliente
并在获取信息时为其赋值:然后像这样创建新客户端:
它的写入和读取更清晰,在调试期间您可以分析对象,并且信息将以更易读的方式提供。
如果您以后需要捕获更多客户信息怎么办?您只需修改类,您现在可以在不修改函数的情况下捕获此信息,这将向函数添加更多参数,使其更复杂且容易出错,以及它调用的所有函数。
完全避免参数的想法对我来说似乎有点牵强,总的来说,这些都是好的做法,而不是一成不变的法律,随着您获得编写代码的经验,您将知道要考虑哪些以及为什么要考虑。