Investigacion

Solo disponible en BuenasTareas
  • Páginas : 7 (1675 palabras )
  • Descarga(s) : 0
  • Publicado : 9 de mayo de 2011
Leer documento completo
Vista previa del texto
Enumeracion como bandera
27 03 2009
Bien definamos primero estas dos cosas.
La enumeración en C# la utilizamos cuando necesitamos tener valores definidos de la forma nombre valor, y poder restringir por ejemplo a que una variable solo pueda contener valores definidos en la enumeración, para evitar que otro desarrollador ingrese valores incorrectos.
Por otro lado el uso de banderas se basa enel mismo principio, valores definidos previamente y que en lo posible solo pueda tomar valores definidos dentro de las mismas; Ahora bien, la diferencia entre la una y la otra es la conjugación entre los distintos valores definidos en la enumeración, por un lado la enumeración solo permite que el valor almacene un dato definido mientras que con el concepto de banderas podemos conjugarlos yobtener nuevos valores.
Veamos un ejemplo.
Puedo definir la siguiente enumeración para administrar los atributos de un archivo.
enum FileAttribute
{
Read,
Write,
Execution
}
Bien vemos simplemente tres valores que puede tomar Read, Write, Execution, pero por ejemplo para este caso en especial sabemos que un archivo puede tener mas de un atributo al tiempo, es decir, puede serLectura y también escritura, si usáramos la enumeración tal cual está, entonces no podríamos asignar ninguna combinación de esos valores, si no, tendríamos que crear otro valor que fuese Read_Write por ejemplo, es aquí donde el concepto de bandera surge para solventar este inconveniente.
Expliquemos algo importante primero, cuando se crea una enumeración como la expuesta, el compilador asignainmediatamente los valores por defecto a cada item, con lo que se tendría que Read=0,Write=1,Execution=2; Ahora supongase que hubiese un cuarto item con valor 3, con lo cual nos damos cuenta que no podríamos por ejemplo decir que el fichero se puede escribir y ejecutar, ya que 1+2=3 lo cual nos resultaría el 3 item de la enumeración y no la combinación del item 1 y 2.
Las banderas nos solucionan esteproblema, para poder generar expresiones del tipo se puede leer y ejecutar el fichero, se puede escribir pero no ejecutar y demás expresiones lógicas. La solución es realmente sencilla simplemente vamos a indicar los valores a cada item pero no valores arbitrarios si no que vamos a usar valores de la forma 2^(n-1) donde n es la posición de cada item, entonces la enumeración anterior sería indicada deesta forma.
enum FileAttribute
{
Read=0x1,
Write=0x2,
Execution=0x4,
Delete=0x8
}
Ahora veamos, nótese que podría usar expresiones del tipo Lectura escritura, si sumamos los valores de los items Read y Write nos da un 3 y notemos que no hay ningún item con ese valor, por tanto estamos identificando correctamente que se trata de la combinación de los dos primeros items. Cómoescribimos lo anterior, sencillo, usamos el operador | que es el operador OR pero a nivel Binario por tanto quedaría Read | Write; ahora miremos como podría saber yo en una comparación if si una bandera esta aplicada o no.
Supongase por ejemplo que envíe como valor la siguiente expresión (Read | Write); dentro de un método por ejemplo para saber si la bandera Read esta aplicada usaríamos losiguiente:
public void Revisar(FileAttribute Bandera)
{
if ((Bandera & FileAttribute.Read) == FileAttribute.Read)
{
//Leer
}
}
Expliquemos pues como es que funciona todo esto, recordemos que el operador | es un OR Binario o suma binaria, y que el operador & es un AND binario o multiplicación.
Tomemos entonces lo siguiente:
Revisar(FileAttribute.Read |FileAttribute.Write);
aquí estoy diciendo que el archivo se puede leer pero que también se puede escribir, observemos que el item Read tiene el valor 1 en binario y que el item Write tiene el valor 10 en binario por tanto al hacer la operación OR binaria (|) estamos enviando el siguiente valor 11 en binario.
Cuando lo recibimos dentro de la condición lo que realmente nos queda es lo siguiente:
if(11 & 01==01)...
tracking img