Como posso mostrar que um método nunca retornará null (projeto por contrato) em C #
-
20-08-2019 - |
Pergunta
Eu tenho um método que nunca retorna um objeto nulo. Quero deixar claro para que os usuários da minha API não tem que escrever código como este:
if(Getxyz() != null)
{
// do stuff
}
Como posso mostrar esta intenção?
Solução
Unforutnately não há nenhuma maneira integrada no C #
Você pode documentar este fato, mas isso não será automaticamente marcada.
Se você estiver usando o ReSharper, então ele pode ser configurado para verificar isso corretamente quando o método está marcado com um atributo [NotNull].
Caso contrário, você pode usar o Microsoft Contratos biblioteca e adicionar algo semelhante para o seguinte ao seu método, mas isso é um monte de palavreado extra para uma anotação tão simples.
Contract.Ensures(Contract.Result<string>() != null)
Spec # resolveu esse problema ao permitir que um! após o tipo de marcá-lo como um tipo não-nulo, por exemplo,
string! foo
mas Spec # só pode ser usado para direcionar .NET2, e foi usurpado pela biblioteca Contratos de código.
Outras dicas
A menos que você estiver usando um tipo baseado em System.ValueType, eu acho que você está fora de sorte. É provavelmente melhor para documentar isso claramente na XML / comentário metadados para a função.
Eu não sei que há uma melhor prática para fazê-lo a partir de uma API como eu ainda iria programar defensivamente e buscar por nulo como o consumidor. Eu acho que isso ainda é a melhor prática, neste caso, como eu tendem a não querer confiar em outro código de sempre fazer a coisa certa.
A única maneira marcada do tipo para garantir que um C # objeto nunca retorna nulo é usar um struct. Estruturas podem ter membros que contêm valores nulos, mas nunca pode ser nulo se.
Todas as outras C # objetos pode ser nulo.
código Exemplo:
public struct StructExample
{
public string Val;
}
public class MyClass
{
private StructExamle example;
public MyClass()
{
example = null; // will give you a 'Cannot convert to null error
}
public StructExample GetXyz()
{
return null; // also gives the same error
}
}
O exemplo acima não irá compilar. Se estiver usando uma struct é aceitável (torna-se um tipo de valor, se passou em torno na pilha, não pode ser uma subclasse), então este trabalho poder para você.
Eu gosto de pensar que o contrário: se a minha função pode retornar um valor nulo é melhor eu ter certeza de que o usuário da função sabe sobre ele.
Se os usuários têm seu código-fonte usando um design padrão pelo API contrato, como: http : //www.codeproject.com/KB/cs/designbycontract.aspx pode tornar as coisas claras.
Caso contrário, sua melhor aposta é através de documentação.
De qualquer documento-lo bem (talvez com .NET sistema de documentação standard) ou você tem que usar alguma API contrato. Aqui estão alguns: http://geekswithblogs.net/Podwysocki/archive/2008/01/ 22 / 118770.aspx http://www.codeproject.com/KB/cs/designbycontract.aspx
Você pode incluir um método Debug.Assert (). Enquanto isso certamente não vai impor a condição, ele deve deixar claro (junto com a documentação) que um valor nulo não é aceitável.
Document-lo e fornecer o código fonte.