Pergunta

Tem C # enums typesafe?

Se não, quais são as implicações?

Foi útil?

Solução

Para dar uma resposta ligeiramente diferente ... enquanto os valores são de tipo seguro do ponto de vista casting, eles ainda são desmarcada depois de terem sido elenco -. I

enum Foo { A = 1, B = 2, C = 3 }    
static void Main()
{
    Foo foo = (Foo)500; // works fine
    Console.WriteLine(foo); // also fine - shows 500
}

Por esta razão, você deve tomar cuidado para verificar os valores -. Por exemplo com um default em um switch que lança uma exceção

Você também pode verificar os (valores para não-[Flags]) via:

bool isValid = Enum.IsDefined(typeof(Foo), foo);

Outras dicas

Sim, eles são.

O seguinte é de http://www.csharp-station.com/Tutorials /Lesson17.aspx

Enums são constantes fortemente tipado. Eles são essencialmente tipos exclusivos que lhe permitem atribuir nomes simbólicos para valores integrais. No C # tradição, eles são fortemente digitado, o que significa que uma enumeração de um tipo não pode ser atribuída implicitamente a uma enumeração de outro tipo, mesmo que o valor subjacente de seus membros são os mesmos. Na mesma linha, tipos integrais e enums não são implicitamente intercambiáveis. Todas as atribuições entre os diferentes tipos de enumeração e tipos integrais exigem uma conversão explícita.

Para aqueles sugerindo a utilização Enum.IsDefined para fazer a validação de argumento ... não! Por Brad Abrams (do quadro de design Atualização Guidlines em Enum Design ):

Há realmente dois problemas com Enum.IsDefined (). Primeiro ele carrega reflexão e um monte de tipo de frio metadados tornando-se uma chamada enganosamente caro. Em segundo lugar, como alude nota para Há um problema de versão aqui.

Sim, eles são .

Enums são constantes fortemente tipado. Eles são tipos essencialmente únicas que permitem atribuir nomes simbólicos para valores integrais. No C # tradição, eles são fortemente digitado, o que significa que uma enumeração de um tipo não pode ser implicitamente atribuída a uma enumeração de outro tipo, mesmo que o valor subjacente de seus membros são o mesmo. Ao longo das mesmas linhas, tipos integrais e enums não são implicitamente intercambiáveis. Tudo atribuições entre enum diferente tipos e tipos integrais exigem um conversão explícita.

Sim.

C #: tipos de enumeração:

tipo seguro -A enumeração de valores nomeados.

-Impede erros de programação

-User pode controlar subjacente tipo (padrão int)

-Também pode controlar os valores subjacentes

Tecnicamente não, porque você pode representar um Enum como seu valor base (int, long, etc). No entanto, se você garantir que você só pode usar a enumeração por seus nomes fornecidos, você receberá erros tempo de compilação se você alterar o nome de um valor enumerado sem atualizar suas referências. A este respeito, sim, é tipo seguro.

Eu estou atrasado para a festa aqui, mas eu queria jogar um pouco algo extra ... Uma atualização para o . Diretrizes de design do .NET Framework de Krzysztof Cwalina. Além da excelente dica acima de verificação para garantir que um valor válido é passado para seus enumerações, este fornece outras orientações e conselhos sobre como usá-los efetivamente, um monte de armadilhas (especialmente envolvidos enums Flags), etc.

Sim, eles r fortemente tipado safed u pode não ele não faz conversão impilcit de variáveis ??enum constantes ao valor integeral u hv 2 expilcitly fazer dat por exemplo enum dias { Sol, seg } int e = (int) days.sun; Console.WriteLine (e);

C # enums são digite significado segura

  1. Você não pode converter implicitamente o tipo subjacente à enumeração real
  2. Além disso, você não pode atribuir um valor de um enum para outro enum, embora os tipos subjacentes de ambos os enums são os mesmos. Uma conversão explícita é sempre necessária.
  3. Enums tornar o código mais legível e mais sustentável.

Eu vim accross um excelente tutorial em vídeo sobre enums exaplaining sua natureza segura tipo. Dê uma olhada aqui .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top