Hogar / Instrucciones / Los captadores y definidores son magia que debe conocer su lugar. Conjunto de datos de interfaz Propiedad de conjunto Notación abreviada

Los captadores y definidores son magia que debe conocer su lugar. Conjunto de datos de interfaz Propiedad de conjunto Notación abreviada

Joseph Crawford, uno de mis lectores, leyó un artículo sobre cómo no me gusta escribir captadores y definidores y sugirió que podría usar los métodos mágicos __get y __set.
Te diré por qué no es buena idea usarlos de forma normal. También les contaré una historia en la que realmente resultaron útiles: crear tipos estáticos en PHP (un lenguaje dinámico).
Para aquellos que no están familiarizados con los métodos __get y __set, son dos métodos "mágicos" que funcionan así:
clase Animal ( función __get($propiedad) ( //... ) función __set($propiedad, $valor) ( ///... ) ) $vaca = nuevo Animal; $vaca->peso = "1 tonelada"; // igual que $vaca->__set("peso", "1 tonelada") print $vaca->peso; // igual que print $vaca->__get("peso");

Normalmente, los métodos anteriores se utilizan para crear propiedades dinámicas. ¿Qué conclusión se puede sacar de esto? Si desea crear propiedades aleatorias, simplemente use un hash (también conocido como una matriz con claves).
¿Qué tienen de bueno los captadores y definidores?
Echemos un vistazo:
clase Animal ( public $pesoEnKgs; ) $vaca = nuevo Animal; $vaca->pesoEnKgs = -100;

¿Qué? ¿Peso negativo? Esto es incorrecto desde la mayoría de los puntos de vista.
Una vaca no debería pesar menos de 100 kg (eso creo :). Dentro de 1000 es aceptable.
¿Cómo podemos garantizar tal limitación?
Usar __get y __set es una forma bastante rápida.
clase Animal (privado $propiedades = matriz(); función pública __get($nombre) ( if(!empty($this->properties[$name])) ( return $this->properties[$name]; ) else ( lanzar nueva excepción("Propiedad no definida ".$nombre." referenciada." ) ) función pública __set($nombre, $valor) ( ​​if($nombre == "peso") ( if($valor< 100) { throw new Exception("The weight is too small!") } } $this->propiedades[$nombre] = $valor; ) ) $vaca = nuevo Animal; $vaca->pesoEnKgs = -100; //lanza una excepción

¿Qué pasa si tiene una clase con entre 10 y 20 propiedades y las verifica? En este caso, los problemas son inevitables.
función pública __set($nombre, $valor) ( ​​if($nombre == "peso") ( if($valor< 100) { throw new Exception("The weight is too small!") } if($this->peso != $peso) ( Pastor::notifyOfWeightChange($vaca, $peso); ) ) if($nombre == "piernas") ( if($valor != 4) ( throw new Exception("El número de patas es demasiado pequeño o demasiado grande") ) $this->numberOfLegs = $numberOfLegs; $this->numberOfHooves = $numberOfLegs; ) if($name == "milkType") ( ... ya entiendes la idea ... ) $this->properties[$nombre] = $valor; )

Por el contrario, los captadores y definidores están en su mejor momento cuando se trata de validación de datos.
clase Animal ( privado $peso; privado $númeroDePiernas; privado $númeroDePezuñas; público $apodo; función pública setNúmeroDePiernas($númeroDePiernas) ( if ($númeroDePiernas != 100) ( throw new Exception("El número de patas es demasiado pequeño o demasiado grande"); ) $this->numberOfLegs = $numberOfLegs; $this->numberOfHooves = $numberOfLegs; ) función pública getNumberOfLegs() ( return $this->numberOfLegs; ) función pública setWeight($peso) ( if ($peso< 100) { throw new Exception("The weight is too small!"); } if($this->peso != $peso) ( Pastor::notifyOfWeightChange($vaca, $peso); ) $this->peso = $peso; ) función pública getWeight() ( return $this->weight; ) )

Nada se compara con las funciones de acceso directo (obtener, configurar;) de C#. Es probable que este tipo de soporte aparezca pronto en PHP, pero por ahora no nos relajemos...
Cada método es responsable únicamente de su propia área, lo que hace que el código sea más fácil de navegar. Todavía es mucho código, pero es más limpio que la versión __set. Existe un buen enfoque heurístico, que es el siguiente: si su método (función) ocupa más de 1 pantalla, debe acortarlo. Esto hará que el código sea más fácil de leer.
También almacenamos algo de lógica empresarial. Siempre habrá exactamente tantas pezuñas como patas, y si notamos un cambio en el peso del ganado, avisaremos inmediatamente al pastor.
Como no nos importan los apodos de las vacas ni los verificamos, dejemos que los datos sean públicos sin captadores ni definidores.
Nuevamente, realmente no escribí todos estos captadores y definidores: PHP Storm lo hizo por mí. Simplemente escribí lo siguiente:
clase Animal ( privado $peso; privado $númeroDePiernas; )

Y presioné Alt+Insertar -> Captadores y definidores. PHPStorm generó todo automáticamente.
Ahora, como beneficio adicional de PHP Storm, cuando trabajo con captadores y definidores, tengo la posibilidad de utilizar la función de autocompletar:

En el caso de __get no tengo esta opción, solo puedo escribir esto:
$vaca->peso = -100

Ahora la vaca “pesa” (pesos) menos 100 kg.
Puedo olvidar que esto es peso en kg, solo escriba peso y todo funcionará.
Por lo tanto, los captadores y definidores pueden ser muy útiles (pero aun así no los adores, no eres un programador de Java). Si solo quieres propiedades gratuitas, usa una matriz:
$vaca = array("peso" => 100, "piernas" => 4);

Este truco es mucho más fácil de realizar que __get y __set.
Pero, si desea estar seguro de que sus datos siempre tengan solo valores válidos, utilice configuradores con validación. Si tiene un entorno de desarrollo integrado (IDE) como PHP Storm, le encantarán los configuradores porque son muy fáciles de usar. En lugar de $cow->setLegs() para PHP Storm, será suficiente escribir cosl. ¡Sí, fácil! No hay más errores tipográficos y puedes ver qué parámetros toma el método.
El método __set tiene otro inconveniente. Solo acepta 1 parámetro. ¿Y si necesitas 2? Por ejemplo, como aquí: $tienda1->setPrice("artículo-1", 100). Debes fijar el precio del producto en la tienda. El método __set no le permitirá hacer esto, pero el configurador sí.

Implementación de interfaz Colocar Es una colección desordenada que no puede contener datos duplicados.

Interfaz Colocar incluye los siguientes métodos:

MétodoDescripción
agregar(Objeto o) Agregar un elemento a la colección si falta. Devuelve verdadero si se agregó el elemento.
agregarTodo(Colección c) Agregar elementos de la colección si faltan.
claro() Limpiando la colección.
contiene(Objeto o) Comprobar la presencia de un elemento en un conjunto. Devuelve verdadero si se encuentra el elemento.
contieneTodo(Colección c) Comprobando la presencia de una colección en un conjunto. Devuelve verdadero si todos los elementos están contenidos en el conjunto.
es igual(Objeto o) Control de igualdad.
código hash() Obteniendo el código hash del conjunto.
esta vacio() Comprobando la presencia de elementos. Devuelve verdadero si no hay elementos en la colección.
iterador() Función para obtener un iterador de colección.
eliminar (Objeto o) Eliminar un elemento de un conjunto.
eliminarTodo(Colección c) Elimina todos los elementos de la colección pasada del conjunto.
retenerTodo(Colección c) Eliminando elementos que no pertenecen a la colección pasada.
tamaño() Número de elementos de la colección.
a matriz() Convertir un conjunto en una matriz de elementos.
aArray(T a) Convertir un conjunto en una matriz de elementos. A diferencia del método anterior, que devuelve una matriz de objetos de tipo Objeto, este método devuelve una matriz de objetos del tipo pasado en el parámetro.

Para interactuar con la familia Colocar relatar Conjunto de hash, Conjunto de árboles Y LinkedHashSet. En conjuntos Colocar Diferentes implementaciones utilizan diferentes órdenes de almacenamiento de elementos. En HashSet, el orden de los elementos está optimizado para una búsqueda rápida. El contenedor TreeSet almacena objetos ordenados en orden ascendente. LinkedHashSet almacena elementos en el orden en que fueron agregados.

Conjunto de datos HashSet

Constructores de HashSet:

// Crea un conjunto vacío con una capacidad inicial de 16 y un factor de carga predeterminado de 0,75 public HashSet(); // Creando un conjunto a partir de elementos de la colección public HashSet(Collection c); // Crea un conjunto con la capacidad inicial especificada y // el factor de carga predeterminado (0,75) public HashSet(int initialCapacity); // Crea un conjunto con la capacidad inicial especificada y // el factor de carga public HashSet(int inicialCapacity, float loadFactor);

Métodos HashSet

  • tamaño int público()
  • booleano público está vacío ()
  • agregar booleano público (Objeto o)
  • addAll booleano público (Colección c)
  • eliminación booleana pública (Objeto o)
  • removeAll booleano público (Colección c)
  • booleano público contiene (Objeto o)
  • vacío público claro()
  • Clon de objeto público()
  • iterador público iterador()
  • Objeto público aArray()
  • booleano público retener todo (Colección c)

Conjunto de hash contiene métodos similares a ArrayList. La excepción es el método add(Object o), que sólo agrega un objeto si falta. Si se agrega un objeto, el método add devuelve verdadero; en caso contrario, falso.

Ejemplo de uso de HashSet:

Conjunto de hash hashSet = nuevo HashSet (); hashSet.add("Patatas"); hashSet.add("Zanahoria"); hashSet.add("Remolacha"); hashSet.add("Pepinos"); // La siguiente entrada no debe estar en el conjunto hashSet.add("Patatas"); // Imprime el tamaño establecido en la consola System.out.println("HashSet size = " + hashSet.size()); // Imprime las entradas del iterador en la consola itr = hashSet.iterator(); mientras (itr.hasNext()) ( System.out.println(itr.next().toString()); )

Deberíamos ver sólo 4 entradas en la consola. Cabe señalar que el orden en que se agregan los registros al conjunto será impredecible. Conjunto de hash utiliza hash para acelerar la recuperación.

Ejemplo de uso Conjunto de hash con valores enteros. Agregamos valores del 0 al 9 de 25 posibles valores seleccionados aleatoriamente al conjunto; no habrá duplicación.

Aleatorio aleatorio = nuevo Aleatorio(30); Colocar iset = nuevo HashSet (); para(int i = 0; i< 25; i++) iset.add(random.nextInt(10)); // Вывести в консоль записи Iterator

Cabe señalar que la implementación Conjunto de hash no se sincroniza. Si varios subprocesos acceden a un conjunto de hash simultáneamente y uno o más subprocesos deben modificar el conjunto, entonces se debe sincronizar externamente. Es mejor hacerlo en el momento de la creación para evitar el acceso accidental y no sincronizado al conjunto:

Colocar set = Colecciones.synchronizedSet (nuevo HashSet ());

Conjunto de datos LinkedHashSet

Clase LinkedHashSet hereda Conjunto de hash sin agregar ningún método nuevo, y mantiene una lista vinculada de los elementos del conjunto en el orden en que fueron insertados. Esto permite una iteración ordenada de la inserción en el conjunto.

Constructores LinkedHashSet:

// Crea un conjunto vacío con una capacidad inicial (16) y un valor de factor de carga predeterminado (0,75) public LinkedHashSet() // Crea un conjunto a partir de los elementos de la colección public LinkedHashSet(Collection c) // Crea un conjunto con una inicial especificada capacidad y un valor de factor de carga predeterminado (0,75) public LinkedHashSet(int inicialCapacity) // Crea un conjunto con la capacidad inicial especificada y el factor de carga public LinkedHashSet(int inicialCapacity, float loadFactor)

Así como Conjunto de hash, LinkedHashSet no sincronizado. Por lo tanto, cuando se utiliza esta implementación en una aplicación con muchos subprocesos, algunos de los cuales pueden realizar cambios en el conjunto, la sincronización se debe realizar en la etapa de creación:

Colocar set = Collections.synchronizedSet (nuevo LinkedHashSet ());

Conjunto de datos TreeSet

Clase Conjunto de árboles Crea una colección que utiliza un árbol para almacenar elementos. Los objetos se almacenan en orden ascendente.

Constructores de TreeSet:

// Crear un conjunto de árboles vacío, ordenado según el // ordenamiento natural de sus elementos TreeSet() // Crear un conjunto de árboles que contenga los elementos del conjunto especificado, // ordenados según el orden natural de sus elementos. TreeSet(Colecciónc) // Crea un conjunto de árboles vacío, ordenado según el comparador TreeSet(Comparatorcomparador) // Crea un conjunto de árbol que contiene los mismos elementos y usa // el mismo orden que el conjunto ordenado especificado TreeSet(SortedSet s)

Métodos TreeSet

  • adición booleana (Objeto o)
  • booleano addAll(ColecciónC)
  • Techo de objeto(Objeto o)
  • vacío claro()
  • Clon de TreeSet()
  • Comparadorcomparador()
  • booleano contiene (Objeto o)
  • Iterador Iterador descendente()
  • Conjunto navegable conjunto descendente()
  • Objeto primero()
  • Piso de objeto(Objeto o)
  • Conjunto ordenado auricular(E e)
  • Conjunto navegable headSet(E e, booleano inclusive)
  • Objeto superior(Objeto o)
  • booleano está vacío()
  • Iterador iterador()
  • Elástico()
  • mi inferior(mi mi)
  • Encuesta EPrimera()
  • E encuestaLast()
  • booleano eliminar (Objeto o)
  • tamaño entero()
  • Separador divisor()
  • Conjunto navegable subconjunto(E deElemento, booleano deInclusivo, E deElemento, booleano deInclusivo)
  • Conjunto ordenado subconjunto(E desdeElemento, E hastaElemento)
  • Conjunto ordenado tailSet(E deElemento)
  • Conjunto navegable tailSet(E deElemento, booleano inclusive)
  • En el siguiente ejemplo modificado del uso Conjunto de árboles Los valores se enviarán a la consola en forma ordenada.

    Conjunto ordenado treeSet = nuevo TreeSet (); treeSet.add("Remolacha"); treeSet.add("Pepinos"); treeSet.add("Tomates"); treeSet.add("Patatas"); treeSet.add("Zanahoria"); // Esta entrada no debe incluirse en el conjunto treeSet.add("Patatas"); // Imprime el tamaño del conjunto en la consola System.out.println("treeSet size = " + treeSet.size()); // Imprime las entradas del iterador en la consola itr = árbolSet.iterator(); while (itr.hasNext()) ( System.out.println(itr.next().toString()); ) Aleatorio aleatorio = new Aleatorio(30); Conjunto ordenado iset = nuevo conjunto de árboles (); para(int i = 0; i< 25; i++) iset.add(random.nextInt(10)); // Вывести в консоль записи Iteratoritr = iset.iterador(); mientras (itr.hasNext()) ( System.out.println(itr.next().toString()); )

    Última actualización: 29/07/2018

    Además de los métodos habituales, el lenguaje C# proporciona métodos de acceso especiales llamados propiedades. Proporcionan fácil acceso a los campos de clase, descubren su valor o los configuran.

    La descripción de propiedad estándar tiene la siguiente sintaxis:

    [modificador_acceso] tipo_retorno nombre_personalizado ( // código de propiedad )

    Por ejemplo:

    Persona de clase (nombre de cadena privada; nombre de cadena pública (obtener (devolver nombre;) establecer (nombre = valor;)))

    Aquí tenemos un campo de nombre privado y una propiedad de Nombre público. Aunque tienen casi el mismo nombre salvo caso, esto no es más que un estilo sus nombres pueden ser arbitrarios y no necesariamente tienen que coincidir;

    A través de esta propiedad podemos controlar el acceso a la variable de nombre. La definición de propiedad estándar contiene bloques get y set. En el bloque get devolvemos el valor del campo y en el bloque set lo configuramos. El parámetro de valor representa el valor que se pasará.

    Podemos usar esta propiedad así:

    Persona p = nueva Persona(); // Establecer la propiedad - se activa el bloque Establecer // el valor "Tom" es el valor pasado a la propiedad p.Name = "Tom"; // Obtener el valor de la propiedad y asignarlo a una variable: se activa el bloque Obtener cadena personName = p.Name;

    Quizás surja la pregunta: ¿por qué necesitamos propiedades si podemos arreglárnoslas con campos de clase ordinarios en esta situación? Pero las propiedades le permiten agregar lógica adicional que puede ser necesaria, por ejemplo, al asignar un valor a una variable de clase. Por ejemplo, necesitamos configurar una verificación de edad:

    Persona de clase (edad int privada; edad int pública (establecer (si (valor< 18) { Console.WriteLine("Возраст должен быть больше 17"); } else { age = value; } } get { return age; } } }

    No es necesario que los bloques set y get estén presentes en una propiedad al mismo tiempo. Si una propiedad está definida únicamente por un bloque get, entonces la propiedad es de solo lectura: podemos obtener su valor, pero no establecerlo. Por el contrario, si una propiedad solo tiene un bloque establecido, entonces esa propiedad solo se puede escribir; solo puede establecer el valor, pero no puede obtenerlo:

    Clase Persona ( nombre de cadena privada; // propiedad de solo lectura cadena pública Nombre ( get ( nombre de retorno; ) ) edad int privada; // propiedad de solo escritura public int Edad ( set ( edad = valor; ) ) )

    Modificadores de acceso

    Podemos aplicar modificadores de acceso no sólo a toda la propiedad, sino también a bloques individuales, ya sea get o set:

    Persona de clase (nombre de cadena privada; nombre de cadena pública (obtener (nombre de retorno;) conjunto privado (nombre = valor;)) Persona pública (nombre de cadena, int edad) (Nombre = nombre; Edad = edad;))

    Ahora podemos usar el bloque de conjunto cerrado solo en esta clase, en sus métodos, propiedades, constructor, pero no en otra clase:

    Persona p = nueva Persona("Tom", 24); // Error: el conjunto se declara con el modificador privado //p.Name = "John"; Console.WriteLine(p.Nombre);

    Al utilizar modificadores en propiedades, hay una serie de restricciones a considerar:

      Se puede establecer un modificador para un bloque set u get si la propiedad tiene bloques set y get.

      Sólo un bloque set u get puede tener un modificador de acceso, pero no ambos

      El modificador de acceso de un bloque set o get debe ser más restrictivo que el modificador de acceso de una propiedad. Por ejemplo, si una propiedad tiene el modificador public, entonces el bloque set/get solo puede tener los modificadores protected internal, internal, protected, private.

    Encapsulación

    Vimos anteriormente que el acceso a las variables de clase privada se establece a través de propiedades. Ocultar de esta manera el estado de una clase de interferencias externas representa el mecanismo de encapsulación, que representa uno de los conceptos clave de la programación orientada a objetos. (Vale la pena señalar que el concepto mismo de encapsulación tiene bastantes interpretaciones diferentes, que no siempre se superponen entre sí). El uso de modificadores de acceso privado protege una variable del acceso externo. Para controlar el acceso, muchos lenguajes de programación utilizan métodos especiales, captadores y definidores. En C#, su papel normalmente lo desempeñan las propiedades.

    Por ejemplo, hay alguna clase de Cuenta que tiene un campo de suma que representa una suma:

    Cuenta de clase (public int sum;)

    Dado que la variable de suma es pública, podemos acceder a ella en cualquier parte del programa y cambiarla, incluso establecer cualquier valor no válido, por ejemplo, negativo. Es poco probable que tal comportamiento sea deseable. Por lo tanto, la encapsulación se utiliza para restringir el acceso a la variable suma y ocultarla dentro de la clase:

    Cuenta de clase (suma int privada; suma int pública (obtener (suma de retorno;) establecer (si (valor> 0) (suma = valor;)))))

    Propiedades automáticas

    Las propiedades controlan el acceso a los campos de una clase. Sin embargo, ¿qué pasa si tenemos una docena o más de campos? Definir cada campo y escribir una propiedad del mismo tipo sería tedioso. Por lo tanto, se agregaron propiedades automáticas al marco .NET. Tienen una declaración abreviada:

    Persona de clase (cadena pública Nombre (obtener; establecer;) edad int pública (obtener; establecer;) Persona pública (nombre de cadena, edad int) (Nombre = nombre; Edad = edad;))

    De hecho, aquí también se crean campos para propiedades, solo que no los crea el programador en el código, sino que el compilador los genera automáticamente durante la compilación.

    ¿Cuál es la ventaja de las propiedades automáticas? Si en esencia solo acceden a una variable creada automáticamente, ¿por qué no acceder directamente a una variable sin propiedades automáticas? El hecho es que en cualquier momento, si es necesario, podemos expandir la propiedad automática a una propiedad normal y agregarle alguna lógica específica.

    Vale la pena considerar que no se pueden crear propiedades automáticas de solo escritura, como es el caso de las propiedades estándar.

    A las propiedades automáticas se les pueden asignar valores predeterminados (inicializando propiedades automáticas):

    Clase Persona (cadena pública Nombre ( get; set; ) = "Tom"; public int Edad ( get; set; ) = 23; ) class Programa ( static void Main(string args) ( Persona persona = nueva Persona(); Consola .WriteLine(persona.Nombre); // Tom Console.WriteLine(persona.Edad // 23 Console.Read();

    Y si no especificamos los valores de las propiedades Nombre y Edad para el objeto Persona, se aplicarán los valores predeterminados.

    Las propiedades automáticas también pueden tener modificadores de acceso:

    Persona de clase (cadena pública Nombre (conjunto privado; obtener;) Persona pública (cadena n) ( Nombre = n; ) )

    Podemos eliminar el bloque set y hacer que la propiedad automática sea de solo lectura. En este caso, para almacenar el valor de esta propiedad, se creará implícitamente un campo con el modificador readonly, por lo que se debe tener en cuenta que dichas propiedades get se pueden configurar desde el constructor de la clase, como en el ejemplo. arriba, o al inicializar la propiedad:

    Persona de clase (nombre de cadena pública (get;) = "Tom")

    Notación abreviada para propiedades

    Al igual que los métodos, podemos acortar las propiedades. Por ejemplo:

    Persona de clase (nombre de cadena privada; // equivalente a nombre de cadena pública (obtener (nombre de retorno;)) Nombre de cadena pública => nombre;)

    Para controlar cómo se utilizan los campos, puede crear métodos get y set y hacerlos públicos. Proporcionan la capacidad de controlar el acceso a un campo. Al mismo tiempo, es mejor hacer que el campo Edad sea privado para que no se pueda acceder directamente a él fuera de la clase.

    cuenta de clase pública

    edad privada;

    público int GetAge()

    devolver esta.edad;

    conjunto de edad vacío público (int en edad)

    if ((enEdad > 0) && (enEdad< 120))

    this.age = inEdad;

    Ahora podemos controlar el acceso a nuestro campo, pero esto requiere escribir mucho código adicional. Para acceder al valor de edad, debe llamar a los métodos creados:

    Cuenta s = nueva cuenta();

    Console.WriteLine("Edad: " + s.GetAge());

      1. Usando propiedades

    Las propiedades facilitan la gestión de datos. La propiedad Age se puede declarar de la siguiente manera:

    cuenta de clase pública

    valor de edad int privado;

    si ((valor > 0) && (valor< 120))

    valoredad = valor;

    valor de edad de retorno;

    Aquí el valor de la edad es una propiedad. La propiedad declara secciones para escribir y leer su valor. Las acciones descritas en estas secciones son equivalentes a los métodos descritos anteriormente. En este caso, las propiedades se utilizan de la misma forma que los campos normales:

    Cuenta s = nueva cuenta();

    Console.WriteLine("Edad: " + s.Edad);

    Cuando la propiedad Edad se establece en un valor, se llama al código de sección establecido. La palabra clave value denota el valor asignado a la propiedad. Al leer el valor de la propiedad Edad, se llama al código de la sección get. Este enfoque combina las ventajas de utilizar métodos y le permite trabajar con propiedades tan fácilmente como con campos de clase.

    Comprobar la exactitud de los datos en las propiedades. . Si intenta establecer un valor de edad no válido (por ejemplo, 150), el código anterior realizará una verificación de validez y rechazará el valor (nadie mayor de 120 años puede tener una cuenta en nuestro banco), dejando el valor de vejez. La única forma de saber si a una propiedad se le ha asignado un valor es verificar el valor de la propiedad después de esta operación:

    Cuenta s = nueva cuenta();

    int nuevaEdad = 150;

    if (s.Edad! = nuevaEdad)

    Console.WriteLine("No se estableció el valor de edad");

    El siguiente código intenta establecer la edad en un valor no válido de 150 y luego verifica si se estableció ese valor. Si se usara el método Set para asignar el valor, podría devolver el valor FALSO Si esto falla, entonces el uso de la propiedad requiere que el usuario haga un poco más de trabajo adicional.

    Diferentes formas de leer el valor de una propiedad. Las propiedades le permiten realizar otras acciones útiles.

    public int Edad en meses

    devuelve this.ageValue * 12;

    La nueva propiedad AgeInMonths se describe aquí. Es de sólo lectura porque no contiene una sección establecida. Devuelve el valor de edad en meses, utilizando el mismo valor que la propiedad Edad. Esto significa que puedes utilizar varios métodos diferentes para obtener el mismo valor. Es posible crear propiedades de sólo lectura sin poder cambiarlas directamente, así como propiedades de sólo escritura, aunque estas últimas rara vez se utilizan.

    Propiedades de los elementos visuales. . Tiene sentido utilizar propiedades en la descripción de una cuenta bancaria, donde es necesario proteger los datos de los objetos. Pero en Silverlight, puede ingresar cualquier texto en un elemento TextBlock y parece que no hay necesidad de verificar la validez del valor ingresado. La ejecución de este código ralentizará el proceso de entrada de valores. Entonces, al convertir el valor Texto en una cadena pública, el programa contendría menos código y se ejecutaría más rápido.

    Pero cuando cambiamos el texto en el elemento TextBlock, queremos que el texto en la página Silverlight también cambie, por ejemplo cuando el programa Adder muestra el resultado. Si el programa simplemente cambiara el valor del campo, Silverlight no tendría forma de saber que es necesario actualizar el mensaje en la pantalla.

    Sin embargo, si Text se convierte en una propiedad, cuando se actualiza el valor del elemento TextBlock, se ejecutará el método correspondiente, que puede actualizar el valor almacenado del cuadro de texto y llamar a un método para actualizar la pantalla y mostrar el nuevo valor. Las propiedades brindan la capacidad de manipular un objeto cuando cambia su valor. Operación simple:

    resultadoTextBlock.Text = "0";

    puede resultar en varios cientos de operaciones de C# porque almacenar el nuevo valor en el elemento TextBlock desencadena operaciones para actualizar la imagen de la pantalla.