これに関する投稿がたくさんあることは知っていますが、IListのようなインターフェイスを渡して、具体的なリストの代わりにIListのようなインターフェイスを返す必要がある理由はまだ混乱しています。
これにより、後で実装を簡単に変更できるという投稿をたくさん読みましたが、それがどのように機能するかを完全には理解していません。
私がこの方法を持っているかどうかを言う
public class SomeClass
{
public bool IsChecked { get; set; }
}
public void LogAllChecked(IList<SomeClass> someClasses)
{
foreach (var s in someClasses)
{
if (s.IsChecked)
{
// log
}
}
}
IListを使用することが将来どのように役立つかわかりません。
私がすでにメソッドに入っている場合はどうですか?まだIListを使用する必要がありますか?
public void LogAllChecked(IList<SomeClass> someClasses)
{
//why not List<string> myStrings = new List<string>()
IList<string> myStrings = new List<string>();
foreach (var s in someClasses)
{
if (s.IsChecked)
{
myStrings.Add(s.IsChecked.ToString());
}
}
}
IListを使用すると何が得られますか?
public IList<int> onlySomeInts(IList<int> myInts)
{
IList<int> store = new List<int>();
foreach (var i in myInts)
{
if (i % 2 == 0)
{
store.Add(i);
}
}
return store;
}
今はどう?変更する必要があるintのリストの新しい実装はありますか?
基本的に、IListを使用すると、Listをすべてに取り込むだけでなく、問題がどのように解決されるかを示す実際のコード例をいくつか見る必要があります。
私の読書から、私はただ物事をループしているので、IListの代わりにIEnumberableを使用できたと思います。
編集 だから私はこれを行う方法について私の方法のいくつかで遊んでいます。戻り値の型についてはまだわかりません(より具体的なものにするか、インターフェイスにする必要があるか)。
public class CardFrmVm
{
public IList<TravelFeaturesVm> TravelFeaturesVm { get; set; }
public IList<WarrantyFeaturesVm> WarrantyFeaturesVm { get; set; }
public CardFrmVm()
{
WarrantyFeaturesVm = new List<WarrantyFeaturesVm>();
TravelFeaturesVm = new List<TravelFeaturesVm>();
}
}
public class WarrantyFeaturesVm : AvailableFeatureVm
{
}
public class TravelFeaturesVm : AvailableFeatureVm
{
}
public class AvailableFeatureVm
{
public Guid FeatureId { get; set; }
public bool HasFeature { get; set; }
public string Name { get; set; }
}
private IList<AvailableFeature> FillAvailableFeatures(IEnumerable<AvailableFeatureVm> avaliableFeaturesVm)
{
List<AvailableFeature> availableFeatures = new List<AvailableFeature>();
foreach (var f in avaliableFeaturesVm)
{
if (f.HasFeature)
{
// nhibernate call to Load<>()
AvailableFeature availableFeature = featureService.LoadAvaliableFeatureById(f.FeatureId);
availableFeatures.Add(availableFeature);
}
}
return availableFeatures;
}
ここで、次のようなプロパティを持つドメインモデルにこれを追加するという単純な事実のためにIListを返します。
public virtual IList<AvailableFeature> AvailableFeatures { get; set; }
上記はIList自体です。これは、nhibernateで使用する標準のようです。そうでなければ、IEnumberableを返したかもしれませんが、よくわかりません。それでも、ユーザーが100%必要とするものを理解することはできません(コンクリートを返す方が有利な場合です)。
編集2
また、メソッドで参照渡しを実行したい場合はどうなるかを考えていました。
private void FillAvailableFeatures(IEnumerable<AvailableFeatureVm> avaliableFeaturesVm, IList<AvailableFeature> toFill)
{
foreach (var f in avaliableFeaturesVm)
{
if (f.HasFeature)
{
// nhibernate call to Load<>()
AvailableFeature availableFeature = featureService.LoadAvaliableFeatureById(f.FeatureId);
toFill.Add(availableFeature);
}
}
}
これで問題が発生しますか?配列(固定サイズ)を渡すことができなかったので?具体的なリストの方がいいのではないでしょうか。