Dictionary包含Key中可能的空赋值

时间:2013-01-18 16:55:56

标签: c# asp.net resharper

在“!redirectsDictionary.ContainsKey(autoRedirect.Key)”上收到警告

asp.net可能将null赋值给标有“notnull”属性的实体。

只是想知道那是什么意思?

private static readonly Dictionary<string, Redirect> AutoRedirectsDictionary = new Dictionary<string, Redirect>();

foreach (var r in db.SelectItems("fast:/sitecore/content/Redirects Root//*[@@templatename='Auto Redirect']"))
        {
            GenerateRedirects(Context.Database.GetItem(r.Fields["Root Node"].Value), r["URL Prefix"]);
            foreach (var autoRedirect in AutoRedirectsDictionary)
            {
                if (!string.IsNullOrEmpty(autoRedirect.Key) & !redirectsDictionary.ContainsKey(autoRedirect.Key))
                {
                    //Add to dictionary
                    redirectsDictionary.Add(autoRedirect.Key, autoRedirect.Value);
                }

            }
        }

public static void GenerateRedirects(Item redirectFolder, string urlPrefix)
        {
            if (redirectFolder == null)
                return;

            var childList = redirectFolder.GetChildren();

            foreach (Item child in childList)
            {
                if (Utilities.HasFieldValue(child, FieldToFind))
                {
                    var shortcutUrl = urlPrefix + child.Fields[FieldToFind].Value.ToLower();

                    if (!string.IsNullOrEmpty(shortcutUrl) && !AutoRedirectsDictionary.ContainsKey(shortcutUrl))
                    {
                        AutoRedirectsDictionary.Add(shortcutUrl,
                        new Redirect(String.Empty, child, true));       
                    }
                }
                else
                {
                    GenerateRedirects(child, urlPrefix);
                }
            }
        }

1 个答案:

答案 0 :(得分:3)

这可能与您使用单个&运算符有关。单个&不会使用短路来绕过语句,而是选择在评估完所有表达式后执行的路径。因此,即使您在ContainsKey调用之前检查!string.IsNullOrEmpty(autoRedirect.Key),也将首先评估两个表达式,然后确定执行路径。

编辑,因为我意识到我没有真正回答你的具体问题(你可能已经知道了)但是如果键为空,!redirectsDictionary.ContainsKey(autoRedirect.Key)将抛出异常。由于密钥的数据类型是string,如果它是null,它有可能抛出异常,因此警告。