【问题标题】:Is this sharper than the Resharper Robots?这比 Resharper 机器人更锋利吗?
【发布时间】:2015-03-07 05:14:02
【问题描述】:

Resharper 更改了(当然,在我的同意下):

private static Subdepartment GetSubdepartmentForXMLElement(XElement subdept)
{
    return new Subdepartment
    {
        Id = Convert.ToInt32(subdept.Element("Id")),
        AccountId = Convert.ToDouble(subdept.Element("AccountId ")),
        Name = subdept.Element("Name")
    };
}

...进入这个:

private static Subdepartment GetSubdepartmentForXMLElement(XElement subdept)
{
    var xElement = subdept.Element("Id");
    if (xElement != null)
    {
        var element = subdept.Element("AccountId");
        if (element != null)
        {
            var el = subdept.Element("Name");
            if (el != null)
            {
                return new Subdepartment
                           {
                               Id = Convert.ToInt32(xElement.Value),
                               AccountId = Convert.ToDouble(element.Value),
                               Name = el.Value
                           };
            }
        }
    }
}

...我必须添加:

return null;

...在倒数第二个花括号之后,允许它编译。

我喜欢 R#,但在我看来,上面的代码比一袋烟头丑 9 倍;这不是更好的锐化:

private static Subdepartment GetSubdepartmentForXMLElement(XElement subdept)
{
    var IdElement = subdept.Element("Id");
    var AccountIdElement = subdept.Element("AccountId");
    var NameElement = subdept.Element("Name");
    if ((IdElement != null) && (AccountIdElement != null) && (NameElement != null))
    {
        return new Subdepartment
        {
            Id = Convert.ToInt32(IdElement.Value),
            AccountId = Convert.ToDouble(AccountIdElement.Value),
            Name = NameElement.Value
        };
    }
    return null;
}

?

更新

出于某种原因,我实际上更喜欢这种“风格”:

var IdElement = itemGroup.Element("Id");
var item_group_idElement = itemGroup.Element("item_group_id");
var nameElement = itemGroup.Element("name");
if ((null == IdElement) || (null == item_group_idElement) || (null == nameElement)) return null;
return new ItemGroup
{
    Id = Convert.ToInt32(itemGroup.Element("Id").Value),
    item_group_id = itemGroup.Element("item_group_id").Value,
    name = itemGroup.Element("name").Value
};

【问题讨论】:

  • subdept 为空时会发生什么? NullReferenceException
  • 那么我想知道,为什么超级挑剔的 R# 没有考虑到这一点?或者也许超级谨慎(不是坏事),我应该问。
  • 谁知道,应该。您的机器或解决方案/项目似乎有自定义设置。它也应该抱怨你的本地方法变量的名称(应该是camelCase,而不是PascalCase)。

标签: c# resharper null-check


【解决方案1】:

这个:

private static Subdepartment GetSubdepartmentForXMLElement(XElement subdept)
{
    return new Subdepartment
    {
        Id = Convert.ToInt32(xElement.Value),
        AccountId = Convert.ToDouble(element.Value),
        Name = el.Value
    };
}

... 甚至无法编译。未声明 xElementelementel

但是,resharper 不应该抱怨这个:

private static Subdepartment GetSubdepartmentForXmlElement(XElement subdept)
{
    if (subdept == null) throw new ArgumentNullException("subdept");

    var idElement = subdept.Element("Id");
    var accountIdElement = subdept.Element("AccountId");
    var nameElement = subdept.Element("Name");

    if (idElement != null && accountIdElement != null && nameElement != null)
    {
        return new Subdepartment
        {
            Id = Convert.ToInt32(idElement.Value),
            AccountId = Convert.ToDouble(accountIdElement.Value),
            Name = nameElement.Value
        };
    }
    return null;
}

Resharper 代码更正一次仅适用于一个问题,这就是您最终在 OP 中遇到嵌套混乱的原因。如果您从一开始就仔细编写代码,那么您将需要做的这些单一问题修复更少。

我个人更喜欢减少嵌套,并且希望这样更好一点:

private static Subdepartment GetSubdepartmentForXmlElement(XElement subdept)
{
    if (subdept == null) throw new ArgumentNullException("subdept");

    var idElement = subdept.Element("Id");
    var accountIdElement = subdept.Element("AccountId");
    var nameElement = subdept.Element("Name");

    if (idElement == null || accountIdElement == null || nameElement == null)
        return null;

    return new Subdepartment
    {
        Id = Convert.ToInt32(idElement.Value),
        AccountId = Convert.ToDouble(accountIdElement.Value),
        Name = nameElement.Value
    };
}

ReSharper 也不会对此抱怨。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多