.NET Framework
ReadOnlyCollections
수색…
비고
ReadOnlyCollection
은 기존 컬렉션 ( '소스 컬렉션')에 대한 읽기 전용 뷰를 제공합니다.
항목은 ReadOnlyCollection
직접 추가되거나 ReadOnlyCollection
에서 제거되지 않습니다. 대신 원본 컬렉션에서 추가되고 제거되며 ReadOnlyCollection
은 이러한 변경 내용을 원본에 반영합니다.
ReadOnlyCollection
내의 요소 수와 순서는 수정할 수 없지만 범위에 있다고 가정 할 경우 요소의 속성이 될 수 있고 메서드를 호출 할 수 있습니다.
외부 코드에서 컬렉션을 수정할 수 없어도 볼 수는 있지만 컬렉션을 직접 수정할 수있게하려면 ReadOnlyCollection
사용합니다.
참고 사항
-
ObservableCollection<T>
-
ReadOnlyObservableCollection<T>
ReadOnlyCollections 대 ImmutableCollection
ReadOnlyCollection
은 ImmutableCollection
을 작성한 후에는 편집 할 수 없다는 점에서 ImmutableCollection
과 다릅니다.이 요소는 항상 n
요소를 포함하며 교체하거나 재정렬 할 수 없습니다. 반면에 ReadOnlyCollection
은 직접 편집 할 수 없지만 요소는 여전히 소스 컬렉션을 사용하여 추가 / 제거 / 재정렬 할 수 있습니다.
ReadOnlyCollection 만들기
생성자 사용하기
ReadOnlyCollection
은 기존 IList
객체를 생성자에 전달하여 만듭니다.
var groceryList = new List<string> { "Apple", "Banana" };
var readOnlyGroceryList = new ReadOnlyCollection<string>(groceryList);
LINQ 사용
또한 LINQ는 IList
개체에 대한 AsReadOnly()
확장 메서드를 제공합니다.
var readOnlyVersion = groceryList.AsReadOnly();
노트
일반적으로 소스 컬렉션을 비공개로 유지하고 ReadOnlyCollection
대한 공용 액세스를 허용하려고합니다. 인라인 목록에서 ReadOnlyCollection
을 만들 수 있지만 컬렉션을 만든 후에는 컬렉션을 수정할 수 없습니다.
var readOnlyGroceryList = new List<string> {"Apple", "Banana"}.AsReadOnly();
// Great, but you will not be able to update the grocery list because
// you do not have a reference to the source list anymore!
이 작업을 수행하는 경우 ImmutableCollection
과 같은 다른 데이터 구조를 사용하는 것이 좋습니다.
ReadOnlyCollection 업데이트
ReadOnlyCollection
은 직접 편집 할 수 없습니다. 대신 소스 컬렉션이 업데이트되고 ReadOnlyCollection
이러한 변경 내용이 반영됩니다. 이것이 ReadOnlyCollection
의 핵심 기능입니다.
var groceryList = new List<string> { "Apple", "Banana" };
var readOnlyGroceryList = new ReadOnlyCollection<string>(groceryList);
var itemCount = readOnlyGroceryList.Count; // There are currently 2 items
//readOnlyGroceryList.Add("Candy"); // Compiler Error - Items cannot be added to a ReadOnlyCollection object
groceryList.Add("Vitamins"); // ..but they can be added to the original collection
itemCount = readOnlyGroceryList.Count; // Now there are 3 items
var lastItem = readOnlyGroceryList.Last(); // The last item on the read only list is now "Vitamins"
경고 : ReadOnlyCollection의 요소는 본래 읽기 전용이 아닙니다.
원본 컬렉션의 형식이 변경되지 않으면 ReadOnlyCollection
통해 액세스되는 요소를 수정할 수 있습니다.
public class Item
{
public string Name { get; set; }
public decimal Price { get; set; }
}
public static void FillOrder()
{
// An order is generated
var order = new List<Item>
{
new Item { Name = "Apple", Price = 0.50m },
new Item { Name = "Banana", Price = 0.75m },
new Item { Name = "Vitamins", Price = 5.50m }
};
// The current sub total is $6.75
var subTotal = order.Sum(item => item.Price);
// Let the customer preview their order
var customerPreview = new ReadOnlyCollection<Item>(order);
// The customer can't add or remove items, but they can change
// the price of an item, even though it is a ReadOnlyCollection
customerPreview.Last().Price = 0.25m;
// The sub total is now only $1.50!
subTotal = order.Sum(item => item.Price);
}