5. Contribution, implications and future research
5.2 Measuring services innovation
4
NOTA
En el caso de la accesibilidad es importante tener en cuenta la accesibilidad del objeto conte- nedor de la variable (objeto que contiene a otro objeto).
Se puede proporcionar permiso a nivel procedimiento, pero si no se tiene permiso para dis- poner del capítulo, clase o estructura que contiene el procedimiento mencionado, no será po- sible llegar nunca a él.
Ejercicio 4.3
Demostración del alcance de las variables y la forma en que preservan valores (II)
1 Option Explicit On
2 Option Strict On
3
4 Module Module1
5 Dim Texto1 As String = “Alcance módulo”
6
7 Sub Main()
8 Console.WriteLine(Texto1)
9 Dim Texto2 As String = “Alcance procedimiento”
10 If Texto2 <> “” Then
11 Console.WriteLine(Texto2)
12 Dim Texto3 As String = “Alcance block”
13 Console.WriteLine(Texto3) 14 End If 15 Procedimiento1() 16 Procedimiento1() 17 Procedimiento1() 18 Procedimiento2() 19 Console.WriteLine(“ “)
20 Console.Write(“Pulse INTRO para continuar”)
21 Console.ReadLine()
22 End Sub
23
24 Sub Procedimiento1()
25 Static Texto4 As String
26 Texto4 = “Valor + “ & Texto4
27 Dim Texto5 As String = “Texto 5”
28 Console.WriteLine(“—Procedimiento 1 ——”)
29 Console.WriteLine(“Texto 1: “ & Texto1)
30 Console.WriteLine(“Texto 4: “ & Texto4)
31 Console.WriteLine(“———————————”) 32 End Sub 33 34 Sub Procedimiento2() 35 Console.WriteLine(“—Procedimiento 2 ——”) 36 If Texto1 <> “” Then
37 Dim Texto1 As String = “Shadow”
38 Console.WriteLine(“Texto 1: “ & Texto1)
39 End If
40 Console.WriteLine(“Texto 1: “ & Texto1)
41 Console.WriteLine(“———————————”)
42 End Sub
43
44 End Module
Ejecución guiada deAlcance – Module1.vb
4. Construya la solución (oprima las teclas Ctrl-Mayús-B). Establezca el nuevo proyecto como proyecto de inicio (StartUp Project) y guarde todos los cambios que haya reali- zado en la solución (oprima las teclas Ctrl-Mayús-S). Inicie la depuración para com- probar el comportamiento de su programa (Oprima F5).
5. Este programa es type safe, dado que todas las variables deberán declararse antes de ser utilizadas (Option Explicit) y las conversiones tienen que hacerse de forma explícita (Option Strict) (líneas 1 y 2).
6. Se declaran variables con diferente alcance en las líneas 5, 9 y 12. En la línea 5 se de- clara la variable Texto1; ésta tiene un alcance a nivel módulo, debido a que se declara dentro del módulo, fuera de cualquier procedimiento.
Esta variable podrá ser utilizada por todos los procedimientos del módulo, es decir,
Main(),Procedimiento1()y Procedimiento2(); esto se comprueba en la líneas 8 y 29, pues se despliega en la consola una variable no definida en esos procedimientos. En la línea 9 se declara la variable Texto2, que tiene un alcance a nivel procedimiento, por estar declarada dentro de un procedimiento específico, pero fuera de un bloque de código; por esa razón se trata de una variable local. Esta variable estará disponible só- lo para Main(), pero no para otros procedimientos.
En la línea 12 se declara la variable Texto3, que tiene un alcance a nivel bloque de có- digo y estará disponible desde que se declara (línea 12) hasta que se encuentre el esta- tuto que marca el final del bloque de código (en este caso End If, en la línea 14). Si se trata de utilizar la variable Texto3después de la línea 14, pensando que es una va- riable local (de alcance a nivel procedimiento), nuestro programa generará error, ya que la variable sólo existe declarada para el bloque en que se declara.
7. Comprobación de la variable estática. En la línea 15 se manda ejecutar Procedimien- to1(); en dicho procedimiento se define una variable estática llamada Texto4(línea 25). Esta variable tendrá un tiempo de vida que excede el tiempo de vida del procedi- miento que la declara, ya que por ser estática, mantendrá los valores en memoria aun después de concluida la ejecución del procedimiento.
En la línea 26 se asigna a Texto4la constante String Valor+ que se concatenará con el valor que tenga la misma Texto4; en virtud de que la variable es estática, el valor que va adoptando se comporta como un acumulador, que nunca pierde el valor que tenía, obtenido de procesamientos anteriores.
Las líneas 16 y 17 mandan ejecutar Procedimiento1(), a fin de que se compruebe que efectivamente la variable mantiene su valor al correr de las múltiples ejecuciones del procedimiento.
8. Comprobación de shadowing. Ya vimos que en la línea 5, Texto1 se definió con un al- cance a nivel módulo y, al momento de declarar la variable, se le asignó el valor Alcan- ce módulo. En Procedimiento2(), se vuelve a definir la variable Texto1(línea 37) y se le asigna al momento de declaración el valor Shadow.
9. a) ¿Qué alcance tiene la variable Texto1, declarada en la línea 37?
b) ¿Qué valor posee Texto1cuando es desplegada en la consola en la línea 38?
c) ¿Qué valor posee Texto1cuando es desplegada en la consola en la línea 40?
Como podrá darse cuenta, el programa no genera conflicto con la doble declaración de la variable; simplemente utiliza aquella que tenga menor alcance.
Si todo ocurrió como se esperaba, la salida será la siguiente:
Alcance módulo Alcance procedimiento Alcance block
––Procedimiento 1 –––– Texto 1: Alcance módulo Texto 4: Valor + –––––––––––––––––––––– ––Procedimiento 1 –––– Texto 1: Alcance módulo Texto 4: Valor + Valor + –––––––––––––––––––––– ––Procedimiento 1 –––– Texto 1: Alcance módulo
Texto 4: Valor + Valor + Valor + ––––––––––––––––––––––
––Procedimiento 2 –––– Texto 1: Shadow
Texto 1: Alcance módulo –––––––––––––––––––––– Pulse INTRO para continuar
10. Modifique la línea 21, sustituyendo el estatuto de declaración Static por Dim. Ejecute el programa nuevamente, y explique qué sucede:
FIN DEL EJERCICIO *
Arreglos
Se conoce como arreglos (arrays) —también llamados matrices en algunos casos— a un conjunto de posiciones en memoria que son referidas por un mismo identificador. Se accede a un dato almacenado en una posición de memoria dentro de un arreglo a tra- vés de un subíndice, que es la posición secuencial de cada elemento dentro de la colec- ción. Los subíndices, como en todos los lenguajes de .NET, son de base cero; es decir, ini- cian en cero.
En Visual Basic, los arreglos tienen un tratamiento de colecciones, por lo cual los subíndi- ces siempre se especifican entre paréntesis. Las colecciones son conjuntos de objetos lógi- camente relacionados, diferenciados por un subíndice.
En su calidad de colecciones, pueden ser explorados con la instrucción For Each, cuya sin- taxis es la siguiente:
For EachElemento [AsTipoDato] InColección BloqueCódigo
[Exit For]
Next
Donde Elemento es la variable de trabajo en donde se almacenará el elemento (TipoDato), que de no especificarse asumirá el mismo tipo de dato que tengan los elementos de la colección. Colección es la colección de objetos que podrán ser leídos de forma secuencial utilizando For Each. BloqueCodigo es el bloque de código que se ejecutará de forma ite- rativa para cada elemento de la colección explorado. Al encontrar Next, el proceso iterati- vo comienza nuevamente; es posible interrumpir el ciclo en cualquier momento utilizando
Exit For.