空检查 C#的声纳问题

问题描述 投票:0回答:2

在我的项目中启用 Sonar 后,我收到以下消息

myEntities 在至少一个执行路径上为空。

public static IEnumerable<KeyValuePair<MyDto,long>> PrepareClientResponses(this IEnumerable<MyServiceCnt> myEntities)
{
    if (myEntities == null || !myEntities.Any())
    {
        yield return default;
    }         
    foreach (var myEntities in myEntities)
    {
        var client = myEntities.PrepareClientResponse();
        yield return new KeyValuePair<MyDto, long>(client, myEntities.MyId.Value);
    }
}

消息在

foreach (var myEntities in myEntities)
行的“myEntities”上。

有人可以建议我如何解决此消息。我正在检查 null 条件,但它仍然发出此警告。

c# asp.net-core sonarqube microservices visual-studio-2022
2个回答
3
投票

yield return default;

yield return
大致意思是“返回一个值并在请求下一个值后继续”。

因此,即使从未达到

yield return
,循环也会执行。

要解决此问题,您有多种选择。

yield break

而不是

yield return
中的
if
,您可以使用
yield break
来终止方法,如解释here.

public static IEnumerable<KeyValuePair<MyDto,long>> PrepareClientResponses(this IEnumerable<MyServiceCnt> myEntities)
{
    if (myEntities == null || !myEntities.Any())
    {
        yield return default;
        yield break;
    }else{
        foreach (var e in myEntities)
        {
            var client = e.PrepareClientResponse();
            yield return new KeyValuePair<MyDto, long>(client, e.MyId.Value);
        }
    }
} 

else

你可以把循环放在一个

else
块中。这样,如果检查结果为真,它就不会被执行:

public static IEnumerable<KeyValuePair<MyDto,long>> PrepareClientResponses(this IEnumerable<MyServiceCnt> myEntities)
{
    if (myEntities == null || !myEntities.Any())
    {
        yield return default;
    }
    else
    {
        foreach (var e in myEntities)
        {
            var client = e.PrepareClientResponse();
            yield return new KeyValuePair<MyDto, long>(client, e.MyId.Value);
        }
    }
} 

什么都不做

在某些情况下,不返回任何元素可能是一个明智的决定,以防先入之见失败。但请注意,如果您这样做,您的代码将表现不同。

public static IEnumerable<KeyValuePair<MyDto,long>> PrepareClientResponses(this IEnumerable<MyServiceCnt> myEntities)
{
    if (myEntities != null && myEntities.Any())
    {
        foreach (var e in myEntities)
        {
            var client = e.PrepareClientResponse();
            yield return new KeyValuePair<MyDto, long>(client, e.MyId.Value);
        }
    }
} 

其他问题

请参阅 @Marco 的这个其他答案,了解您的代码的另一个问题(我也将其整合到这个答案中)。


2
投票

你的 foreach 循环有错误:

foreach (var myEntities in myEntities)

这是错误的,因为您在循环中使用了完全相同的变量!
应该是:

foreach (var myEntity in myEntities)
{
    var client = myEntity.PrepareClientResponse();
    yield return new KeyValuePair<MyDto, long>(client, myEntity.MyId.Value);
}
© www.soinside.com 2019 - 2024. All rights reserved.