c#の「[必須] "属性は、JSONなどのデータ脱選成の場合にプロパティを提供する必要があることを確認するために使用されます。ただし、Nullableタイプと組み合わせると、Nullableタイプがnullになる可能性があるため、直感に反するように見えます。この組み合わせは、ポスト以降の攻撃から保護するためによく使用されます。この攻撃は、悪意のあるユーザーがリクエストでプロパティを省略する可能性があり、モデルバインダーがエラーを上げる代わりにデフォルト値を割り当てます[4]。
MVVMCrossのコンテキストでは、モデル-View-ViewModel(MVVM)パターンを使用してクロスプラットフォームアプリケーションを構築するためのフレームワークであるため、「[必須]属性とヌル可能なタイプの相互作用が直接対処されません。 MVVMCrossは、主にビューとビューモデル間のデータバインディングとナビゲーションに焦点を当てています。ただし、C#でNullableタイプがどのように機能するかを理解することで、開発者がMVVMCrossアプリケーション内でデータの一貫性と検証を管理するのに役立ちます。
###ヌル可能なタイプの理解
C#8.0はヌル可能な参照タイプを導入し、開発者が参照タイプをnullにできるかどうかを明示的に示すことができます。この機能は、ヌル値が適切に処理されないときにコンパイル時に警告を提供することにより、ヌル参照の例外を防ぐのに役立ちます[7]。 「[必須]」属性を使用してヌル可能なタイプを使用する場合、属性は値が明示的に提供されることを保証しますが、Nullableタイプにより、NULLが特定のシナリオで有効な入力である可能性が可能になります[4]。
nullableタイプで[必須]を使用します
プロパティが提供されることを強制する必要があるシナリオでは、null(たとえば、プロパティが明示的にnullに設定される可能性のあるJSONペイロードを処理する)を許可します。ただし、このアプローチは、主にMVVMCross内で直接ではなく、Web APIまたは同様のコンテキストでのデータ検証に適用されます。
MVVMCrossアプリケーションの場合、ビューモデル内でプロパティが適切に初期化および検証されていることを確認することが重要です。 MVVMCrossは「[必須]」属性と一意の方法で直接相互作用しませんが、開発者はC#のヌル可能な参照タイプと検証属性を活用して、アプリケーション全体でデータの整合性を管理できます。
MVVMCrossのカスタム検証
MVVMCrossアプリケーション内で特定の検証ルールを実施する必要がある場合は、ビューモデル内にカスタム検証ロジックを実装することを検討する場合があります。これには、ヌル値をチェックしたり、ビジネスロジックを進める前に特定のプロパティが入力されるようにすることが含まれます。 MVVMCrossは、そのような検証を実装するために使用できるカスタムデータのバインディングと相互作用処理のメカニズムを提供します[5]。
要約すると、「[必須]」属性とヌル可能なタイプは主にWeb APIなどのデータ検証コンテキストで使用されますが、それらの相互作用を理解することで、MVVMCross開発者はアプリケーション内のデータの一貫性と検証を管理するのに役立ちます。ただし、MVVMCross自体には、Webフレームワークがそうであるように「[必須]」属性に対する特定の組み込みサポートはありません。
引用:[1] https://stackoverflow.com/questions/47074979/mvvmcross-view-model-mvxinteraction-is-always-null
[2] https://dev.to/theramoliya/c-required-attribute-for-nonnullable-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-ymean-for-a-property to-be-requeard and-nullable
[5] https://www.mvvmcross.com/documentation/advanced/custom-dataバインディング
[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/