【问题标题】:possible null assignment in Dictionary Contains Key字典中可能的空分配包含键
【发布时间】:2013-01-18 16:55:56
【问题描述】:

收到关于“!redirectsDictionary.ContainsKey(autoRedirect.Key)”的警告

asp.net 可能对标有“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);
                }
            }
        }

【问题讨论】:

  • 您在哪一行收到警告?警告并不总是意味着存在问题
  • 在这一行 !redirectsDictionary.ContainsKey(autoRedirect.Key) 在 autoRedirect.Key 下有一个警告

标签: c# asp.net resharper


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-02-12
    • 2017-04-16
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    相关资源
    最近更新 更多