수색…


비고

이 구문 설탕을 사용하여 개체를 초기화하는 유일한 요구 사항은 형식이 System.Collections.IEnumerableAdd 메서드를 구현한다는 것입니다. 콜렉션 이니셜 라이저라고해도 콜렉션이 아니 어도됩니다.

컬렉션 이니셜 라이저

값으로 콜렉션 유형을 초기화하십시오.

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() 를 호출하는 것입니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow