¿Por qué las personas siempre usan valores de enumeración como 0, 1, 2, 4, 8
y no 0, 1, 2, 3, 4
?
¿Tiene esto algo que ver con operaciones de bits, etc.?
Realmente agradecería un pequeño fragmento de muestra sobre cómo se usa correctamente :)
[Flags]
public enum Permissions
{
None = 0,
Read = 1,
Write = 2,
Delete = 4
}
c#
permissions
enums
flags
Pascal
fuente
fuente
|
(y&
). Las diversas respuestas suponen que está familiarizado con él.Respuestas:
Porque son poderes de dos y puedo hacer esto:
Y tal vez más tarde ...
Es un campo de bits, donde cada bit establecido corresponde a algún permiso (o lo que corresponda lógicamente al valor enumerado). Si estos se definieran como
1, 2, 3, ...
no podría utilizar operadores bit a bit de esta manera y obtener resultados significativos. Para profundizar ...¿Ves un patrón aquí? Ahora si tomamos mi ejemplo original, es decir,
Luego...
¿Ver? Tanto los
Read
yWrite
se establecen los bits, y puedo comprobar que de forma independiente (Observe también que elDelete
bit es no establece, por lo que este valor no transmiten permiso para eliminar).Le permite a uno almacenar múltiples banderas en un solo campo de bits.
fuente
myEnum.IsSet
. Soy de la opinión de que esta es una abstracción completamente inútil y sirve solo para reducir la escritura, pero mehFlags
atributo hace poco más que darle iirc de 'impresión bonita'. Puede usar un valor enumerado como indicador independientemente de la presencia del atributo.0
no esfalse
;false
esfalse
. Sin embargo, podrías escribirif((permissions & Permissions.Write) > 0)
.(permissions & Permissions.Write) == Permissions.Write
, ahora puede usarenum.HasFlag()
Si aún no está claro en las otras respuestas, piénselo de esta manera:
es solo una forma más corta de escribir:
Hay ocho posibilidades, pero puede representarlas como combinaciones de solo cuatro miembros. Si hubiera dieciséis posibilidades, podría representarlas como combinaciones de solo cinco miembros. Si hubiera cuatro mil millones de posibilidades, ¡podría representarlas como combinaciones de solo 33 miembros! Obviamente, es mucho mejor tener solo 33 miembros, cada uno (excepto cero) una potencia de dos, que tratar de nombrar cuatro mil millones de elementos en una enumeración.
fuente
enum
con cuatro mil millones de miembros. Y la parte triste es que probablemente alguien lo haya intentado.2 ** -infinity
como una potencia de dos).Debido a que estos valores representan ubicaciones de bits únicas en binario:
etc., entonces
EDITAR:
3 en binario está representado por un valor de 1 tanto en el lugar de las unidades como en el de los dos. En realidad es lo mismo que el valor
1 | 2
. Entonces, cuando intenta usar los lugares binarios como indicadores para representar algún estado, 3 generalmente no tiene sentido (a menos que haya un valor lógico que en realidad sea la combinación de los dos)Para mayor aclaración, es posible que desee ampliar su enumeración de ejemplo de la siguiente manera:
Por lo tanto, en que tengo
Permissions.All
, también tienen implícitamentePermissions.Read
,Permissions.Write
yPermissions.Delete
fuente
3
es11
binario, es decir, no se asigna a un solo bit establecido, por lo que pierde la capacidad de asignar 1 bit en una posición arbitraria a un valor significativo.2|3 == 1|3 == 1|2 == 3
. Así que si usted tiene un valor con el binario00000011
, y sus banderas incluido los valores1
,2
y3
, a continuación, usted no sabe si ese valor representa1 and 3
,2 and 3
,1 and 2
oonly 3
. Eso lo hace mucho menos útil.Creo que escribir así es más fácil de entender y leer, y no es necesario calcularlo.
fuente
Estos se utilizan para representar banderas de bits que permiten combinaciones de valores de enumeración. Creo que es más claro si escribes los valores en notación hexadecimal
fuente
4194304
por 2? ¿Qué tal0x400000
? Es mucho más fácil reconocerlo0x800000
como la respuesta correcta que8388608
, y también es menos propenso a errores al escribir el valor hexadecimal.0x10000
un poder de dos? Sí, comienza con 1, 2, 4 u 8 y tiene todos los 0 después. No es necesario traducir mentalmente 0x10 a 16 (aunque hacerlo probablemente se convertirá en una segunda naturaleza eventualmente), solo piense en ello como "un poder de 2".Esto es realmente más un comentario, pero como eso no admitiría el formato, solo quería incluir un método que he empleado para configurar enumeraciones de banderas:
Encuentro este enfoque especialmente útil durante el desarrollo en el caso en que le gusta mantener sus banderas en orden alfabético. Si determina que necesita agregar un nuevo valor de indicador, puede insertarlo alfabéticamente y el único valor que debe cambiar es el que ahora precede.
Sin embargo, tenga en cuenta que una vez que se publica una solución en cualquier sistema de producción (especialmente si la enumeración se expone sin un acoplamiento estrecho, como en un servicio web), es muy recomendable no cambiar ningún valor existente dentro de la enumeración.
fuente
Muchas buenas respuestas a esta ... solo diré ... si no le gusta o no puede comprender fácilmente lo que la
<<
sintaxis está tratando de expresar ... Personalmente prefiero una alternativa (y me atrevo a decir, un estilo de declaración de enumeración sencillo ) ...LOG 513 == 513
Mucho más fácil (para mí, al menos) de comprender. Alinee los ... describa el resultado que desea, obtenga el resultado que DESEA. No se necesitan "cálculos".
fuente