A Microsoft disponibilizou Nullable Reference Types para desenvolvedores que desejam experimentar o novo recurso e fornecer feedback.
O Nullable Reference Type vem como uma extensão do Roslyn para o Visual Studio 2017 15.5 Preview 4+. Os projetos de frameworks .NET agora o suportam, já para o .NET core irão suportar em breve. A funcionalidade é habilitada por padrão na última versão C# 8. A Microsoft disponibilizou as instruções de instalação.
A nova função Nullable Reference Type que faz parte do C# 8 é para resolver os Erros de Bilhões de Dólares que Tony Hoare, um cientista da computação britânico, chamou de null reference que ele inventou em 1965 enquanto trabalhava no ALGOL. O principal problema de ponteiros é que as vezes eles estão nulos e isso nunca é esperado. Embora seja apresentado como um recurso, o ponteiro nulo provou ser uma fonte importante de erros ao longo dos anos.
"Adicionar tipos de referência não nulos em C#" foi sugerido inicialmente no Visual Studio / User Voice em 2011, e atingiu a posição #15 na fila de features um ano depois pelos votos dos usuários. Agora está na posição #1 das funcionalidades escolhidas no User Voice. Uma das razões para essa funcionalidade demorar tanto para ser desenvolvida é que o C# utiliza as referências nulas em toda parte. Como Mads Togersen, designer-chefe do C#, explica:
O problema é que a refência para nulos é muito útil. Em C#, é o valor padrão para todos os tipos de referências. O que mais poderia ser o valor padrão? Qual outro valor teria uma variável, até que possa decidir o que mais atribuir a ela? Qual outro valor podemos pavimentar uma matriz de referências recentemente alocada, até conseguir preenchê-la?
Além disso, às vezes nulo é um valor sensível por si só. Às vezes queremos representar o fato de que, digamos, um campo não tem um valor. Que é ok passar "nada" como parâmetro. No entanto, a ênfase está na quantidade de vezes. E aqui está outra parte do problema: Linguagens como C# não permitem que expresse se um nulo aqui é uma boa ideia ou não.
Em vez de introduzir tipos de referência não nulas em C#, a Microsoft optou por considerar os tipos de referência como não nulos por padrão e fornecer mecanismos para lidar com tipos nulos. Eles consideraram que é mais frequente o desejo de que uma referência seja não nula e por fim perca a referência. Torgersen escreveu:
- Acreditamos que é mais comum que uma referência seja não nula. Tipos de referência nulas seriam mais raras (embora não tenhamos bons dados para nos dizer quanto), então eles são os que devem exigir uma nova anotação;
- A linguagem já tem um conceito para - e uma sintaxe para - tipos que podem ser nulos. A analogia entre os dois tornaria a adição do idioma conceitualmente mais fácil e linguisticamente mais simples;
- Parece certo que não deve se sobrecarregar ou o seu consumidor com valores nulos incômodos, a menos que sejam necessários. Os nulos, e não a ausência deles, devem ser o que se tem que optar explicitamente.
Um tipo de referência nulo pode ser definido como? Veja no exemplo a seguir:
class Person {
public string FirstName; // Not null
public string? MiddleName; // May be null
public string LastName; // Not null
}
A Microsoft está pedindo aos desenvolvedores para experimentarem essa nova funcionalidade e deixar um feedback de como foi sua experiência.
Para mais informações sobre o assunto: C# Futures: Nullable Reference Types, C# 8.0 Previewed e A Proposal for Non-Nullable Types in C#.