O atributo `[exigido]` em C# é usado para garantir que uma propriedade seja fornecida ao desserializar dados, como do JSON. No entanto, quando combinado com tipos anuláveis, pode parecer contra -intuitivo porque os tipos anuláveis podem ser nulos. Essa combinação é frequentemente usada para proteger contra ataques subestimados, onde um usuário malicioso pode omitir uma propriedade em uma solicitação, fazendo com que o fichário do modelo atribua um valor padrão em vez de levantar um erro [4].
No contexto do MVVMcross, que é uma estrutura para a criação de aplicativos de plataforma cruzada usando o padrão Model-View-ViewModel (MVVM), a interação entre o atributo `[necessária]` e tipos anuláveis não é diretamente abordada. O MVVMcross se concentra principalmente na ligação e navegação de dados entre visualizações e modelos de visualização. No entanto, entender como os tipos anuláveis funcionam em C# pode ajudar os desenvolvedores a gerenciar a consistência e a validação dos dados em seus aplicativos MVVMCROSS.
Entendendo tipos Nulláveis
C# 8.0 Introduziu tipos de referência anuláveis, permitindo que os desenvolvedores indiquem explicitamente se um tipo de referência pode ser nulo. Esse recurso ajuda a evitar exceções de referência nula, fornecendo avisos em tempo de compilação quando os valores nulos não são tratados corretamente [7]. Ao usar tipos anuláveis com o atributo `[Necessário]`, o atributo garante que um valor seja explicitamente fornecido, enquanto o tipo anulado permite a possibilidade de o NULL ser uma entrada válida em determinados cenários [4].
usando [obrigatório] com tipos anuláveis
Em cenários em que você precisa aplicar que uma propriedade é fornecida, mas também permita que ela seja nula (por exemplo, para lidar com cargas úteis JSON, onde uma propriedade pode ser explicitamente definida como nula), o uso do `[necessário]` atributo com tipos anuláveis pode ser benéfico. No entanto, essa abordagem se aplica principalmente à validação de dados em APIs da Web ou contextos similares, em vez de diretamente no MVVMCROSS.
Para aplicações MVVMCROSS, garantir que as propriedades sejam adequadamente inicializadas e validadas nos modelos de exibição. Embora o MVVMCROSS não interaja diretamente com o atributo `[Necessário]` de uma maneira única, os desenvolvedores podem aproveitar os tipos de referência Nullable de C#e os atributos de validação para gerenciar a integridade dos dados em seu aplicativo.
Validação personalizada em mvvmcross
Se você precisar aplicar regras de validação específicas em um aplicativo MVVMCROSS, considere implementar a lógica de validação personalizada em seus modelos de visualização. Isso pode envolver a verificação de valores nulos ou garantir que certas propriedades sejam preenchidas antes de prosseguir com a lógica de negócios. O MVVMCROSS fornece mecanismos para ligação de dados personalizados e manuseio de interação, que podem ser usados para implementar essa validação [5].
Em resumo, enquanto o atributo `[exigido]` e tipos anuláveis são usados principalmente em contextos de validação de dados, como APIs da Web, a compreensão de sua interação pode ajudar os desenvolvedores do MVVMCROSS a gerenciar a consistência e a validação de dados em seus aplicativos. No entanto, o próprio MVVMcross não possui suporte interno específico para o atributo `[Necessário]` da maneira que a Web Frameworks pode.
Citações:[1] https://stackoverflow.com/questions/47074979/mvvmcross-view-model-mvxinteraction-is-always-null
[2] https://dev.to/theramoliya/c-required-attribute-for-nullable-reference-types-44hb
[3] https://www.reddit.com/r/csharp/comments/10wayn5/required_attribute_and_null_help/
[4] https://stackoverflow.com/questions/43688968/what-does-it-mean-for-a-property-to-be-required-and-nullable
[5] https://www.mvvmcross.com/documentation/advanced/custom-data-binding
[6] https://learn.microsoft.com/en-us/dotnet/csharp/nullable-references
[7] https://devblogs.microsoft.com/dotnet/embranco-nullable-reference-types/
[8] https://www.reddit.com/r/blazor/comments/14x5krd/nullable_types_and_required_keyword_how_is/