Programing

값 유형의 'this'변수 변경

lottogame 2020. 11. 22. 18:52
반응형

값 유형의 'this'변수 변경


분명히 this구조체의 어느 곳에서나 값을 변경할 수 있습니다 (클래스가 아님).

struct Point
{
    public Point(int x, int y)
    {
        this = new Point();
        X = x; Y = y;
    }
    int X; int Y;
}

나는 이것을 전에 본 적도 필요하지 않았습니다. 왜 그렇게하고 싶을까요? Eric Lippert 는 기능이 구현되기 위해서는 정당화되어야한다고 상기시킵니다 . 이것을 정당화 할 수있는 훌륭한 사용 사례는 무엇입니까? 이것이 귀중한 시나리오가 있습니까? 그것에 대한 문서를 찾을 수 없습니다 1 .

또한 생성자를 호출하는 경우 이미 더 잘 알려진 대체 구문이 있으므로이 기능은 때때로 중복됩니다.

public Point(int x, int y)
    : this()
{
    X = x; Y = y;
}

이 기능은 Jeffrey Richter의 CLR via C # 4th edition 예제에서 발견되었습니다 .
1) 분명히 C # 사양에 있습니다.


좋은 질문!

값 유형은 정의에 따라 값별로 복사됩니다. 경우 this실제로 저장 위치에 별명이 아니었다 다음 생성자는 사본을 초기화하는 것 보다는 당신이 초기화하려는 변수를 초기화. 생성자를 덜 유용하게 만들 것입니다! 방법도 비슷합니다. 예, 변경 가능한 구조체는 악하지만 변경 가능한 구조체를 다시 만들려면 this값의 복사본이 아니라 변경되는 변수 여야합니다.

설명하는 동작은 해당 설계 결정의 논리적 결과입니다 this. 변수에 별칭을 지정하기 때문에 다른 변수에 할당 할 수있는 것과 동일하게 할당 할 수 있습니다.

this필드에 할당하는 것보다 직접 할당하는 것이 다소 이상 합니다. 직접 할당 this한 다음 해당 할당의 100 %를 덮어 쓰는 것이 훨씬 더 이상 합니다!

this수신자의 스토리지에 별칭을 만드는 것을 피할 수있는 대안 설계는 this단기 스토리지 풀 을 할당 하고 ctor에서 초기화 한 다음 값으로 반환하는 것입니다. 이 접근 방식의 단점은 복사 제거 최적화를 거의 불가능하게 만들고 ctor와 메서드가 이상하게 일관성이 없게 만든다는 것입니다.


또한 그것에 대한 문서를 찾을 수 없습니다.

C # 사양을 살펴 보셨습니까? 문서를 찾을 수 있기 때문에 (7.6.7) :

  • 구조체의 인스턴스 생성자 내 this에서 primary-expression에 사용 되면 변수로 분류됩니다. 변수의 형식은 사용이 발생하는 구조체의 인스턴스 형식 (§10.3.1)이며 변수는 생성되는 구조체를 나타냅니다. this구조체의 인스턴스 생성자의 변수는 정확히 동일한 동작 out구조체 파라미터의 타입에 특정 변수가 확실히 인스턴스 생성자마다 실행 경로에 할당되어야한다는 것을이 방법.

  • 경우 this(A)에 사용되는 일차 식 인스턴스 메소드 또는 구조체의 인스턴스 접근 내에서,이 변수로 분류된다. 변수의 유형은 사용이 발생하는 구조체의 인스턴스 유형 (§10.3.1)입니다.

    • 메서드 또는 접근자가 반복자가 아닌 경우 (§10.14) this변수는 메서드 또는 접근자가 호출 된 구조체를 나타내며 ref구조체 형식 매개 변수 와 정확히 동일하게 동작 합니다.
    • 메서드 또는 접근자가 반복자 인 경우 this변수는 메서드 또는 접근자가 호출 된 구조체의 복사본을 나타내며 구조체 형식 매개 변수 와 정확히 동일하게 동작 합니다.

사용 사례에 관해서는 즉시 많은 것을 생각할 수 없습니다. 생성자에 할당하려는 값이 계산하는 데 비용이 많이 들고 캐시 된 값이있는 경우 제가 가진 유일한 방법은 에 복사하려는 this경우 편리 할 수 ​​있습니다.


해당 유형의 공개 및 비공개 필드를 구성하는 저장 위치 집합에서 값 유형의 저장 위치입니다. 값 유형에 일반 (값) 매개 변수를 전달하면 모든 필드의 내용을 물리적 및 의미 적으로 전달합니다. 값 유형을 ref매개 변수로 전달하는 것은 모든 필드를 전달하는 데 단일 "byref"가 사용되지만 의미 상 모든 필드의 컨텐츠를 전달합니다.

구조체에서 메서드를 호출하는 것은 ref하나의 주름을 제외하고 구조체 (및 모든 필드)를 매개 변수 로 전달하는 것과 동일합니다 . 일반적으로 C #이나 vb.net은 읽기 전용 값을 ref매개 변수 로 전달할 수 없습니다 . 그러나 둘 다 읽기 전용 값 또는 임시 값에서 struct 메서드를 호출 할 수 있습니다. 모든 구조체 (및 모든 필드)의 복사본을 만든 다음 해당 복사본을 ref매개 변수 로 전달하여이를 수행합니다 .

이 동작으로 인해 일부 사람들은 변경 가능한 구조체를 "악"이라고 부르지 만, 나쁜 점은 C # 또는 vb.net이 구조체 멤버 나 속성이 할 수없는 것에 대해 호출 가능해야하는지 여부를 나타내는 특성을 정의하지 않는다는 사실입니다. 에 의해 직접 전달됩니다 ref.

참고 URL : https://stackoverflow.com/questions/14764927/changing-the-this-variable-of-value-types

반응형