Existe um atributo simples ou contrato de dados que posso atribuir a um parâmetro de função que evita que null
seja passado em C # / .net? Idealmente, isso também verificaria em tempo de compilação para ter certeza de que o literal null
não está sendo usado em qualquer lugar para ele e em tempo de execução ArgumentNullException
.
Atualmente escrevo algo como ...
if (null == arg)
throw new ArgumentNullException("arg");
... para cada argumento que espero não ser null
.
Na mesma nota, existe um oposto Nullable<>
pelo qual o seguinte falharia:
NonNullable<string> s = null; // throw some kind of exception
c#
.net
parameters
null
Neil C. Obremski
fonte
fonte
Respostas:
Não há nada disponível em tempo de compilação, infelizmente.
Eu tenho uma solução um pouco hacky que postei no meu blog recentemente, que usa uma nova estrutura e conversões.
No .NET 4.0 com as coisas de Code Contracts , a vida será muito mais agradável. Ainda seria muito bom ter a sintaxe de linguagem real e suporte em torno da não nulidade, mas os contratos de código ajudarão muito.
Também tenho um método de extensão em MiscUtil chamado ThrowIfNull que o torna um pouco mais simples.
Um último ponto - alguma razão para usar "
if (null == arg)
" em vez de "if (arg == null)
"? Acho o último mais fácil de ler, e o problema que o primeiro resolve em C não se aplica a C #.fonte
if (null == x)
seja devido a diferenças naturais de linguagem. Eu acredito que é realmente sobre um estilo obsoleto que apenas se propaga por meio de exemplos etc.Sei que estou incrivelmente atrasado para essa pergunta, mas sinto que a resposta se tornará relevante conforme a última grande iteração do C # se aproxima do lançamento e, em seguida, é lançada. No C # 8.0, uma grande mudança ocorrerá, o C # assumirá que todos os tipos são considerados não nulos.
De acordo com Mads Torgersen:
Portanto, a resolução delineada por Mads é:
Um exemplo do recurso desejado:
A visualização está disponível para Visual Studio 2017, visualização 15.5.4+.
fonte
Eu sei que esta é uma pergunta MUITO antiga, mas esta estava faltando aqui:
Se você usar ReSharper / Rider, poderá usar a Estrutura Anotada .
Edit : Acabei de receber um -1 aleatório para esta resposta. Isso é bom. Esteja ciente de que ainda é válido, embora não seja mais a abordagem recomendada para projetos C # 8.0 + (para entender o porquê, consulte a resposta de Greg ).
fonte
Confira os validadores na biblioteca corporativa. Você pode fazer algo como:
Então, em seu código, quando quiser validá-lo:
fonte
não o mais bonito, mas:
você também pode ser mais criativo no método ContainsNullParameters:
claro que você pode usar um interceptor ou reflexão, mas estes são fáceis de seguir / usar com pouca sobrecarga
fonte
return (from o in methodParams where o == null).Count() > 0;
Use:return methodParams.Any(o=>o==null);
será muito mais rápido em grandes coleçõesOk, esta resposta está um pouco atrasada, mas aqui está como estou resolvendo:
Use este método de extensão para tratar strings nulas e vazias como a mesma coisa.
Por exemplo
Não é o ideal, eu sei que você deve se lembrar de chamar o padrão em todos os lugares, mas é uma solução.
fonte
string.IsNotNullOrEmpty
realmente diferente do açúcar de ter o que é importante para você à esquerda. Pode ser alimentado em outras funções (comprimento, concatenação) etc. Marginalmente melhor.Default()
) em um null (model.Day
). Eu sei que os métodos de extensão não são verificados em relação ao nulo, mas meus olhos não estão cientes e eles já imaginaram o?
no código:model?.Day?.Default()
:)