É possivel comparar se uma classe é vazia?

public class Questionario
{
    public Periodo Periodo { get; set; } // <- para representar uma data!
    public List<Turma> ListaDeTurmas { get; set; }
    public List<Perguntas> ListaDePerguntas { get; private set; }
    //Questionario pode existir sem turma?
    //Questionario pode existir sem periogo ?

    public Questionario(List<Perguntas> listaDePerguntas, Periodo periodo)
    {
        Periodo = periodo;
        ListaDePerguntas = listaDePerguntas;
    }


    public bool ValidaQuestionario()
    {
        if (Periodo == null || `Quero saber aqui se Periodo é vazio` )
        {
            return false;
        }
        return true;
    }

}

// class periodo

namespace Minos.Site.Models
{
    public class Periodo
    {
        public DateTime DataInicial { get; set; }
        public DateTime DataFinal { get; set; }
    }
}
1 curtida

Explique melhor a frase:

É possivel comparar se uma classe é vazia?

Quero saber se o periodo que o usuario está passando para questionario é vazio!

Como Periodo é um tipo complexo (no caso é uma classe), para saber se a mesma tem alguma instância é comparando com null , exemplo:

Periodo p;

if (p == null) 
{
    // ou seja se entrar aqui porque a classe não foi inicializada
}

Classe vazia eu poderia interpreta como tem uma instância mas, seus membros estão no valor inicial !!!

null é diferente de vazia né ?

mas acho que sua frase

“Classe vazia eu poderia interpreta como tem uma instância mas, seus membros estão no valor inicial !!!”

responde minha pergunta, preciso verificar se os membros da classes não foram inicializados, se ele estão em default, obrigado!

1 curtida

null é diferente de vazia né?

Eu entendo que null é não existência de valor e no caso não ter uma instanciação ou é atribuido o valor null na sua declaração. Vazia eu entendo que ela existe !!! é bem ali os dois termos mas, eu entendo assim.

Bom pra solucionar isso tem várias formas uma é criar um método sobrecarregado na sua classe Periodo que vai testar se sua classe existe e também se os dados estão no seu dado inicial, como?

Simples olha só:

public class Periodo
{
	public DateTime DataInicial { get; set; }
	public DateTime DataFinal { get; set; }

	public static implicit operator bool(Periodo p)
	{
		return p != null &&
			p.DataInicial == DateTime.MinValue &&
			p.DataFinal == DateTime.MinValue;
	}
}

O método public static implicit operator boll(Periodo p) é um método sobrecarregado que agora vai te informar se sua classe é nula e também se suas duas propriedades estão no valor inicial.

Exemplo de como utilizar:

Periodo p = new Periodo();
if (p) // aqui é verificado se é nula e as propriedades estão com o valor inicial
{
	p.DataInicial = DateTime.Parse("23/07/2018");
}

Uma outra forma seria criando uma Interface com um método IsEmpty() e fazendo o mesmo código do método sobrecarregado, exemplo:

public interface IEmpty
{
	bool IsEmpty();
}

public class Periodo: IEmpty
{
	public DateTime DataInicial { get; set; }
	public DateTime DataFinal { get; set; }

	public bool IsEmpty()
	{
		return DataInicial == DateTime.MinValue &&
			DataFinal == DateTime.MinValue;
	}
}

Como usar essa maneira:

Periodo p = new Periodo();
if (p.IsEmpty())
{
	p.DataInicial = DateTime.Parse("23/07/2018");
}

Pode ser implementado as duas na mesma classe, sem problemas!

Para saber todos os valores iniciais é só colocar o tipo e logo apos o ponto já aparece o MinValue, exemplo:

int.MinValue
long.MinValue 
decimal.MinValue

e assim por diante!