객체가 참조를 통해 자동으로 전달되는 이유는 무엇입니까?

플로리안 R. 클라인

C #의 참조에 의한 전달 및 값에 의한 전달 개념의 맥락에서 심층 복사 및 얕은 복사에 대한 일반적인 질문이 있습니다.

C #에서는 포인터 / 참조를 허용하는 메서드를 명시 적으로 생성해야 메서드에 전달할 수 있습니다. 그러나 적어도 메서드 / 생성자에 매개 변수로 전달 된 개체는 나머지 개체와 다르게 동작합니다. http://zetcode.com/lang/csharp/oopii/에 설명 된대로 추가 복제가 수행되지 않으면 항상 참조로 전달되는 것 같습니다 .

객체가 참조를 통해 자동으로 전달되는 이유는 무엇입니까? 이러한 경우에 int, double, boolean 등과 같은 객체를 처리하는 대신 복제 프로세스를 강제하는 것이 특별한 이점이 있습니까?

다음은 내가 의미하는 바를 보여주는 코드 예제입니다.

using System;

public class Entry
{

    public class MyColor
    {
        public int r = 0;
        public int g = 0;
        public int b = 0;
        public double a = 1;

        public MyColor (int r, int g, int b, double a)
        {
            this.r = r;
            this.g = g;
            this.b = b;
            this.a = a;
        }
    }

    public class A
    {
        public int id;
        public MyColor color;
        public MyColor hiddenColor;

        public A (int id, MyColor color)
        {
            this.id = id;
            this.color = color;
        }
    }

    static void Main(string[] args)
    {
        int id = 0;
        MyColor col = new MyColor(1, 2, 3, 1.0);

        A a1 = new A(id, col);
        A a2 = new A(id, col);

        a1.hiddenColor = col;
        a2.hiddenColor = col;

        a1.id = -999;
        id = 1;
        col.a = 0;

        Console.WriteLine(a1.id);
        Console.WriteLine(a2.id);

        Console.WriteLine(a1.color.a);
        Console.WriteLine(a2.color.a);

        Console.WriteLine(a1.hiddenColor.a);
        Console.WriteLine(a2.hiddenColor.a);
    }
}

결과는 다음과 같습니다.

-999
0
0
0
0

의 인스턴스 MyCol는 항상 참조로 전달되는 반면 다른 인수는 값으로 전달됩니다. 나는 ICloneable을 클래스 MyColorA. 반면에 ´ref´ 문은 명시 적으로 참조에 의한 전달을 허용하고 수행하는 데 사용해야하는 C #에 있습니다.

제안을 환영합니다!

토마스 레베 스크

객체가 참조를 통해 자동으로 전달되는 이유는 무엇입니까?

그들은 아니다.

이러한 경우에 int, double, boolean 등과 같은 객체를 처리하는 대신 복제 프로세스를 강제하는 것이 특별한 이점이 있습니까?

참조 유형에 대한 "복제 프로세스"는 없으며 값 유형에만 해당됩니다.

다른 개념을 혼동하고 있다고 생각합니다.

  • 값 유형 대 참조 유형

    값 유형 (예 : 기본 숫자 유형, 열거 형 및와 같은 구조 DateTime)의 경우 변수 값은 객체 자체입니다. 변수를 다른 변수에 할당 (또는 값으로 매개 변수로 전달)하면 객체의 복사본이 생성됩니다.

    참조 유형 (예 : object,, string클래스 (구조체 아님) 등)의 경우 변수 값은 객체에 대한 참조입니다. 변수를 다른 변수에 할당 (또는 값으로 매개 변수로 전달)하면 참조의 복사본이 만들어 지므로 여전히 동일한 개체 인스턴스를 참조합니다.

  • 값으로 매개 변수 전달과 참조로 전달

    값으로 매개 변수를 전달한다는 것은 값의 사본을 전달 함을 의미합니다. 값 유형인지 참조 유형인지에 따라 객체 자체의 복사본 또는 참조의 복사본을 의미합니다. 호출 수신자가 매개 변수로 전달 된 값 유형의 멤버를 수정하는 경우 호출자는 사본에서 작업 중이므로 변경 사항을 볼 수 없습니다. 반면, 호출 수신자가 매개 변수로 전달 된 참조 유형의 멤버를 수정하는 경우 호출 수신자와 호출자 모두 동일한 개체 인스턴스에 대한 참조가 있기 때문에 호출자에게 변경 내용이 표시됩니다.

    참조로 매개 변수를 전달한다는 것은 변수 (값 유형 또는 참조 유형의 변수 일 수 있음)에 대한 참조를 전달 함을 의미합니다. 값은 복사되지 않으며 호출자와 수신자간에 공유됩니다. 따라서 호출 수신자가 변경 한 사항 (매개 변수에 대한 새 값 할당 포함)은 호출자가 볼 수 있습니다.

    ref또는 out키워드를 사용하여 달리 지정하지 않는 한 모든 매개 변수는 참조 유형을 포함하여 값으로 전달됩니다. 참조 유형의 경우 전달되는 값은 참조이지만 여전히 값으로 전달됩니다.

더 나은 설명을 위해 Jon Skeet의 C #에서 매개 변수 전달 기사를 읽어 보시기 바랍니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Vue가 PHP를 통해 소품으로 전달하는 전체 JSON 객체를 읽지 않는 이유는 무엇입니까?

분류에서Dev

C ++에서 참조로 객체를 전달하기 위해 기본 생성자가 필요한 이유는 무엇입니까?

분류에서Dev

인수로 전달 된 참조가 함수를 통해 변수를 수정하는 데 작동하는 이유는 무엇입니까?

분류에서Dev

JS가 참조로 객체를 푸시하는 이유는 무엇입니까?

분류에서Dev

여기서 참조로 클래스 객체를 전달할 수없는 이유는 무엇입니까?

분류에서Dev

"변수 만 참조로 전달해야합니다"오류가 발생하는 이유는 무엇입니까?

분류에서Dev

Qt 코드의 QChar가 const 참조 대신 값으로 전달되는 이유는 무엇입니까?

분류에서Dev

roslyn을 통해 "로컬 복사"참 참조를 추가하는 방법은 무엇입니까?

분류에서Dev

Kotlin '==='참조 같음 연산자가 동일한 객체 참조에 대해 false를 반환하는 이유는 무엇인가요?

분류에서Dev

벡터가 const 참조로 전달 되었는데도 값으로 전달 된 것처럼 처리되는 이유는 무엇입니까?

분류에서Dev

Android addJavascriptInterface를 통해 Java에서 JS로 비 원시 객체를 전달하는 방법은 무엇입니까?

분류에서Dev

클래스가 객체 참조를 값으로 보유하는 경우 "new"키워드가이를 덮어 쓰지 않는 이유는 무엇입니까?

분류에서Dev

내 INT 변수가 참조로 전달되는 이유는 무엇입니까? 씨#

분류에서Dev

참조로 전달하면 재귀 오류가 수정되는 이유는 무엇입니까?

분류에서Dev

Clippy가 Arc를 참조로 전달하는 것을 제안하는 이유는 무엇입니까?

분류에서Dev

JavaScript 객체 배열을 통해 인수로 함수를 전달하는 방법은 무엇입니까?

분류에서Dev

연산자 + 오버로드가 참조로 전달 되었음에도 불구하고 복사 생성자를 호출하는 이유는 무엇입니까?

분류에서Dev

ARC없이 Xcode에서 스레드를 전환 할 때 내 객체가 자체적으로 할당 해제 된 이유는 무엇입니까?

분류에서Dev

반복 가능한 객체를 먼저 반복자로 변환해야하는 이유는 무엇입니까?

분류에서Dev

ssh를 통해 원격으로 시작할 때 티가 작동하지 않는 이유는 무엇입니까?

분류에서Dev

ssh를 통해 원격으로 시작할 때 티가 작동하지 않는 이유는 무엇입니까?

분류에서Dev

식별 가능한 프로토콜에 대해 self를 참조해야하는 이유는 무엇입니까?

분류에서Dev

두 문자열을 연결하고 인수로 전달해도 새 문자열 객체가 생성되지 않는 이유는 무엇입니까?

분류에서Dev

JavaScript에서 참조로 전달 된 객체에 null을 설정할 수없는 이유는 무엇입니까?

분류에서Dev

map ()에 전달 된 클로저가 참조를받지 않고 filter ()에 전달 된 클로저가 참조를받는 이유는 무엇입니까?

분류에서Dev

lvalue 참조를 통해 rvalue를 수정하는 동작은 무엇입니까?

분류에서Dev

생성자를 통해 전달하여 참조에 임시 값을 할당 할 수있는 이유는 무엇입니까?

분류에서Dev

"new"키워드를 사용할 때 생성 된 객체가 동일한 객체를 참조하는 이유는 무엇입니까?

분류에서Dev

환경 변수를 통해 비밀을 전달하는 것이 "매우 안전하지 않은"것으로 간주되는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    Vue가 PHP를 통해 소품으로 전달하는 전체 JSON 객체를 읽지 않는 이유는 무엇입니까?

  2. 2

    C ++에서 참조로 객체를 전달하기 위해 기본 생성자가 필요한 이유는 무엇입니까?

  3. 3

    인수로 전달 된 참조가 함수를 통해 변수를 수정하는 데 작동하는 이유는 무엇입니까?

  4. 4

    JS가 참조로 객체를 푸시하는 이유는 무엇입니까?

  5. 5

    여기서 참조로 클래스 객체를 전달할 수없는 이유는 무엇입니까?

  6. 6

    "변수 만 참조로 전달해야합니다"오류가 발생하는 이유는 무엇입니까?

  7. 7

    Qt 코드의 QChar가 const 참조 대신 값으로 전달되는 이유는 무엇입니까?

  8. 8

    roslyn을 통해 "로컬 복사"참 참조를 추가하는 방법은 무엇입니까?

  9. 9

    Kotlin '==='참조 같음 연산자가 동일한 객체 참조에 대해 false를 반환하는 이유는 무엇인가요?

  10. 10

    벡터가 const 참조로 전달 되었는데도 값으로 전달 된 것처럼 처리되는 이유는 무엇입니까?

  11. 11

    Android addJavascriptInterface를 통해 Java에서 JS로 비 원시 객체를 전달하는 방법은 무엇입니까?

  12. 12

    클래스가 객체 참조를 값으로 보유하는 경우 "new"키워드가이를 덮어 쓰지 않는 이유는 무엇입니까?

  13. 13

    내 INT 변수가 참조로 전달되는 이유는 무엇입니까? 씨#

  14. 14

    참조로 전달하면 재귀 오류가 수정되는 이유는 무엇입니까?

  15. 15

    Clippy가 Arc를 참조로 전달하는 것을 제안하는 이유는 무엇입니까?

  16. 16

    JavaScript 객체 배열을 통해 인수로 함수를 전달하는 방법은 무엇입니까?

  17. 17

    연산자 + 오버로드가 참조로 전달 되었음에도 불구하고 복사 생성자를 호출하는 이유는 무엇입니까?

  18. 18

    ARC없이 Xcode에서 스레드를 전환 할 때 내 객체가 자체적으로 할당 해제 된 이유는 무엇입니까?

  19. 19

    반복 가능한 객체를 먼저 반복자로 변환해야하는 이유는 무엇입니까?

  20. 20

    ssh를 통해 원격으로 시작할 때 티가 작동하지 않는 이유는 무엇입니까?

  21. 21

    ssh를 통해 원격으로 시작할 때 티가 작동하지 않는 이유는 무엇입니까?

  22. 22

    식별 가능한 프로토콜에 대해 self를 참조해야하는 이유는 무엇입니까?

  23. 23

    두 문자열을 연결하고 인수로 전달해도 새 문자열 객체가 생성되지 않는 이유는 무엇입니까?

  24. 24

    JavaScript에서 참조로 전달 된 객체에 null을 설정할 수없는 이유는 무엇입니까?

  25. 25

    map ()에 전달 된 클로저가 참조를받지 않고 filter ()에 전달 된 클로저가 참조를받는 이유는 무엇입니까?

  26. 26

    lvalue 참조를 통해 rvalue를 수정하는 동작은 무엇입니까?

  27. 27

    생성자를 통해 전달하여 참조에 임시 값을 할당 할 수있는 이유는 무엇입니까?

  28. 28

    "new"키워드를 사용할 때 생성 된 객체가 동일한 객체를 참조하는 이유는 무엇입니까?

  29. 29

    환경 변수를 통해 비밀을 전달하는 것이 "매우 안전하지 않은"것으로 간주되는 이유는 무엇입니까?

뜨겁다태그

보관