IntroducaoQuando escrevemos codigo reaproveitavel, criamos funcoes e/ou classes que recebem parametros. Na maioria das vezes esses parametros sao fundamentais na implementacao da logica dentro de uma classe ou metodo, e o programador mais experiente ira, de forma defensiva, verificar se um determinado parametro recebido e valido antes de prosseguir com a logica, e caso contrario, informar ao cliente (que esta consumido o codigo) do erro cometido com a excecao correta.Exemplo ficticioVamos supor que temos uma classe chamada Formulario. Essa classe, quando instanciada, recebe em seu construtor uma instancia de outra classe chamada Registro, que representa um registro no banco de dados, veja o codigo abaixo:Note que o formulario recebe um registro, e quando o usuario clicar no botao Gravar, o registro por si mesmo ira ser persistido no banco de dados. Para consumir esse codigo, basta fazer a seguinte chamada:Ate ai tudo bem, mas a linguagem permite que facamos o seguinte codigo, sem erros de compilacao: O erro so sera visto em tempo de execucao, pois quando o usuario clicar em Gravar, o valor de "registro" e nulo e consequentemente o .NET ira lancar uma excecao nao tratada e a aplicacao provavelmente ira parar de funcionar.Adicionando ArgumentNullExceptionE uma boa pratica verificar se um parametro e nulo antes de sair consumindo o valor passado por referencia.Desta maneira, destacamos a importancia do valor do parametro na classe, e que sem um valor valido, lancaremos uma exception informando o nome do argumento invalido. Vale ressaltar que classe ArgumentNullException recebe uma string que representa o nome do argumento que estamos tratando e esse valor deve ser passado de forma correta. Assim, se o cliente que estiver consumindo esse codigo tratar a excessao dentro de um bloco Try/Catch, ele tera essa informacao de forma precisa.Evitando codigo tediosoImagine agora um metodo e que contenha 4 parametros, todos eles obrigatorios. Teriamos o trabalho tedioso de escrever 4 vezes a mesma expressao, alem do trabalho de digitar na mao o nome dos argumentos ao lancar a exception.Para automatizar essa tarefa, criei uma classe chamada Requires, contendo um metodo chamado That, para utilizar da seguinte maneira:O metodo That recebe uma Lambda Expression que representa uma funcao que retorna verdadeiro ou falso. Desejamos que o parametro "registro" nao seja nulo. Caso o valor seja nulo, o metodo lanca automaticamente para nos um ArgumentNullException com o nome do parametro corretamente, sem nos preocuparmos em digitar isso na mao, facilitando a nossa vida.A classe requires ficou conforme o codigo abaixo:Outro exemplo com Extension MethodExtension Methods recebem pelo menos um parametro (this), e devemos verificar se possuem valores. E muito facil passar valores nulos para ExtensionMethods, basta fazer um Cast implicito.No exemplo abaixo, possuimos uma classe Cliente que implementa a interface IEntidade.Como no caso anterior, podemos facilmente escrever um programa que consome essas classes chamando o extension method criado: No ExtensionMethod "AlteraEstado", nao verificamos se passamos um valor nulo (entidade). Se escrevermos o seguinte codigo, a aplicacao compilara normalmente, e so veremos o problema em tempo de execucao, pois o cast que foi feito retornara nulo: O Extension Method AlteraEstado deve ser modificado para ficar