programing

C # new 문 뒤의 중괄호는 무엇을합니까?

nasanasas 2020. 12. 4. 08:24
반응형

C # new 문 뒤의 중괄호는 무엇을합니까?


아래 코드에서 position0초기화 방식 과 초기화 방식의 차이점은 무엇 position1입니까? 동등합니까? 그렇지 않다면 차이점은 무엇입니까?

class Program
{
    static void Main(string[] args)
    {
        Position position0 = new Position() { x=3, y=4 };

        Position position1 = new Position();
        position1.x = 3;
        position1.y = 4;
    }
}

struct Position
{
    public int x, y;
}

개체의 필드를 초기화하는 데 사용되는 개체 및 컬렉션 이니셜 라이저입니다.

http://msdn.microsoft.com/en-us/library/bb384062.aspx

그들은 거의 동등한 IL을 생산 합니다. Jon Skeet는 실제로 무슨 일이 일어나고 있는지에 대한 답을 가지고 있습니다.


그들은없는 아주 동등 - 적어도이 아닌 일반적인 경우에. 객체 이니셜 라이저를 사용하는 코드는 다음과 비슷합니다.

Position tmp = new Position();
tmp.x = 3;
tmp.y = 4;
Position position1 = tmp;

즉, 변수에 대한 할당 은 속성이 설정된 후에 만 발생합니다 . 이제 새 지역 변수를 선언하는 경우 실제로 중요하지 않으며 컴파일러는 첫 번째 양식에 맞게 최적화 할 수 있습니다. 그러나 논리적으로 중요합니다. 중히 여기다:

Position p1 = new Position { x = 10, y = 20 };

p1 = new Position { x = p1.y, y = p1.x };

그것이 p1 first에 대한 할당을했다면 , p1.x그리고 둘 다에 대해 0으로 끝날 것입니다 p1.y. 실제로는 다음과 같습니다.

Position tmp = new Position();
tmp.x = 10;
tmp.y = 20;
Position p1 = tmp;

tmp = new Position();
tmp.x = p1.y; // 20
tmp.y = p1.x; // 10
p1 = tmp;

편집 : 방금 클래스가 아닌 구조체를 사용하고 있음을 깨달았습니다. 그것은 약간의 미묘한 차이를 만들 수 있습니다 ...하지만 당신은 거의 확실하게 변경 가능한 구조체를 사용하여 시작해서는 안됩니다 :)


이것은 객체 이니셜 라이저이며 단순히 단일 표현식에 값을 할당 할 수 있도록합니다. 가장 중요한 것은 익명 형식 (그렇지 않으면 불변)에 대해 LINQ 내부에서도 작동한다는 것입니다. 새 컬렉션에 추가 항목에 대한 유사한 컬렉션 이니셜 라이저 구문도 있습니다.

유용 할 수있는 미묘한 타이밍 문제가 있습니다. 이니셜 라이저 를 사용 하면 변수가 할당 되기 전에 할당 / 추가가 모두 발생 하므로 다른 스레드가 불완전한 객체를 보는 것을 막을 수 있습니다. 그렇지 않으면 동일한 결과를 얻으려면 추가 변수가 필요합니다.


두 코드 샘플은 동일한 IL을 생성합니다. (적어도 릴리스 빌드에서는)


모든 IL에 대해 잊어 버리면 그냥 속기 표기법 일뿐입니다. 당신이하는 일은 다음과 같습니다.

ㅏ. 어떤 경우에는 명시 적으로 기본 생성자를 사용한 다음 두 속성을 설정합니다.

b. In the other, you are using the new intializer syntax which implicitly makes the compiler do what you did in case a.

IL subtelties notwithstanding, they will achieve the same thing for you.


These are fully equivalent. The compiler actually just transforms the first version into the second one.

The only difference between the two is that with the first, you can do nice thins, like pass the initialized version to a method:

DoSomethingWithPoint(new Position() { x=3, y=4 });

This is a lot more lines of code than the second initialization example.


They are equivalent, apart from one being easier to read than the other one.

Also consider the case when you want to pass the new object along to somewhere else:

var aList = new List<Position>();
aList.Add( new Position() { x=3, y=4 } );

참고URL : https://stackoverflow.com/questions/4034719/what-do-braces-after-c-sharp-new-statement-do

반응형