О доступе к значению словаря - PullRequest
0 голосов
/ 04 января 2012

Это вопрос нуб, я знаю, но я не нашел ответа в интернете ...

Я получил следующий словарь:

private static Dictionary<Qb.Solution.QbDataStore.DataStoreType, string> DataStoreType2IconPath = new Dictionary<QbDataStore.DataStoreType, string>()
{
    { Qb.Solution.QbDataStore.DataStoreType.CommonData, "Common" },
    { Qb.Solution.QbDataStore.DataStoreType.ApplicationData, "Application" },
    { Qb.Solution.QbDataStore.DataStoreType.FrameData, "Frame" }
};

и затем у меня естьметод с параметром Qb.Solution.QbDataStore.DataStoreType dataType, и я получил это:

if (dataType != null)
{
    collection.IconPath = DataStoreType2IconPath[dataType];
}

Мой вопрос:

Если я удалю тест if, и что я не знаю, как (теоретически невозможно) dataType имеет значение null:

  1. collection.IconPath имеет значение null?
  2. это исключение?

Ответы [ 4 ]

3 голосов
/ 04 января 2012

Будет выброшено исключение, поэтому вы лучше справитесь с тестом if.

Вы также можете сделать это с TryGetValue: http://msdn.microsoft.com/fr-fr/library/bb347013.aspx

2 голосов
/ 04 января 2012

Согласно моему быстрому тесту, добавление нулевого ключа в словарь приводит к ArgumentNullException, а попытка получить несуществующий ключ приводит к KeyNotFoundException.

namespace ConsoleApplication46
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var d = new Dictionary<string, int>();

            d.Add(null, 1);

            Console.WriteLine(d["adam"]);
            Console.Read();
        }
    }
}

Что касается обзора кода, как его лучше написать, попробуйте https://codereview.stackexchange.com/

Альтернативные методы включают TryGetValue и ContainsKey.

2 голосов
/ 04 января 2012

Если вы пытаетесь получить запись из словаря, которого нет, выдается KeyNotFoundException, см. Документацию MSDN . Если это нежелательное поведение, используйте метод TryGetValue .

1 голос
/ 04 января 2012

Как уже упоминалось, вы не можете добавить нулевой ключ в словарь - http://msdn.microsoft.com/en-us/library/k7z0zy8k.aspx

Возможно, вы захотите проверить, существует ли ключ, используя метод ContainsKey (), а не использовать TryGetValue или перехват исключения. (Вам все равно понадобится оператор if с TryGetValue, и лучше не программировать с использованием исключений для логики, если вы можете помочь.)

if (DataStoreType2IconPath.ContainsKey(dataType))
{
    collection.IconPath = DataStoreType2IconPath[dataType];
}

Если вы действительно хотите избежать оператора if, вы можете использовать условный оператор:

collection.IconPath = DataStoreType2IconPath.ContainsKey(dataType) ?
                        DataStoreType2IconPath[dataType] : null;

Лично я предпочитаю этот стиль выражения "выражения", а не утверждения, но это только я. : -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...