viernes, 4 de octubre de 2013

Campos en C#

Tabla de Contenido

0. Introducción
1. Campos
2. El Modificador readonly
3. Inicialización de un Campo
4. Declaración de Múltiples Campos
5. Campos de Instancia vs Campos Estáticos
6. Campos vs Propiedades
7. Conclusiones
8. Glosario
9. Referencias

0. Introducción

A medida que avancemos iremos viendo las diferentes partes que integran la definición de un tipo  de objeto. En este artículo les presentaré las características que definen al miembro campo de una clase o una estructura. Veremos ejemplos prácticos que les hace distinguir de los demás miembros de un tipo o una estructura.

1. Campos

Los campos son los atributos que describen/modelan la información (estado) de un tipo de dato o una estructura cuando exista una instancia en memoria. Un campo es una variable de cualquier tipo que está declarada en el cuerpo de definición una clase o una estructura (struct [2]).

Apoyándome en la definición encontrada en [1], un campo es un miembro del tipo donde está contenido, como ya se dicho: una clase o una estructura. Existe una copia del campo para cada instancia u objeto creado del tipo en el que está contenido.

En la Figura 1 se aprecia un ejemplo de tres instancias de la clase CuentaBancaria; y observamos que cada una posee valores de campos diferentes. Esta es la manera en que se distingue una instancia de otra: a través de su estado de los campos en tiempo de ejecución:
Instancias de la clase CuentaBancaria
Figura 1. Instancias de la clase CuentaBancaria.
Debido a que los campos son variables, a éstos se les puede especificar un grado de visibilidad o de alcance. A los campos, por buena práctica de diseño, su alcance debe ser private [3] (es el modificador de acceso con menor visibilidad: sólo los demás miembros declarados en la clase o estructura tienen acceso directo para lectura o escritura) o protected [4] (un campo con este modificador de acceso permite que sólo las clases derivadas tengo acceso a él).

Antes de entrar en otros detalles conceptuales de los campos, en el siguiente código fuente C# podemos ver cómo la clase Persona está compuesta por dos campos: nombre y edad.

Archivo C# Persona.cs [enlace alternativo]:

2. El Modificador readonly

El modificar readonly [5] que aplica para campos. Un campo que haya sido declarado con este modificador, la asignación sólo puede ocurrir en el cuerpo de un constructor o en la misma declaración.

En [5] he encontrado este interesantísima nota:
Nota acerca del modificador readonly
Figura 2. Acerca de la diferencia del modificador readonly y const.
Está claro que la diferencia entre readonly y const radica en las diferentes ubicaciones (declaración y constructores) en donde un campo readonly puede ser declarado; una constante sólo en su declaración.

Anexo el ejemplo al que se refiere la nota anterior:

public static readonly uint timeStamp = (uint)DateTime.Now.Ticks;

Adicionalmente un ejemplo acerca del modificador readonly:

Archivo C# Edad.cs [enlace alternativo]:

3. Inicialización de un Campo

La inicialización de un campo en su declaración es opcional. Generalmente la inicialización ocurre en los constructores, ya que son éstos los que perfilan el estado inicial de una instancia de una clase de objeto.

public int edad = 13;


En la Tabla 1 se presenta el listado de los valores por defecto para las variables de los tipos de datos integrados (o primitivos) que son asignados cuando el constructor por defecto de una clase de objeto es invocado.
Valores por defecto para los tipos de datos integrados.
Tabla 1. Valores por defecto para los tipos de datos integrados [6].

4. Declaración de Múltiples Campos

Así como es posible declarar múltiples variables locales de un tipo de datos en una misma sentencia; sobre los campos de instancia también se puede realizar la misma operación.

En [8] nos dicen:
This is a convenient way for all the fields to share the same attributes and field modifiers.
static readonly int piernas = 2, ojos = 2;

5. Campos de Instancia vs. Campos Estáticos

Los campos de instancia, en un principio, se diferencian de los campos estáticos en el grado de pertencia, es decir, cuando creamos una instancia de una clase de objeto los valores asignados a los campos de instancia pertenen únicamente a ese objeto: NO SON COMPARTIDOS con otras instancias de la misma clase.

Veamos el siguiente ejemplo:

Archivo C# Bicicleta.cs [enlace alternativo]:
En la línea 3 se declara la variable numeroRuedas como static [8]. Este miembro de la clase Bicicleta no requiere que exista una instancia para ser invocado. Podríamos hacer esto con el campo estático:

Bibicleta.numeroRuedas;

En cambio, con los campos de instancia esto está prohíbido:

Bicicleta.marca;

Generará el siguiente mensaje de error:


error CS0120: An object reference is required to access non-static member `Bicicleta.marca'

Básicamente el mensaje de error nos dice que debemos crear una referencia de la clase Bicicleta para poder utilizar ese miembro. A pesar de que lo creemos, no podremos accederlo debido al modificador de acceso del campo marca es private.

6. Campos vs. Propiedades

A nivel de acceso los campos deben ser private, mientras que, por lo general, las propiedades son public.  Además, las propiedades facilitan el acceso indirecto a los campos de instancia; el dominio de los valores permitidos por la lógica del modelo para el campo puede ser implementada en la misma propiedad.

Un ejemplo evidente del uso de propiedades reside en los controlos WinForms [9]. Por ejemplo, podemos cambiar el texto de un control Label [10] de la siguiente manera:

lblTitulo.Text = "Nuevo titulo";

Obsevemos que no es necesario invocar un método (como ocurre en Java) para cambiar el valor de texto de la etiqueta lblTitulo.

Recomiendo revisar esta entrada en StackOverflow: [11].

7. Conclusiones

Hemos entendido el concepto de campo de instancia: como un miembro en la definición de una clase o una estructura. Se ha mostrado cómo inicializarlo durante tiempo de declaración o en la llamada a un constructor. Además, se demostró el uso del modificador de campos readonly: su utilidad reside en inicializar valores en tiempo de ejecución y convertirlos en constantes. Adicionalmente, se hizo un paralelo entre un campo y las propiedades (medio para acceder de manera indirecta al valor de un campo de instancia).

8. Glosario

  • Campo
  • Campo estático
  • Estado
  • Estructura
  • Variable de instancia

9. Referencias

[1]: Fields (C# Programming Guide) - http://msdn.microsoft.com/en-us/library/ms173118.aspx
[2]: struct (C# Reference) - http://msdn.microsoft.com/en-us/library/ah19swz4(v=vs.90).aspx
[3]: private (C# Reference) - http://msdn.microsoft.com/en-us/library/st6sy9xe.aspx
[4]: protected (C# Reference) - http://msdn.microsoft.com/en-us/library/bcd5672a.aspx
[5]: readonly (C# Reference) - http://msdn.microsoft.com/en-us/library/acdd6hb7.aspx
[6]: Default Values Table (C# Reference) - http://msdn.microsoft.com/en-us/library/83fhsxwc.aspx
[7]: C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[8]: static (C# Reference) - http://msdn.microsoft.com/en-us/library/98f28cdx.aspx
[9]: Windows Forms - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Windows_Forms
[10]: Label Class (System.Windows.Forms) - http://msdn.microsoft.com/en-us/library/system.windows.forms.label.aspx
[11]: properties - What is the difference between a field and a property in C#? - Stack Overflow - http://stackoverflow.com/questions/295104/what-is-the-difference-between-a-field-and-a-property-in-c


O

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.