繁体   English   中英

使用C#中的关键字来声明变量内联

[英]Use of is Keyword in C# to declare variable inline

我目前正在使用v4.6.2开发一个C#项目,Visual Studio刚刚建议对下面的代码进行代码更改。

我的问题是,我从未见过用于以这种方式创建新变量实例的is关键字。

原始代码是:

var authInfo = inputs.FirstOrDefault(i =>
    typeof(SoapAuthenticationBase).IsAssignableFrom(i.GetType()));

if (authInfo is SoapAuthenticationBase)

Visual Studio 2017建议:

if (inputs.FirstOrDefault(i =>
        typeof(SoapAuthBase).IsAssignableFrom(i.GetType())) 
        is SoapAuthBase authenticationContract)

我在'is'关键字上检查了Microsoft的文档,但没有发现任何解释这种语法的内容。

以这种方式添加了什么版本的C#?

此功能称为模式匹配 ,它是在版本7的c#语言中引入的。在您的示例中它不是很清楚,但请考虑以下Equals覆盖的规范示例:

public override bool Equals(obj other)
{
    if (obj is Foo)
    {
        return Equals((Foo)obj);
    }

    return false;
}

这实际上很浪费,因为你要检查两次类型:一次看看它实际上是否为Foo ,然后再执行强制转换。 这似乎不必要地冗长。

模式匹配允许更简洁的语法:

public override bool Equals(obj other)
{
    if (obj is Foo foo)
    {
        return Equals(foo);
    }

    return false;
}

您可以在此处详细了解此功能。

在您的第一个snipper中, is关键字检查左侧的东西是否是右侧类型的实例。 is返回一个布尔值,该FirstOrDefault调用返回null或实例SoapAuthenticationBase它被分配给您的变量。

正如@Ashley Medway指出的那样,第二个代码片段实际上是C#模式匹配的一个例子。 authenticationContractSoapAuthBase一个实例,如果左边的东西是它的一个实例,它只有一个值。 如果不是,整个语句将返回false。

也就是说,我个人觉得你的原始代码更具可读性。 我倾向于忽略VS,让编译器稍后对其进行排序。

虽然建议是创建一个新变量,但它的范围是if (即更窄)。

var authInfo = inputs.FirstOrDefault(i =>
    typeof(SoapAuthenticationBase).IsAssignableFrom(i.GetType()));
if (authInfo is SoapAuthenticationBase){
   // authInfo exists
}
// authInfo exists

它基本上建议你删除你声明的现有authInfo实例。

if (inputs.FirstOrDefault(i =>
        typeof(SoapAuthBase).IsAssignableFrom(i.GetType())) 
        is SoapAuthBase authenticationContract){
  // authenticationContract exists
}
// authenticationContract does not exist

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM