L'attributo `[richiesto]` in C# viene utilizzato per garantire che una proprietà debba essere fornita durante la deserializzazione dei dati, ad esempio da JSON. Tuttavia, se combinato con tipi Nullable, può sembrare controintuitivo perché i tipi nulli possono essere nulli. Questa combinazione viene spesso utilizzata per proteggere dagli attacchi sotto il posting, in cui un utente dannoso potrebbe omettere una proprietà in una richiesta, causando l'assegnazione del valore del legante del modello invece di raccogliere un errore [4].
Nel contesto di MVVMCROSS, che è un framework per la creazione di applicazioni multipiattaforma utilizzando il modello Model-View-ViewModel (MVVM), l'interazione tra l'attributo `[richiesto]` e i tipi Nulllable non è indirizzata direttamente. MVVMCRoss si concentra principalmente sul legame e la navigazione dei dati tra le viste e i modelli di visualizzazione. Tuttavia, comprendere come funzionano i tipi nulli in C# può aiutare gli sviluppatori a gestire la coerenza e la convalida dei dati all'interno delle loro applicazioni MVVMCRoss.
comprensione dei tipi NULLABLE
C# 8.0 ha introdotto i tipi di riferimento nulli, consentendo agli sviluppatori di indicare esplicitamente se un tipo di riferimento può essere nullo. Questa funzione aiuta a prevenire le eccezioni di riferimento nulle fornendo avvertimenti al tempo di compilazione quando i valori nulli non vengono gestiti correttamente [7]. Quando si utilizzano tipi Nullable con l'attributo `[richiesto]`, l'attributo garantisce che un valore venga fornito esplicitamente, mentre il tipo Nulllable consente la possibilità che Null sia un input valido in determinati scenari [4].
usando [richiesto] con tipi NULLABLE
Negli scenari in cui è necessario applicare che una proprietà viene fornita ma consente anche di essere nulla (ad esempio, per gestire i payload JSON in cui una proprietà potrebbe essere esplicitamente impostata su NULL), utilizzando l'attributo "[richiesto] con i tipi Nulllable può essere utile. Tuttavia, questo approccio si applica principalmente alla convalida dei dati nelle API Web o ai contesti simili anziché direttamente all'interno di MVVMCRoss.
Per le applicazioni MVVMCRoss, è cruciale garantire che le proprietà siano correttamente inizializzate e validate nei modelli di visualizzazione. Mentre MVVMCRoss non interagisce direttamente con l'attributo `[richiesto]` in un modo unico, gli sviluppatori possono sfruttare i tipi di riferimento Nulllable di C#e gli attributi di convalida per gestire l'integrità dei dati attraverso la loro applicazione.
Convalida personalizzata in mvvmcross
Se è necessario applicare regole di convalida specifiche all'interno di un'applicazione MVVMCRoss, è possibile prendere in considerazione l'implementazione della logica di convalida personalizzata all'interno dei modelli di visualizzazione. Ciò potrebbe comportare il verifica dei valori nulli o garantire che alcune proprietà siano popolate prima di procedere con la logica aziendale. MVVMCROSS fornisce meccanismi per l'associazione dei dati personalizzati e la gestione delle interazioni, che possono essere utilizzate per implementare tale convalida [5].
In sintesi, mentre gli attributi `[richiesti]` e i tipi Nullable sono utilizzati principalmente in contesti di convalida dei dati come le API Web, la comprensione della loro interazione può aiutare gli sviluppatori MVVMCRoss a gestire la coerenza e la convalida dei dati all'interno delle loro applicazioni. Tuttavia, lo stesso MVVMCRoss non ha un supporto integrato specifico per l'attributo `[richiesto]` nel modo in cui potrebbero essere i quadri Web.
Citazioni:[1] https://stackoverflow.com/questions/47074979/mvvmcross-view-model-mvxinteraction-is-always-null
[2] https://dev.to/theramoliya/c-required-attribute-for-non-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-nulllable
[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/embracing-nullable-reference-types/
[8] https://www.reddit.com/r/blazor/comments/14x5krd/nullable_types_and_required_keyword_how_is/