Pergunta

Para permitir diferentes opções de formatação em um método que exibe uma notícia, eu criei uma enumeração que pode ser passado para especificar a forma como ele é exibido.

[Flags]
private enum NewsStyle
{
    Thumbnail = 0,
    Date = 1,
    Text = 2,
    Link = 4,
    All = 8
}

string FormatNews( DataRow news, NewsStyle style )
{
    StringBuilder HTML = new StringBuilder();

    // Should the link be shown
    if ( ((newsStyle & NewsStyle.All) == NewsStyle.All || (newsStyle & NewsStyle.Link) == NewsStyle.Link))
    {
                HTML.AppendFormat("<a style=\"text-decoration:none; color: rgb(66, 110, 171);\" href=\"ViewStory.aspx?nsid={0}\">",
                                  UrlEncode(newsStory["NewsStoryID"].ToString()));
    }

    // Etc etc...
}

// So to call the method...
Response.Write( FormatNews( news, NewsStyle.Date | NewsStyle.Text ) );

O problema é que eu só posso obter o código para o trabalho, se eu especificar manualmente os valores na enumeração, caso contrário, o bit a bit enum verificação do funcionamento não funciona corretamente.

Eu sempre seguido a regra de deixar .net lidar com a atribuição de valores a enums? - esta é uma exceção geniuine

Foi útil?

Solução

Sim, é uma exceção genuína. Enumerações são por valores por defeito atribuídos de 0 em diante, cada uma um mais elevado do que o valor anterior, independentemente de quaisquer FlagsAttributes. (Há, obviamente, são regras mais elaboradas para quando você especificar alguns valores manualmente - veja a documentação do MSDN )

Enquanto ele um pouco faz sentido ter um bandeiras enumeração automaticamente obter valores em potências de dois, não vejo razões pelas quais é melhor não fazê-lo:

É perfeitamente razoável ter um enum como este:

[Flags]
enum Foo
{
    None,
    Bar,
    Baz, 
    BarAndBaz
} 

Isto, obviamente, requer que os valores para ser 0, 1, 2 e 3 para ser sensível.

Seria muito contra-intuitivo para deixar a presença de uma mera alteração de atributo todo o significado de um pedaço de código C #. Considere o meu exemplo Foo enumeração. Deve remover o atributo Flags ser autorizados a quebrar o código de silêncio alterando os valores de enumerador?

Outras dicas

Sim, você tem que especificar os valores na enumeração para obter os valores bandeira adicionados para funcionar corretamente (para ser capaz de combinar duas bandeiras enum e não têm esse conflito valor com outra bandeira especificada). Você não tem que especificar valores para obtê-lo para compilar, mas o resultado mais provável não vai ser o que você está procurando.

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