代码如下所示:
namespace Test
{
public interface IMyClass
{
List<IMyClass> GetList();
}
public class MyClass : IMyClass
{
public List<IMyClass> GetList()
{
return new List<IMyClass>();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行代码分析时,我得到以下建议.
警告3 CA1002:Microsoft.Design:更改'IMyClass.GetList()'中的'List'以使用Collection,ReadOnlyCollection或KeyedCollection
我应该如何解决这个问题以及这里有什么好的做法?
当我正在编写我的DAL或其他返回一组项目的代码时,我是否应该总是返回语句:
public IEnumerable<FooBar> GetRecentItems()
Run Code Online (Sandbox Code Playgroud)
要么
public IList<FooBar> GetRecentItems()
Run Code Online (Sandbox Code Playgroud)
目前,在我的代码中,我一直试图尽可能地使用IEnumerable,但我不确定这是否是最佳实践?这似乎是正确的,因为我返回了最通用的数据类型,同时仍然描述它的作用,但也许这是不正确的.
我知道之前已经问过这些问题,我将首先列出其中一些问题(我到目前为止已经阅读过的):
正如你所看到的那样,关于这个主题的SO本身有一些很好的资源,但是有一个问题/部分的问题,我仍然不确定是否已经阅读了这些内容.
我主要关注IEnumerable和IQueryable问题,更具体地说是DAL与它的消费者之间的耦合.
我发现有关两个接口的建议各不相同,这两个接口都很棒.但是,我关注的是DAL返回IQueryable的含义.据我了解,IQueryable建议/暗示有一个Linq提供商.这是第一个问题 - 如果DAL突然需要来自非Linq提供的数据源,该怎么办?以下方法可行,但它更像是黑客攻击吗?
public static IQueryable<Product> GetAll()
{
// this function used to use a L2S context or similar to return data
// from a database, however, now it uses a non linq provider
// simulate the non linq provider...
List<Product> results = new …Run Code Online (Sandbox Code Playgroud) 在方法参数中使用基类型有什么好处?
这是一个样本:
private void Foo(List<int> numbers) //R# laments: parameter can be IEnumerable.
{
foreach (var i in numbers) {
Console.WriteLine(i);
}
}
Run Code Online (Sandbox Code Playgroud)
这是另一个
public class Foo : ICloneable
{
public object Clone()
{
return MemberwiseClone();
}
public Foo CopyMe(Foo other) //R# laments: parameter can be ICloneable
{
return (Foo)other.Clone();
}
}
Run Code Online (Sandbox Code Playgroud)
...我们可以在哪里更改类型,但Foo在运行时会失败.
所以问题是:当R#建议参数可以是'X'时,我该怎么办?
PS.只是Whysharper的另一个解释- 一个与Resharper和StackOverflow相吻合的插件.人们说这很好,但缺乏很好的解释 - 希望我们能在一起做得更好;).
我有很多使用LINQ的例子,如何根据每个列表中的最大项将列表划分为子列表.但在这种情况下,我有兴趣使用sizemb作为权重来跳转子列表 - 每个列表的最大总文件大小为9mb.
public class doc
{
public string file;
public int sizemb;
}
var list = new List<doc>()
{
new doc { file = "dok1", sizemb = 5 },
new doc { file = "dok2", sizemb = 5 },
new doc { file = "dok3", sizemb = 5 },
new doc { file = "dok4", sizemb = 4 },
};
int maxTotalFileSize = 9;
Run Code Online (Sandbox Code Playgroud)
然后,上面的清单应分为3个清单.如果任何"文件"超过9mb,则应该在他们自己的列表中.
我在这里做了一个非LINQ版本:
var lists = new List<List<doc>>();
foreach (var item in list)
{
//Try and …Run Code Online (Sandbox Code Playgroud) 首先,我不认为这个问题是这些问题的重复:
我应该总是返回IEnumerable <T>而不是IList <T>吗? 和IEnumerable <T>作为返回类型
众所周知,引入几层的主要目的是减少耦合.
我们必须为数据访问定义一些接口,我们的BL不应该关心DAL实现的细节.如果提到接口返回IEnumerable<T>BL不知道它只是一个静态IEnumerable还是延迟执行的东西.同时,该特定细节可以显着影响性能并且根据实施方式需要不同的编码.
好吧,在我们要多次迭代收集的情况下,可以调用.ToList()每个IEnumerable.但是由于不必要的新列表实例化,这降低了静态集合的性能.
所以我试图了解哪种方法更好.
更具普遍性,可能性能更差,性能更高,性能更高.我想,没有银弹,但它可能是我错过的其他方法.
我应该IEnumerable<T>只在懒惰评估的情况下从方法和属性返回吗?
你有任何人的模式,当你返回IEnumerable,ICollection和IList?