【问题标题】:Net Core: Resolve "Add a way to break out of this property accessor's recursion"Net Core:解决“添加一种方法来打破此属性访问器的递归”
【发布时间】:2019-12-29 06:02:13
【问题描述】:

我正在尝试创建一个简单的类。 ColumnSort 成员是以逗号分隔的文本“Car,Book,Food”中的项目列表。

ColumnSortList 创建一个 List

  1. 汽车
  2. 书籍
  3. 食物

C# 和 SonarQube 提到了诸如错误之类的项目

获取:添加一种方法来打破此属性访问器的递归。

设置:在此属性集访问器声明中使用“值”参数

我将如何解决这些问题以使警告/错误(在 SonarQube 中)消失?也愿意让代码更高效。

注意:columnSortList 纯粹应该是 ColumnSort 字符串中的只读计算字段。

public class PageModel
{
    public int Page { get; set; }
    public int Limit { get; set; }
    public string ColumnSort { get; set; }

    public IEnumerable<string> columnSortList
    {
        get
        {
            return columnSortList;
        }
        set
        {
            if (ColumnSort == null)
            {
                columnSortList = null;
            }
            else
            {
                columnSortList = ColumnSort.Split(',')
                             .Select(x => x.Trim())
                             .Where(x => !string.IsNullOrWhiteSpace(x))
                             .AsEnumerable();
            }
        }
    }

【问题讨论】:

  • 您的columnSortList 属性需要一个支持字段。您从内部获取和设置它。
  • 嗨@BrianRogers columnSortList 纯粹应该是 ColumnSort 字符串中的只读计算字段,我将如何解决这个问题?谢谢
  • 如果它应该是只读的,那么你不应该有一个 set 方法。请参阅下面的答案。

标签: c# linq generics .net-core sonarqube


【解决方案1】:

如果columnSortList 是纯只读的,从ColumnSort 计算,那么您根本不应该有set 方法。所有的逻辑都应该像这样进入get

public IEnumerable<string> columnSortList
{
    get
    {
        if (ColumnSort == null)
        {
            return Enumerable.Empty<string>();
        }
        else
        {
            return ColumnSort.Split(',')
                             .Select(x => x.Trim())
                             .Where(x => !string.IsNullOrWhiteSpace(x))
                             .AsEnumerable();
        }
    }
}

【讨论】:

  • 现在它的说法是“返回一个空集合而不是 null”,也会对此进行研究,谢谢
  • 在这种情况下将 return null; 更改为 return Enumerable.Empty&lt;string&gt;();
  • 很高兴我能帮上忙。
  • 这里也提出了一个纯技术问题,stackoverflow.com/questions/57634401/…,谢谢
【解决方案2】:

您的 getter 正在返回自己,这是您无法做到的,而您的 setter 正在设置自己,您也无法做到。这似乎是你想要的:

public IEnumerable<string> columnSortList
{
    get
    {
        if (ColumSort == null)
        {
            return new List<string>();
        }
        else
        {
            return ColumnSort.Split(',')
                         .Select(x => x.Trim())
                         .Where(x => !string.IsNullOrWhiteSpace(x))
                         .AsEnumerable();
        }
    }
}

【讨论】:

  • 现在它的说法是,返回一个空集合而不是 null,也会研究这个,
  • 嗨,返回 Enumerable.Empty();,我这样做是因为它的 Enumerable,它也固定在我的一端
  • 这里也提出了一个纯技术问题,stackoverflow.com/questions/57634401/…,谢谢
猜你喜欢
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 2019-07-05
  • 2015-05-08
  • 1970-01-01
相关资源
最近更新 更多