Como posso mostrar que um método nunca retornará null (projeto por contrato) em C #

StackOverflow https://stackoverflow.com/questions/484571

  •  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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top