次の方法で共有


構成バインダーによって空のキーがディクショナリに追加される

以前のバージョンでは、構成がディクショナリ型にバインドされていた場合、構成に対応する値がないキーはスキップされ、ディクショナリに追加されませんでした。 この動作が変更され、このようなキーがスキップされなくなり、既定値で自動的に作成されるようになりました。 この変更により、構成に一覧表示されたすべてのキーが、確実にディクショナリ内に存在するようになります。

導入されたバージョン

.NET 8 Preview 5

以前の動作

以前は、構成内の空のキーは、ディクショナリ型にバインドする際にスキップされていました。 次の構成文字列とバインディング コードについて考えてみましょう。

var json = @"{
    ""Queues"": {
        ""q1"": {
            ""V"": 1
        },
        ""q2"": {
            ""V"": 2
        },
        ""q3"": {
        }
    }
}";
public class Q
{
    public Dictionary<string, QueueValue> Queues { get; set; } = new();
}

public class QueueValue
{
    public int V { get; set; }
}

var configuration = new ConfigurationBuilder()
    .AddJsonStream(StringToStream(json))
    .Build();

Q options = new Q();
configuration.Bind(options);
foreach (var kvp in options.Queues)
{
    Console.WriteLine($"{kvp.Key}: {kvp.Value.V}");
}

以前は、次の出力が表示されていました (キー q3 が存在しないことに注目してください)。

q1: 1
q2: 2

新しい動作

.NET 8 以降では、空の構成キーは、構成のバインド中に既定値でディクショナリに追加されます。

以前の動作」セクションのコードで考えると、次のテキストが出力され、q3 が既定値でディクショナリに追加されたことが示されています。

q1: 1
q2: 2
q3: 0

破壊的変更の種類

この変更は、動作変更です。

変更理由

ユーザーからの要求に基づくこの変更により、構成に一覧表示されたすべてのキーが、確実にディクショナリ内に存在するようになります。 すべてのキーが存在することで、プロセスが合理化され、キーがないことによる潜在的な問題を回避できます。

値が空の状態で新しく作成されるディクショナリ エントリの存在に対応できるように、アプリケーション ロジックを確認して調整します。 この新しい動作が望ましくない場合は、値が空のエントリを構成から削除します。 これらのエントリを削除すると、値が空のディクショナリ エントリはバインド プロセス中に追加されません。

影響を受ける API