C# Language
컬렉션 초기화 프로그램
수색…
비고
이 구문 설탕을 사용하여 개체를 초기화하는 유일한 요구 사항은 형식이 System.Collections.IEnumerable
및 Add
메서드를 구현한다는 것입니다. 콜렉션 이니셜 라이저라고해도 콜렉션이 아니 어도됩니다.
컬렉션 이니셜 라이저
값으로 콜렉션 유형을 초기화하십시오.
var stringList = new List<string>
{
"foo",
"bar",
};
콜렉션 이니셜 라이저는 Add()
호출을위한 구문적인 설탕입니다. 위의 코드는 다음과 같습니다.
var temp = new List<string>();
temp.Add("foo");
temp.Add("bar");
var stringList = temp;
초기 조건은 경쟁 조건을 피하기 위해 임시 변수를 사용하여 원자 적으로 수행됩니다.
Add()
메서드에서 여러 매개 변수를 제공하는 형식의 경우 쉼표로 구분 된 인수를 중괄호로 묶습니다.
var numberDictionary = new Dictionary<int, string>
{
{ 1, "One" },
{ 2, "Two" },
};
이것은 다음과 같습니다.
var temp = new Dictionary<int, string>();
temp.Add(1, "One");
temp.Add(2, "Two");
var numberDictionarynumberDictionary = temp;
C # 6 인덱스 초기화 프로그램
C # 6부터 인덱서를 사용하는 컬렉션은 대괄호로 지정한 인덱스를 지정하고 등호 다음에 할당 할 값을 지정하여 초기화 할 수 있습니다.
사전 초기화
사전을 사용하는이 구문의 예 :
var dict = new Dictionary<string, int>
{
["key1"] = 1,
["key2"] = 50
};
이것은 다음과 같습니다.
var dict = new Dictionary<string, int>();
dict["key1"] = 1;
dict["key2"] = 50
C # 6 전에이 작업을 수행하는 콜렉션 초기화 프로그램 구문은 다음과 같습니다.
var dict = new Dictionary<string, int>
{
{ "key1", 1 },
{ "key2", 50 }
};
어느 것에 대응할 것인가?
var dict = new Dictionary<string, int>();
dict.Add("key1", 1);
dict.Add("key2", 50);
따라서 새 구문은 초기화 된 개체의 인덱서 를 사용하여 Add()
메서드를 사용하는 대신 값을 할당하므로 기능이 크게 다릅니다. 즉, 새로운 구문은 공개적으로 사용할 수있는 인덱서 만 있으면되고, 하나의 개체에 대해 작동합니다.
public class IndexableClass
{
public int this[int index]
{
set
{
Console.WriteLine("{0} was assigned to index {1}", value, index);
}
}
}
var foo = new IndexableClass
{
[0] = 10,
[1] = 20
}
그러면 다음과 같이 출력됩니다.
10 was assigned to index 0
20 was assigned to index 1
사용자 정의 클래스의 콜렉션 초기화 프로그램
클래스가 컬렉션 이니셜 라이저를 지원하게하려면 IEnumerable
인터페이스를 구현하고 하나 이상의 Add
메서드가 있어야합니다. C # 6부터 IEnumerable
을 구현하는 모든 콜렉션은 확장 메소드를 사용하여 사용자 정의 Add
메소드로 확장 될 수 있습니다.
class Program
{
static void Main()
{
var col = new MyCollection {
"foo",
{ "bar", 3 },
"baz",
123.45d,
};
}
}
class MyCollection : IEnumerable
{
private IList list = new ArrayList();
public void Add(string item)
{
list.Add(item)
}
public void Add(string item, int count)
{
for(int i=0;i< count;i++) {
list.Add(item);
}
}
public IEnumerator GetEnumerator()
{
return list.GetEnumerator();
}
}
static class MyCollectionExtensions
{
public static void Add(this MyCollection @this, double value) =>
@this.Add(value.ToString());
}
매개 변수 배열을 사용하는 Collection Initializer
일반 매개 변수와 매개 변수 배열을 혼합 할 수 있습니다.
public class LotteryTicket : IEnumerable{
public int[] LuckyNumbers;
public string UserName;
public void Add(string userName, params int[] luckyNumbers){
UserName = userName;
Lottery = luckyNumbers;
}
}
이제이 구문을 사용할 수 있습니다.
var Tickets = new List<LotteryTicket>{
{"Mr Cool" , 35663, 35732, 12312, 75685},
{"Bruce" , 26874, 66677, 24546, 36483, 46768, 24632, 24527},
{"John Cena", 25446, 83356, 65536, 23783, 24567, 89337}
}
개체 이니셜 라이저 내부에서 컬렉션 이니셜 라이저 사용
public class Tag
{
public IList<string> Synonyms { get; set; }
}
Synonyms
는 콜렉션 유형 특성입니다. Tag
객체가 객체 이니셜 라이저 구문을 사용하여 생성 될 때 Synonyms
는 또한 콜렉션 초기화 자 구문으로 초기화 될 수 있습니다.
Tag t = new Tag
{
Synonyms = new List<string> {"c#", "c-sharp"}
};
컬렉션 속성은 읽기 전용 일 수 있으며 여전히 컬렉션 이니셜 라이저 구문을 지원합니다. 이 수정 된 예제를 고려하십시오 ( Synonyms
( Synonyms
속성은 이제 private setter를가집니다) :
public class Tag
{
public Tag()
{
Synonyms = new List<string>();
}
public IList<string> Synonyms { get; private set; }
}
다음과 같이 새 Tag
객체를 만들 수 있습니다.
Tag t = new Tag
{
Synonyms = {"c#", "c-sharp"}
};
이것은 콜렉션 initializers가 Add()
를 호출하는 것 이상의 합성 설탕 일 뿐이 기 때문에 효과가있다. 여기에 새로운 목록이 만들어지지 않습니다. 컴파일러는 기존 객체에 Add()
를 호출하는 것입니다.