InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
Tutorial C#
Introduccion a C#
Programacion con C#
Fundamentos de C#
Operadores
Instrucciones
Estrcuturas de control.
Definición de clases
Creación de objetos
Herencia y métodos virtuales
Polimorfismo
Ocultación de miembros
Miembros de tipo
Encapsulación
Espacios de nombres
Importación de espacios de nombres
Espacio de nombres distribuidos
Variables y tipos de datos
Tablas unidimensionales
Tablas multidimensionales
La clase System.Array
Cadenas de texto
Constantes
Orden de inicialización de variables
Métodos
Métodos externos
Constructores
Destructores
Propiedades
Indizadores
Redefinición de operadores
Delegados y eventos
La clase MulticastDelegate
Llamadas asíncronas
Implementación interna de los delegados
Eventos
Estructuras
Boxing y unboxing
Constructores de estructuras
Enumeraciones
Interfaces
Excepciones
Otras instrucciones
Atributos
Definición de nuevos atributos
Lectura de atributos en tiempo de ejecución
Atributos de compilación
Pseudoatributos
Código inseguro
Definición de punteros
Manipulación de punteros
Operadores relacionados con código inseguro
Fijación de variables apuntadas
Novedades de C# 2.0
Genéricos
Tipos parciales
Iteradores
Mejoras en la manipulación de delegados
Tipos anulables
Modificadores de visibilidad de bloques get y set
Clases estáticas
Referencias a espacios de nombres
Supresión temporal de avisos
Atributos condicionales
Incrustación de tablas en estructuras
Modificaciones en el compilador
También puedes ver ...
Serialización: XmlSerializer y BinaryFormater
Handler para manipular imagenes
Conversiones de tipos personalizadas (VB y C#)
Compresión por gzip y deflate
La página Web que está abriendo contiene tanto elementos seguros como no seguros.
Cómo insertar un fichero .xml en un campo de tipo XML de SQL server 2005 o 2008
Comparativa de sentencias VB.Net vs C#
Aprende Ajax desde cero
Creando cadenas de conexión ConnectionStrings en .net 3.5 o visual Studio 2008 usando SqlConnectionStringBuilder
Migración de WSE a WCF (Web Services de 2005 a 2008)

Afiliados
La Web del programador
MundoProgramacion


Concepto de propiedad

    Una propiedad es una mezcla entre el concepto de campo y el concepto de método. Externamente es accedida como si de un campo normal se tratase, pero internamente es posible asociar código a ejecutar en cada asignación o lectura de su valor. Éste código puede usarse para comprobar que no se asignen valores inválidos, para calcular su valor sólo al solicitar su lectura, etc.

    Una propiedad no almacena datos, sino sólo se utiliza como si los almacenase. En la práctica lo que se suele hacer escribir como código a ejecutar cuando se le asigne un valor, código que controle que ese valor sea correcto y que lo almacene en un campo privado si lo es; y como código a ejecutar cuando se lea su valor, código que devuelva el valor almacenado en ese campo público. Así se simula que se tiene un campo público sin los inconvenientes que estos presentan por no poderse controlar el acceso a ellos.

Definición de propiedades

    Para definir una propiedad se usa la siguiente sintaxis:


<tipoPropiedad> <nombrePropiedad>
{
 set
 {
 <códigoEscritura>
 }
 get
 {
 <códigoLectura>
 }
}

    Una propiedad así definida sería accedida como si de un campo de tipo <tipoPropiedad> se tratase, pero en cada lectura de su valor se ejecutaría el <códigoLectura> y en cada escritura de un valor en ella se ejecutaría <códigoEscritura>

    Al escribir los bloques de código get y set hay que tener en cuenta que dentro del código set se puede hacer referencia al valor que se solicita asignar a través de un parámetro especial del mismo tipo de dato que la propiedad llamado value (luego nosotros no podemos definir uno con ese nombre en <códigoEscritura>); y que dentro del código get se ha de devolver siempre un objeto del tipo de dato de la propiedad.

    En realidad el orden en que aparezcan los bloques de código set y get es irrelevante. Además, es posible definir propiedades que sólo tengan el bloque get (propiedades de sólo lectura) o que sólo tengan el bloque set (propiedades de sólo escritura) Lo que no es válido es definir propiedades que no incluyan ninguno de los dos bloques.

    Las propiedades participan del mecanismo de polimorfismo igual que los métodos, siendo incluso posible definir propiedades cuyos bloques de código get o set sean abstractos. Esto se haría prefijando el bloque apropiado con un modificador abstract y sustituyendo la definición de su código por un punto y coma. Por ejemplo:


using System;
abstract class A
{
 public abstract int PropiedadEjemplo
 {
  set;
  get;
 }
}          
class B:A
{
 private int valor;
 
 public override int PropiedadEjemplo
 {
  get
  {
   Console.WriteLine("Leído {0} de PropiedadEjemplo", valor);
   return valor;
  }
  
  set
  {
   valor = value;
   Console.WriteLine("Escrito {0} en PropiedadEjemplo", valor);
  }
 }
}

    En este ejemplo se ve cómo se definen y redefinen propiedades abstractas. Al igual que abstract y override, también es posible usar cualquiera de los modificadores relativos a herencia y polimorfismo ya vistos: virtual, new y sealed.

    Nótese que aunque en el ejemplo se ha optado por asociar un campo privado valor a la propiedad PropiedadEjemplo, en realidad nada obliga a que ello se haga y es posible definir propiedades que no tengan campos asociados. Es decir, una propiedad no se tiene porqué corresponder con un almacén de datos.

Acceso a propiedades

    La forma de acceder a una propiedad, ya sea para lectura o escritura, es exactamente la misma que la que se usaría para acceder a un campo de su mismo tipo. Por ejemplo, se podría acceder a la propiedad de un objeto de la clase B del ejemplo anterior con:


B obj = new B();
obj.PropiedadEjemplo++;

   
El resultado que por pantalla se mostraría al hacer una asignación como la anterior sería:


Leído 0 de PropiedadEjemplo;

Escrito 1 en PropiedadEjemplo;

    Nótese que en el primer mensaje se muestra que el valor leído es 0 porque lo que devuelve el bloque get de la propiedad es el valor por defecto del campo privado valor, que como es de tipo int tiene como valor  por defecto 0.

Implementación interna de propiedades

    En realidad la definición de una propiedad con la sintaxis antes vista es convertida por el compilador en la definición de un par de métodos de la siguiente forma:


<tipoPropiedad> get_<nombrePropiedad>()
{// Método en que se convierte en bloque get
 <códigoLectura>
}
void set_<nombrePropiedad> (<tipoPropiedad> value) 
{// Método en que se convierte en bloque set
 <códigoEscritura>
}

    Esto se hace para que desde lenguajes que no soporten las propiedades se pueda acceder también a ellas. Si una propiedad es de sólo lectura sólo se generará el método get_X(), y si es de sólo escritura sólo se generará el set_X() Ahora bien, en cualquier caso hay que tener cuidado con no definir en un mismo tipo de dato métodos con signaturas como estas si se van a generar internamente debido a la definición de una propiedad, ya que ello provocaría un error de definición múltiple de método.

    Teniendo en cuenta la implementación interna de las propiedades, es fácil ver que el último ejemplo de acceso a  propiedad es equivalente a:


B b = new B();  
obj.set_PropiedadEjemplo(obj.get_Propiedad_Ejemplo()++);

    Como se ve, gracias a las propiedades se tiene una sintaxis mucho más compacta y clara para acceder a campos de manera controlada. Se podría pensar que la contrapartida de esto es que el tiempo de acceso al campo aumenta considerablemente por perderse tiempo en hacer las llamada a métodos set/get. Pues bien, esto no tiene porqué ser así ya que el compilador de C# elimina llamadas haciendo inlining (sustitución de la llamada por su cuerpo) en los accesos a bloques get/set no virtuales y de códigos pequeños, que son los más habituales.

    Nótese que de la forma en que se definen los métodos generados por el compilador se  puede deducir el porqué del hecho de que en el bloque set se pueda acceder a través de value al valor asignado y de que el objeto devuelto por el código de un bloque get tenga que ser del mismo tipo de dato que la propiedad a la que pertenece.


Inicio | Tutorial C# DestructoresTutorial C#Indizadores Versión para imprimir Foros de consulta

 
=) por Lorena
Respuesta recibida el [30/09/2008 10:59:25]
Es bueno este tutorial me ayuda + q la maestra 


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



Inicio | Tutorial C# DestructoresTutorial C#Indizadores Versión para imprimir

Propiedades
Autor: José Antonio González Seco
Visitas: 10831 Fecha de publicación: 13/10/2006
José Antonio es experto en tecnologias Microsoft. Imparte cursos y conferencias en congresos sobre C# y .NET en Universidades de toda España (Sevilla, Barcelona, San Sebastián, Valencia, Oviedo, etc.) en representación de grandes empresas como Microsoft.




Visitas: 201 | Comentarios: 0 | Archivo: Articulos
Categorias: C#
Visitas: 315 | Comentarios: 1 | Archivo: Articulos
Visitas: 390 | Comentarios: 1 | Archivo: Articulos
Categorias: Humor
Visitas: 615 | Comentarios: 3 | Archivo: Articulos
Categorias: C#|ASP.NET
Visitas: 1177 | Comentarios: 4 | Archivo: Articulos
Visitas: 697 | Comentarios: 1 | Archivo: Articulos
Categorias: ASP.NET|ASP|Windows XP|Windows 2003
Visitas: 828 | Comentarios: 2 | Archivo: Articulos
Categorias: Java|Solaris
Visitas: 584 | Comentarios: 0 | Archivo: Articulos
Visitas: 1484 | Comentarios: 1 | Archivo: Articulos
Categorias: ADO.NET
Visitas: 1533 | Comentarios: 3 | Archivo: Articulos
Categorias: ASP.NET

Útimos temas recibidos en los foros ...
Manual Visual Studio.NET por Shiko ... [Visual Basic .NET] 34 26/10/2006
llamar procedimientos de pl/sql en java por jhon ... [ORACLE] 0 03/07/2009
consulta multitablas por anga ... [mySQL] 0 03/07/2009
objetos helper php bajo oracle por objetos_helper_oracle ... [ISAPI] 0 02/07/2009
ranuras isa o pci por sara ... [Access] 5 30/03/2006
descargar tutorial C# por afmp ... [C#] 54 14/10/2008
Tutorial TOAD para Oracle en Español por ijpj ... [ORACLE] 19 14/03/2009
quiero mi numero de mi autogenerado por pablo ... [Visual Basic .NET] 1 15/06/2009
Ayuda con cargar fotografias de otra pc por Alex ... [ASP.NET] 0 01/07/2009
splash screen por zelca ... [Visual Basic .NET] 0 01/07/2009
Error de inicio de aplicación por Danrre ... [C#] 0 30/06/2009
sumar los precios de la columna "precio" del grig por jardinderosas ... [C#] 7 01/11/2007

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
05/08/2007 Como ver peliculas descargadas en Windows Vista
27/02/2007 ¿Permite Windows Vista reproducir peliculas descargadas o "Piratas"? SI, si lo permite
22/10/2005 Actualización de datos. UPDATE    forma parte de...Tutorial SQL
21/07/2006 Funciones integradas de PL/SQL    forma parte de...Tutorial PL/SQL
03/10/2006 Herencia y métodos virtuales    forma parte de...Tutorial C#
22/10/2005 Insertar datos. INSERT    forma parte de...Tutorial SQL
14/01/2008 Novedades Visual Studio 2008 DataSet en 3 capas o MVC
12/06/2007 Estructuras de control en Transact SQL    forma parte de...Tutorial de Transact SQL
01/06/2006 Cursores de actualización en PL/SQL    forma parte de...Tutorial PL/SQL
01/01/2006 Borrado de datos. DELETE    forma parte de...Tutorial SQL

 

Encuesta
¿A que perfil te adaptas mejor?
[Ver] [Votar]