Tôi biết đã có rất nhiều bài viết về vấn đề này nhưng nó vẫn khiến tôi bối rối tại sao bạn nên chuyển vào một giao diện như IList và trả lại một giao diện như IList thay vì danh sách cụ thể.
Tôi đã đọc rất nhiều bài đăng nói rằng cách này giúp thay đổi cách triển khai dễ dàng hơn sau này, nhưng tôi không thấy đầy đủ về cách hoạt động của nó.
Nói nếu tôi có phương pháp này
public class SomeClass
{
public bool IsChecked { get; set; }
}
public void LogAllChecked(IList<SomeClass> someClasses)
{
foreach (var s in someClasses)
{
if (s.IsChecked)
{
// log
}
}
}
Tôi không chắc việc sử dụng IList sẽ giúp ích gì cho tôi trong tương lai.
Làm thế nào về nếu tôi đã ở trong phương pháp? Tôi vẫn nên sử dụng 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());
}
}
}
Tôi nhận được gì khi sử dụng IList bây giờ?
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;
}
Còn bây giờ thì sao? Có một số triển khai mới của danh sách các int mà tôi sẽ cần thay đổi không?
Về cơ bản, tôi cần xem một số ví dụ mã thực tế về cách sử dụng IList sẽ giải quyết một số vấn đề khi chỉ đưa Danh sách vào mọi thứ.
Từ bài đọc của tôi, tôi nghĩ rằng tôi có thể đã sử dụng IEnumberable thay vì IList vì tôi chỉ đang lặp lại các thứ.
Chỉnh sửa Vì vậy, tôi đã xem xét một số phương pháp của tôi về cách thực hiện việc này. Tôi vẫn không chắc chắn về kiểu trả về (nếu tôi nên làm cho nó cụ thể hơn hoặc một giao diện).
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;
}
Bây giờ tôi trả lại IList vì thực tế đơn giản là sau đó tôi sẽ thêm cái này vào mô hình miền của mình, cái có thuộc tính như sau:
public virtual IList<AvailableFeature> AvailableFeatures { get; set; }
Trên đây là bản thân IList vì đây là tiêu chuẩn để sử dụng với nhibernate. Nếu không, tôi có thể đã trả lại IEnumberable trở lại nhưng không chắc. Tuy nhiên, tôi không thể tìm ra người dùng 100% sẽ cần gì (đó là nơi mà việc trả lại bê tông có lợi thế hơn).
Chỉnh sửa 2
Tôi cũng đang nghĩ điều gì sẽ xảy ra nếu tôi muốn chuyển bằng tham chiếu trong phương pháp của mình?
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);
}
}
}
tôi sẽ gặp vấn đề với điều này? Vì chúng không thể truyền vào một mảng (có kích thước cố định)? Sẽ tốt hơn nếu có một Danh sách cụ thể?