代码分析:CA1002:不要暴露泛型列表。如何理解这种违规

问题描述 投票:-1回答:1

我读过上做很多岗位不能暴露通用但我仍然没有得到它的确切分辨率。我写了使用列表和目录分别返回类型和参数的示例控制台应用程序。在运行代码分析,它说不要暴露泛型列表。 As msdn says

System.Collections.Generic.List<T>是专为性能而不是继承泛型集合。 System.Collections.Generic.List<T>不包含虚拟成员,使其更容易更改继承类的行为。下面的泛型集合是专为继承和予以曝光,而不是System.Collections.Generic.List<T>

而解决方法是

要修复与该规则的冲突,在System.Collections.Generic.List<T>类型更改为是专为继承泛型集合中的一个。

如果我使用System.Collections.Generic.ICollection<T>。我仍然可以即使在函数调用来添加项目。那么什么是使用泛型集合的。下面是代码:

public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }

        public static List<Person> AddPersonsToCurrentList(List<Person> personsList )
        {
            personsList.Add(new Person(){ Age = 11, Name = "Vijay" });
            return personsList;
        }
    }
public class Program
    {
        public static void Main(string[] ar)
        {
            var personList = new List<Person>()
                                          {
                                              new Person(){Age =10,Name="Vj"} 
                                          };

            var resultList = Person.AddPersonsToCurrentList(personList);
            Console.WriteLine(personList.GetType());
            personList.Add(new Person(){Age = 11, Name = "Ajay"});
            Console.ReadKey();

        }
    }

现在,如果我改变返回类型Collection<Person>和参数Collection<Person>输出是一样的。由于我们揭露通用的清单,我改变了返回类型和参数列表ICollection<Person> / IEnumerable。如果我把ICollection。我仍然可以在方法之后也将项目添加到它。修改代码:

public static ICollection<Person> AddPersonsToCurrentList(Collection<Person> personsList )
        {
            personsList.Add(new Person(){ Age = 11, Name = "Vijay" });
            return personsList;
        }

不过还是我露出了泛型集合,其中用户仍然可以前或调用该方法后添加项目。任何人都可以请帮我用时在性能和其他各种其他属性方面List<T>相比Collection<T>如何是非常有用的。

它将对我帮助很大。提前致谢

c# generics
1个回答
0
投票

你被警告说,List对象是不灵活的,你都制约了外部开发者使用的具体类型。通常开发代码,这将是可用于其他开发人员使用时,最好的做法,是要求抽象的实现成为可能,实现只需要在你的方法的功能。

这使得最终用户如果需要提供自己的实现。例如,而不是需要的类型List<Person>,可以转而依靠IEnumerable<Person>,如果你正在做你的方法是通过列表枚举。

这将授予灵活性,为您的API用户实现自己的列表类型/佣工,将还会正常运行,只要他们自IEnumerable继承(这是保证您可以通过枚举类型合同)。

在您的例子中,你所要求的类型T,或者说,从类型T的名单继承的名单,并且被警告的具体类型List<T>不应该被用于继承。

© www.soinside.com 2019 - 2024. All rights reserved.