功能更大的方法是否意味着较少的无效参考例外



在审查了杰森·罗伯茨(Jason Roberts)的多拉尔(Pluralsite)课程后,我试图将我们的某些代码库转换为更有功能的样式。

例如,如果我们有:

    var request = new RetrieveAttributeRequest
    {
        EntityLogicalName = EntityTypeDictionary.First(kvp => kvp.Key.Name == entityTypeName).Value,
        LogicalName = attributeName
    };
    var response = (RetrieveAttributeResponse) _organizationService.Execute(request);

我可以简单地将光标放在请求上,并使用CTRL ALT N RESHARARPER快捷方式,结果将是:

        var response = (RetrieveAttributeResponse) _organizationService.Execute(new RetrieveAttributeRequest
        {
            EntityLogicalName = EntityTypeDictionary.First(kvp => kvp.Key.Name == entityTypeName).Value,
            LogicalName = attributeName
        });

另一个示例:

我们以:

开始
    var request = new RetrieveAttributeRequest
    {
        EntityLogicalName = EntityTypeDictionary.First(kvp => kvp.Key.Name == entityTypeName).Value,
        LogicalName = attributeName
    };
    var response = (RetrieveAttributeResponse) _organizationService.Execute(request);
    var attribute = response.AttributeMetadata;
    var type = attribute.AttributeType;
    var logicalName = attribute.LogicalName;

替换所有内联替换所有内容:

    var logicalName = ((RetrieveAttributeResponse) _organizationService.Execute(new RetrieveAttributeRequest
    {
        EntityLogicalName = EntityTypeDictionary.First(kvp => kvp.Key.Name == entityTypeName).Value,
        LogicalName = attributeName
    })).AttributeMetadata.LogicalName;

问题

用它们的内联等效替换变量是否会增加代码安全性并减少零参考指针异常?

您没有检查零指针。如果您的代码类似:

var response = (RetrieveAttributeResponse) _organizationService.Execute(request);
if(response==null) throw ArgumentNullException();
var attribute = response.AttributeMetadata;

然后,Resharper将不会提供相同的Sugention。我认为一种更加流畅的方法是将您的无效处理以与您的期望保持一致。例如,扩展方法。

var response = _someObject.FluidComposition(...).ExceptionIfNUll().ExecuteSomething();

var response = _someObject.FluidComposition(...).EmptyIfNUll().ExecuteSomething();

您可以清楚地看到上面的预期行为,但是,它仅定义了操作的期望,而不是您将拥有的null指针异常的数量。

no。您给出的示例在功能上等效,样式更改的目的是提高可读性。

这是对象初始化器也已添加到语言语法中的相同原因。例如

var myClass = new MyClass()
myClass.Value1 = someValue1;
myClass.Value2 = someValue2;

vs。

var myClass = new MyClass()
{
    Value1 = someValue1,
    Value2 = someValue2
};

它在功能上是等效的,但是快速阅读更容易。

编写代码时,您的编写语言不仅供计算机阅读和解释,而且还供其他开发人员阅读。

在您的最后一个示例中,如果您想进行无效处理,则会执行类似的操作:

var logicalName = ((RetrieveAttributeResponse) _organizationService.Execute(new RetrieveAttributeRequest
{
    EntityLogicalName = EntityTypeDictionary.FirstOrDefault(kvp => kvp.Key.Name == entityTypeName)?.Value,
    LogicalName = attributeName
}))?.AttributeMetadata?.LogicalName;
if (logicalName == null)
    throw new Exception("Something broke.");

最新更新