Variables de referencia y NIL en EGL

Un parámetro o una variable es un área de memoria. En algunos casos, la variable contiene los datos empresariales de interés, como por ejemplo, un determinado nombre o ID de empleado. En otros casos, la variable es una variable de referencia que contiene una dirección de memoria utilizada para acceder a los datos empresariales en tiempo de ejecución.

Una variable de referencia en EGL está basada en uno de los componentes siguientes, cada uno de los cuales se llama también tipo de referencia:

Excepto en el caso de los componentes Service e Interface, no es necesario definir ninguno de los componentes mencionados anteriormente ya que están predefinidos por EGL.

Las implicaciones son las siguientes:
Inicialización
Cuando declara una variable de referencia, EGL normalmente inicializa la variable en el valor NIL, lo que indica que la variable no está dirigida a datos empresariales. En los casos siguientes, el valor NIL no es el valor inicial:
  • La variable está basada en un componente que incluye un campo inicializado en tiempo de definición, o bien
  • La declaración de variable incluye un bloque set-value, o bien
  • Puede utilizar la palabra clave new para asignar un área de memoria en tiempo de ejecución, como es posible para todos los tipos de referencia que no sean ConsoleField, Service o Interface. A continuación se ofrece un ejemplo:
      myPrompt Prompt = new Prompt {message = "Type your ID");

    Para conocer más detalles acerca de la palabra clave new, consulte el apartado Utilización de new en informes de EGL y ConsoleUI.

Cuando declara una matriz de variables de referencia (por ejemplo, MenuItem[3]), las normas anteriores también se aplican a cada elemento de la matriz.

En sentencias de asignación
Después de asignar una variable de referencia a otra variable de referencia, el origen y el destino contienen cada uno un valor utilizado para acceder a la misma área de memoria. Puede asignar una variable de referencia solamente a otra variable de referencia basada en el mismo componente y en el caso de una interfaz o un componente de servicio, un componente definido en un paquete no es el mismo que un componente definido en otro paquete, incluso aunque los nombres de componente sean idénticos.
Nota: Cuando asigna una variable que no es de referencia a otra variable que no es de referencia, la situación es distinta:
  • El origen y el destino contienen cada uno una copia de los mismos datos empresariales. Si una variable origen que no es de referencia de una sentencia assignment contiene, por ejemplo, un determinado ID de empleado, la sentencia hace que la variable destino también contenga dicho ID.
  • Las variables pueden ser de distintos tipos, tal como se describe en el apartado Compatibilidad de asignación.
En comparaciones
Los operadores que prueban la igualdad (==) y la desigualdad (!=) son válidos para comparar variables de referencia. La comparación se basa en el área de memoria al que se refieren las variables. Si hay dos variables que hacen referencia a distintas áreas de memoria, las dos variables no son iguales, incluso aunque los datos empresariales sean idénticas.
En invocaciones de función
Puede pasar una variable de referencia solo a un parámetro del mismo tipo que el argumento y, en el caso de un componente de servicio o una interfaz, un componente definido en un paquete no es igual que un componente definido en otro paquete, incluso aunque los nombres de componente sean idénticos. Sin embargo, puede pasar una variable de referencia a una función de servicio solo si el parámetro es del mismo tipo que el argumento y solo si la invocación es local, específicamente solo si local es el valor de la propiedad compleja @EGLBinding, campo commType.

La función siempre recibe una copia de la variable que se pasa:
  • Al asignar un valor distinto a los datos a los que hace referencia el parámetro (por ejemplo, cambiar el color de un campo de consola), se cambian los datos disponibles en la función invocante
  • Sin embargo, la utilización del parámetro del lado izquierdo de una sentencia de asignación en la función invocada no tiene ningún efecto sobre la función invocante. Después de la asignación, el parámetro hace referencia a la misma área de memoria que el área al que hace referencia la variable del lado derecho de la sentencia de asignación, pero el argumento de la función invocante no se ve afectado por esa asignación.

Los modificadores de parámetro IN, OUT e INOUT no son válidos para los parámetros de un tipo de referencia.

Cualquier tipo de referencia es válido como tipo de retorno, lo que significa que se devuelve una copia de una dirección a la función invocante en tiempo de ejecución. Incluso aunque el tipo de referencia se declare como variable local en la función invocada, los datos empresariales (y un área de memoria para albergar esos datos) se retienen en la función invocante.

En las llamadas a programas
No puede pasar una variable de referencia a otro programa.
En PageHandlers
No puede pasar una variable de referencia a la función onPageLoad en un PageHandler ni puede situar una variable de referencia en (o recuperar una variable de referencia de) la sesión o el objeto de petición.

Consulta relacionada
Compatibilidad de referencia en EGL
Utilización de new en informes de EGL y ConsoleUI

Comentarios
(C) Copyright IBM Corporation 2000, 2005. Reservados todos los derechos.