Duvida sobre A utilização de Struct e Enum
Olá Finalmente estou estreando essa consultoria...
A minha duvida é quando usar Struct e quando usar Enum.
Tenho um projeto que estou refazendo do inicio e estou projetando os meu objetos (POCOS) do zero e estou com duvida de qdo usar um ou outro....
Segue abaixo o meu Diagrama de classes, onde vc pode ver que estou tentando utilizar um struct para definir que tipo de produto esta sendo cadastrado, se e um serviço matéria prima ou material de consumo.
Essa classificação pode sofrer alterações ao decorrer do tempo e acredito que uma struct daria mas flexibilidade para o projeto. Estou certo????
Para deixar mais claro de como e a minha arquitetura vou descreve la resumidamente....
eu trabalho em um arquitetura em camadas e utilizo o nhibernete na minha camada de persistência.
Daniel Porfirio
Curtidas 0
Respostas
Luiz Maia
29/01/2009
Ola Daniel, seja bem vindo!
Bom, simplificando, o uso de Enum "engessa" os valores sua aplicação, você deve usá-lo quando quer criar um domínio para seus valores, como o uso de constantes.
Os Structs tem comportamento parecido com as classes, realmente são muito mais flexiveis. E ao contrário das classes não precisam de ser instanciadas.
Ambos são tipos de valores (Value_Types), isto significa que os dados que eles contêm são armazenados numa pilha (stack) na memória.
Já as Classes são Tipos de Referencia (Reference-Types) que são armazenadas na memória heap, por isto tem performace pior, tem necessitam de boxing e unboxing.
OS Structs são implicitamente derivados da classe chamada System.ValueType. Segue um exemplo de Struct:
MinhaEstrutura
{
public int x, y, z;
}
Criar a estrutura:
MinhaEstrutura me = new MinhaEstrutura();
Uma strutura não pode ter a instancia do campo como uma classe:
Class A
{
int i = 8; // correto
}
Struct
{
int i = 8; // errado
}
A enumeração consiste um set (lista) de constantes de um domínio.
Seus elementos tem os valores inteiros começando pelo ZERO e incrementando um sucessivamente.
Exemplo:
enum cores{vermelho, azul, verde};
chamada: int Cor = (int) cores.vermelho;
Qualquer dúvida estamos a disposição.
Att
Luiz Maia
GOSTEI 0
Daniel Porfirio
29/01/2009
Legal e bem oq eu estava imaginando msm valeu pela força
Agora o problema e outro como trabalhar com struct no nhibernate nunca fiz isso, sera que vs poderia me ajudar
E aproveitando gostaria de saber se a minha estrutura esta correta, eu implementei algumas sobrecargas para facilitar a utilização da mesma e seguindo o exemplo do artigo do Giovanni Bassi da edição 58 e praticamente uma copia hehehe
public struct ProdutoTipo
{
public string Descricao { get; private set; }
public int ID { get; private set; }
private static ProdutoTipo _ProdutoVenda = new ProdutoTipo()
{ ID = 1, Descricao = "Produto para Venda" };
public ProdutoTipo ProdutoVenda
{ get { return _ProdutoVenda; } }
private static ProdutoTipo _MateriaPrima = new ProdutoTipo()
{ ID = 2, Descricao = "Materia Prima" };
public ProdutoTipo MateriaPrima
{ get { return _MateriaPrima; } }
private static ProdutoTipo _ProdutoConsumo = new ProdutoTipo()
{ ID = 3, Descricao = "Produto para Consumo" };
public ProdutoTipo ProdutoConsumo
{ get { return _ProdutoConsumo; } }
private static ProdutoTipo _Servico = new ProdutoTipo()
{ ID = 4, Descricao = "Servi‡o" };
public ProdutoTipo Servico
{ get { return _Servico; } }
public override bool Equals(object obj)
{
if (!(obj is ProdutoTipo))
return false;
return ((ProdutoTipo)obj).Descricao == this.Descricao;
}
public override bool operator ==(ProdutoTipo objA, ProdutoTipo objB)
{ return objA.Equals(objB); }
public override bool operator !=(ProdutoTipo objA, ProdutoTipo objB)
{ return !objA.Equals(objB); }
public override int GetHashCode()
{ return this.ID; }
}
GOSTEI 0
Luiz Maia
29/01/2009
Daniel,
Quando você usa struct como componente para seus mapeamentos, o nHibernate não consegue popular as propriedades dos métodos GET do Struct, ou seja, não dá para usar os dois juntos.
Se sua aplicação ainda estiver no início, te aconselho a trocar o nHibernate pelo Linq e usar os Lists<>.
Aguardo seu retorno.
Att
Luiz Maia
GOSTEI 0
Daniel Porfirio
29/01/2009
Bom nesse caso terei que optar por engessar um pouco a aplicação por causa do prazo estar muito curto
Muito abrigado pela Ajuda
GOSTEI 0
Luiz Maia
29/01/2009
Blz Daniel, precisando é só nos contactar.
Sucesso em sua aplicação.
Abraços
Att
Luiz Maia
GOSTEI 0