vs ref vs out에서 사용하는 경우


383

다른 날에 매개 변수 키워드 out대신을 사용해야한다고 누군가에게 물었습니다 ref. 필자는 ( ref와) out키워드 ( 이전요청 된 )의 차이점을 이해하지만 가장 좋은 설명은 ref== in및 것으로 보이지만 out, 항상 사용해야 out하고 사용 하지 않아야하는 (가설 또는 코드) 예제는 무엇입니까 ref?

ref더 일반적 이기 때문에 왜 사용하고 싶 out습니까? 그것은 단지 구문 설탕인가?


18
사용으로 전달 된 변수는 out할당되기 전에 읽을 수 없습니다. ref이 제한이 없습니다. 그게 있습니다.
Corey Ogburn

17
요컨대, 인 ref/ 아웃 용 out이며 아웃-아웃 매개 변수입니다.
Tim S.

3
정확히 무엇을 얻지 못합니까?
tnw

4
또한 out함수에 변수를 할당해야합니다.
Corey Ogburn

고마워 코리. 그러나 나는 이미 그렇지 않습니다. 내 요점은 이것의 장점은 무엇입니까. 실제로 매개 변수를 사용하여 달성 할 수없는 기능을 달성하기 위해 ref 매개 변수를 사용할 수있는 시나리오를 보여주는 예제가 필요합니다.
Rajbir Singh

답변:


399

당신은 사용해야 out당신이 필요로하지 않는 ref.

예를 들어 다른 프로세스와 같이 데이터를 마샬링해야 할 때 큰 차이가 생겨 비용이 많이들 수 있습니다. 따라서 메소드가 값을 사용하지 않을 때 초기 값을 마샬링하는 것을 피하고 싶습니다.

그 외에도, 선언의 독자 나 초기 값이 관련성이 있는지 (또는 잠재적으로 보존되어 있는지) 버리는 지 표시합니다.

사소한 차이로 out 매개 변수를 초기화 할 필요가 없습니다.

out:

string a, b;
person.GetBothNames(out a, out b);

여기서 GetBothNames는 두 개의 값을 원자 적으로 검색하는 방법이며 a와 b가 무엇이든 동작을 변경하지 않습니다. 호출이 하와이의 서버로 이동하면 여기에서 초기 값을 하와이로 복사하는 것은 대역폭 낭비입니다. 심판을 사용하는 비슷한 발췌 문장 :

string a = String.Empty, b = String.Empty;
person.GetBothNames(ref a, ref b);

a와 b의 초기 값이 관련이있는 것처럼 보이기 때문에 독자를 혼동시킬 수 있습니다 (메소드 이름이 그렇지 않다는 것을 나타내더라도).

ref:

string name = textbox.Text;
bool didModify = validator.SuggestValidName(ref name);

여기서 초기 값은 방법과 관련이 있습니다.


5
"그렇지 않다." -무슨 뜻인지 더 잘 설명해 주시겠습니까?
peterchen

3
ref기본값 으로 사용하고 싶지 않습니다 .
C.Evenhuis

155
후손의 경우 : 여기에 언급 된 바와 같이, 아무도 언급하지 않은 다른 차이점이 있습니다 . 에 대한 out매개 변수, 호출 방법이 필요한 메소드가 리턴하기 전에 값을 할당 할 수 있습니다. - 당신은하지 않습니다 REF 파라미터에 아무것도 할 수 있습니다.
brichins

3
@brichins 귀하가 언급 한 링크 에서 '의견 (커뮤니티 추가)'섹션을 참조하십시오 . VS 2008 설명서에서 수정 된 오류입니다.
Bharat Ram V

13
@brichins 호출 메소드가 아닌 값을 지정하려면 호출 된 메소드가 필요합니다. zverev.eugene 이것은 VS 2008 설명서에서 수정되었습니다.
Segfault

72

매개 변수가 사용 중이 아님을 나타 내기 위해 사용하십시오. 이렇게하면 호출자가 항상 매개 변수를 초기화하고 있음을 이해하는 데 도움이됩니다.

또한 ref 및 out은 값 유형만을위한 것이 아닙니다. 또한 메소드 내에서 참조 유형이 참조하는 오브젝트를 재설정 할 수 있습니다.


3
+1 나는 그것이 참조 유형에도 사용될 수 있다는 것을 몰랐다. 좋은 대답, 감사
Dale

@brichins : 아닙니다. out매개 변수는 함수 진입시 할당되지 않은 것으로 처리됩니다. 먼저 값을 확실히 할당 할 때까지 값을 검사 할 수 없습니다. 함수가 호출 될 때 매개 변수에 사용 된 값을 전혀 사용할 수있는 방법이 없습니다.
Ben Voigt

내부 할당 이전에는 값에 액세스 할 수 없습니다. 나는 매개 변수 자체 나중에 메소드에서 사용될 있다는 사실을 언급하고있었습니다 -잠겨 있지 않습니다. 이것이 실제로 이루어져야하는지 아닌지는 다른 토론 (디자인에 관한)입니다. 나는 그것이 가능하다는 것을 지적하고 싶었다. 설명해 주셔서 감사합니다.
brichins

2
@ ดาว : 참조 유형 매개 변수를 전달할 때 전달하는 것은 객체 자체가 아닌 참조 값이므로 참조 유형과 함께 사용할 수 있습니다. 따라서 여전히 가치가 있습니다.
Tarik

38

의미 상 ref"입력"기능과 "출력"기능을 모두 제공하는 반면 out"출력"기능 만 제공 한다는 점에서 맞습니다 . 고려해야 할 사항이 있습니다.

  1. out매개 변수를받는 메소드는 리턴하기 전에 어느 시점에서 변수에 값을 지정해야합니다. 와 같은 Dictionary<K,V>기능을 가진 키 / 값 데이터 저장 클래스 중 일부에서이 패턴을 찾을 수 있습니다 TryGetValue. 이 함수는 out검색 될 때 값이 유지 되는 매개 변수를 사용합니다. 이 값을 전달하는 호출자에 대한 이해가되지 것입니다 그래서,이 기능을 out이의 경우 ( "실제"데이터가없는 경우에도 일부 값이 호출 후 변수가 될 것이라는 점을 보증하는 데 사용됩니다 TryGetValue열쇠는 존재하지 않습니다).
  2. outref상호 운용성 코드를 처리 할 때 매개 변수가 다르게 마샬링됩니다

또한 참조 유형과 값 유형은 값의 특성이 다르지만 응용 프로그램의 모든 변수는 참조 유형의 경우에도 값을 보유하는 메모리 위치를 가리 킵니다 . 참조 유형의 경우 메모리의 해당 위치에 포함 된 값이 다른 유형입니다.메모리 위치. 함수에 값을 전달하거나 다른 변수 할당을 수행하면 해당 변수의 값이 다른 변수에 복사됩니다. 값 형식의 경우 형식의 전체 내용이 복사됩니다. 참조 유형의 경우 메모리 위치가 복사됨을 의미합니다. 어느 쪽이든 변수에 포함 된 데이터의 사본을 작성합니다. 이것이 가지고있는 유일한 관련성은 할당 의미론을 다룬다. 변수를 할당하거나 값을 기준으로 전달할 때 (기본값), 원래 (또는 새) 변수에 새를 할당하면 다른 변수에 영향을 미치지 않습니다. 참조 유형의 경우 예, 인스턴스 변경양쪽에서 사용할 수 있지만 실제 변수는 다른 메모리 위치에 대한 포인터 일뿐입니다. 변수의 내용 (메모리 위치)은 실제로 변경되지 않았습니다.

ref키워드 와 함께 전달 하면 원래 변수 함수 매개 변수가 실제로 동일한 메모리 위치를 가리 키게됩니다. 이는 할당 시맨틱에만 영향을 미칩니다. 새 값이 변수 중 하나에 할당되면 다른 값이 동일한 메모리 위치를 가리 키기 때문에 새 값이 다른쪽에 반영됩니다.


1
호출 된 메서드가 out 매개 변수에 값을 할당해야한다는 요구 사항은 기본 IL이 아니라 c # 컴파일러에 의해 적용됩니다. 따라서 VB.NET으로 작성된 라이브러리는 해당 규칙을 준수하지 않을 수 있습니다.
jmoreno

심판과 같은 소리는 실제로 C ++ (*)의 역 참조 기호와 같습니다. C #의 패스 바이 참조는 C / C ++가 이중 포인터 (포인터에 대한 포인터)로 참조하는 것과 동일해야하므로 ref는 첫 번째 포인터를 역 참조해야하므로 호출 된 메소드가 컨텍스트에서 실제 오브젝트의 메모리 위치에 액세스 할 수 있습니다.
ComeIn

실제로 키를 찾지 못하면 명시 적으로 TryGetValue사용 ref하지 말고 올바른 사용을 제안합니다 out.
NetMage

27

컴파일 컨텍스트에 따라 다릅니다 (아래 예 참조).

outref참조로 전달 모두 나타내고 변수 아직 ref마샬링의 맥락에서 중요한 차이가있다 전달되기 전에 초기화되는 변수 요구 (상호 운용성 : UmanagedToManagedTransition 또는 그 반대로)을

MSDN은 다음과 같이 경고합니다 .

참조에 의한 전달 개념과 참조 유형의 개념을 혼동하지 마십시오. 두 개념은 동일하지 않습니다. 메소드 매개 변수는 값 유형인지 참조 유형인지에 관계없이 ref로 수정할 수 있습니다. 참조로 전달 될 때 값 유형의 boxing이 없습니다.

공식 MSDN 문서에서 :

out 키워드는 인수가 참조로 전달되도록합니다. ref는 변수가 전달되기 전에 초기화되어야한다는 점을 제외하고는 ref 키워드와 유사합니다.

ref 키워드는 인수가 값이 아닌 참조로 전달되도록합니다. 참조로 전달하면 메소드의 매개 변수에 대한 변경 사항이 호출 메소드의 기본 인수 변수에 반영됩니다. 참조 매개 변수의 값은 항상 기본 인수 변수의 값과 같습니다.

인수가 할당 될 때 out과 ref가 실제로 동일한 지 확인할 수 있습니다.

CIL 예 :

다음 예를 고려하십시오

static class outRefTest{
    public static int myfunc(int x){x=0; return x; }
    public static void myfuncOut(out int x){x=0;}
    public static void myfuncRef(ref int x){x=0;}
    public static void myfuncRefEmpty(ref int x){}
    // Define other methods and classes here
}

CIL에서의 지침 myfuncOut과는 myfuncRef예상대로 동일하다.

outRefTest.myfunc:
IL_0000:  nop         
IL_0001:  ldc.i4.0    
IL_0002:  starg.s     00 
IL_0004:  ldarg.0     
IL_0005:  stloc.0     
IL_0006:  br.s        IL_0008
IL_0008:  ldloc.0     
IL_0009:  ret         

outRefTest.myfuncOut:
IL_0000:  nop         
IL_0001:  ldarg.0     
IL_0002:  ldc.i4.0    
IL_0003:  stind.i4    
IL_0004:  ret         

outRefTest.myfuncRef:
IL_0000:  nop         
IL_0001:  ldarg.0     
IL_0002:  ldc.i4.0    
IL_0003:  stind.i4    
IL_0004:  ret         

outRefTest.myfuncRefEmpty:
IL_0000:  nop         
IL_0001:  ret         

nop : 작업 없음, ldloc : 로컬로드, stloc : 스택 로컬, ldarg :로드 인수, bs.s : 대상에서 분기로 ....

( CIL 명령어 목록 참조 )


23

아래는 C # Out Vs Ref 의이 코드 프로젝트 기사에서 가져온 참고 사항입니다.

  1. 함수 나 메소드에서 여러 개의 출력을 기대할 때만 사용해야합니다. 구조에 대한 생각도 동일한 옵션이 될 수 있습니다.
  2. REF 및 OUT은 발신자에서 수신자로 또는 그 반대로 데이터가 전달되는 방식을 나타내는 키워드입니다.
  3. REF에서 데이터는 양방향으로 전달됩니다. 발신자에서 수신자로 또는 그 반대로.
  4. In Out 데이터는 수신자로부터 발신자에게 한 방향으로 만 전달됩니다. 이 경우 발신자가 수신자에게 데이터를 보내려고하면 간과 / 거부됩니다.

당신이 시각적 인 사람이라면 실제로 https://www.youtube.com/watch?v=lYdcY5zulXA 의 차이점을 보여주는이 유튜브 비디오를 참조 하십시오

아래 이미지는 차이점을 더 시각적으로 보여줍니다.

C # 출력 대 Ref


1
one-waytwo-way여기 에서 용어가 잘못 사용될 수 있습니다. 그것들은 실제로 양방향이지만, 그들의 개념적 행동은 매개 변수의 참조와 값에서 다릅니다
ibubi

17

ref매개 변수를 읽고 쓰려 는 경우 사용해야 합니다. out작성하려는 경우에만 사용해야 합니다. 실제로, out하나 이상의 반환 값이 필요하거나 출력에 일반 반환 메커니즘을 사용하지 않으려는 경우에 사용됩니다 (그러나 드문 경우 임).

이러한 사용 사례를 지원하는 언어 역학이 있습니다. Ref매개 변수는 메소드에 전달되기 전에 초기화되어야하고 (읽기-쓰기라는 사실에 중점을 두어) out값을 지정하기 전에는 매개 변수를 읽을 수 없으며 마지막에 기록되도록 보장됩니다. 방법 (쓰기 전용이라는 사실에 중점을 둡니다). 이러한 원칙을 위반하면 컴파일 타임 오류가 발생합니다.

int x;
Foo(ref x); // error: x is uninitialized

void Bar(out int x) {}  // error: x was not written to

예를 들어, int.TryParsea를 반환하고 매개 변수를 bool허용합니다 out int.

int value;
if (int.TryParse(numericString, out value))
{
    /* numericString was parsed into value, now do stuff */
}
else
{
    /* numericString couldn't be parsed */
}

숫자 결과와 변환 성공 여부를 나타내는 두 가지 값을 출력해야하는 상황의 명확한 예입니다. CLR의 저자는 이전에 가능했던 out것에 신경 쓰지 않기 때문에 여기 에서 선택하기로 결정했습니다 int.

의 경우 ref다음을 볼 수 있습니다 Interlocked.Increment.

int x = 4;
Interlocked.Increment(ref x);

Interlocked.Increment원자 적으로의 값을 증가시킵니다 x. x증가 시키기 위해 읽어야하므로 ref보다 적절한 상황 입니다. 당신 x은 그것이 전달되기 전에 무엇 에 전적으로 관심 이 Increment있습니다.

다음 버전의 C #에서는 out매개 변수로 변수 를 선언 하여 출력 전용 특성을 더욱 강조 할 수도 있습니다 .

if (int.TryParse(numericString, out int value))
{
    // 'value' exists and was declared in the `if` statement
}
else
{
    // conversion didn't work, 'value' doesn't exist here
}

귀하의 답변에 감사드립니다. 그러나 왜 내가 매개 변수를 읽고 쓸 수 없는지 설명 할 수 있습니까?
Rajbir Singh

@RajbirSingh는 out매개 변수가 반드시 초기화되지 않았으므로 out무언가를 작성할 때까지 컴파일러에서 매개 변수 를 읽을 수 없습니다.
zneak

zneak, 나는 당신과 동의했다. 그러나 아래 예제에서 out 매개 변수는 읽기 및 쓰기로 사용될 수 있습니다. string name = "myName"; private void OutMethod (out string nameOut) {if (nameOut == "myName") {nameOut = "Rajbir Singh in out method"; }}
Rajbir Singh

1
@RajbirSingh, 예제가 컴파일되지 않습니다. 당신은 읽을 수 없습니다 nameOut당신의 if그 전에 아무것도 지정되지 않았기 때문에 문.
zneak

감사합니다 @zneak. 당신은 절대적으로 옳다. 컴파일되지 않습니다. 덕분에 내 도움을 많이 지금은 :) 나에게 의미가 있습니다
Rajbir 싱

7

out더 제약 버전입니다 ref.

메소드 본문에서 메소드 out를 종료하기 전에 모든 매개 변수 에 지정해야합니다 . 또한 out매개 변수에 지정된 값 은 무시되는 반면 값을 지정 ref해야합니다.

따라서 out다음을 수행 할 수 있습니다.

int a, b, c = foo(out a, out b);

여기서 refa와 b를 할당해야합니다.


어떤 것이 든 out덜 제약 된 버전입니다. ref"사전 조건 : 변수가 확실하게 할당 됨, 사후 조건 : 변수가 확실하게 할당 됨", "사후 조건 : 변수가 확실하게 할당 됨" out만 있음 (예상보다 적은 수의 사전 조건을 가진 함수 구현에는 더 많은 것이 필요함)
Ben Voigt

@ BenVoigt : 그것은 당신이보고있는 방향에 달려 있다고 생각합니다 :) 코딩 유연성 (?)의 관점에서 제약을 의미한다고 생각합니다.
leppie

7

소리가 나는 방법 :

아웃 =에만 초기화 / 매개 변수 (파라미터가 비어 있어야합니다)를 반환 채울 밖으로 일반

심판 = 참조, (아마도 값) 표준 매개 변수를하지만, 기능을 modifiy 수 있습니다.


out 매개 변수는 값을 메서드에 전달하기 전에 값을 얻을 수 있습니다.
Bence Végert

6

outcontextual 키워드는 인터페이스와 델리게이트의 매개 변수 수정 자 또는 일반 유형 매개 변수 선언으로 두 가지 컨텍스트 (각각 세부 정보에 대한 링크 임)에서 사용할 수 있습니다 . 이 주제에서는 매개 변수 수정 자에 대해 설명하지만 일반 유형 매개 변수 선언에 대한 정보는이 다른 주제를 볼 수 있습니다.

out키워드 원인 인자는 참조에 의해 전달된다. 변수를 전달하기 전에 초기화해야한다는 ref점을 제외 하면 키워드 와 같습니다 ref. out매개 변수 를 사용하려면 메소드 정의와 호출 메소드 모두 out키워드를 명시 적으로 사용해야합니다 . 예를 들면 다음과 같습니다. C #

class OutExample
{
    static void Method(out int i)
    {
        i = 44;
    }
    static void Main()
    {
        int value;
        Method(out value);
        // value is now 44
    }
}

out인수로 전달 된 변수를 전달 하기 전에 초기화 할 필요는 없지만 호출 된 메소드는 메소드가 리턴되기 전에 값을 지정해야합니다.

refout키워드는 서로 다른 런타임 동작을 유발 하지만 컴파일시 메소드 서명의 일부로 간주되지 않습니다. 따라서 한 방법이 ref인수를 취하고 다른 방법이 인수를 취한다는 점만 다릅니다 out. 예를 들어 다음 코드는 컴파일되지 않습니다. C #

class CS0663_Example
{
    // Compiler error CS0663: "Cannot define overloaded 
    // methods that differ only on ref and out".
    public void SampleMethod(out int i) { }
    public void SampleMethod(ref int i) { }
}

그러나 한 방법이 ref또는 out인수를 사용하고 다른 방법 이 다음과 같이 사용하지 않으면 오버로드를 수행 할 수 있습니다 . C #

class OutOverloadExample
{
    public void SampleMethod(int i) { }
    public void SampleMethod(out int i) { i = 5; }
}

속성은 변수가 아니므로 out매개 변수 로 전달할 수 없습니다 .

배열 전달에 대한 자세한 내용은 refout(C # 프로그래밍 안내서)를 사용하여 배열 전달을 참조하십시오 .

다음과 같은 방법 에는 refout키워드를 사용할 수 없습니다 .

Async methods, which you define by using the async modifier.

Iterator methods, which include a yield return or yield break statement.

out메소드 선언은 메소드가 여러 값을 리턴하도록하려는 경우에 유용합니다. 다음 예제는 out단일 메소드 호출로 세 개의 변수를 리턴 하는 데 사용 됩니다. 세 번째 인수는 null에 할당됩니다. 이를 통해 메소드가 값을 선택적으로 리턴 할 수 있습니다. 씨#

class OutReturnExample
{
    static void Method(out int i, out string s1, out string s2)
    {
        i = 44;
        s1 = "I've been returned";
        s2 = null;
    }
    static void Main()
    {
        int value;
        string str1, str2;
        Method(out value, out str1, out str2);
        // value is now 44
        // str1 is now "I've been returned"
        // str2 is (still) null;
    }
}

6

사용 방법 in이나 out또는 refC #으로?

  • 의 모든 키워드는 C#기능은 동일하지만 일부 경계가 있습니다.
  • in 호출 된 메소드로 인수를 수정할 수 없습니다.
  • ref 인수가 수정 될 수 있습니다.
  • ref 호출자가 사용하기 전에 초기화해야 메소드에서 읽고 업데이트 할 수 있습니다.
  • out 인수는 호출자가 수정해야합니다.
  • out 메소드에서 인수를 초기화해야합니다
  • in인수로 전달변수 는 메소드 호출에 전달되기 전에 초기화해야합니다. 그러나 호출 된 메소드는 값을 지정하거나 인수를 수정할 수 없습니다.

당신은 사용할 수 없습니다 in, ref그리고 out방법의 다음과 같은 종류의 키워드 :

  • async수정자를 사용하여 정의하는 비동기 메소드
  • yield return또는 yield break문 을 포함하는 반복자 메서드

5

OP의 의견을 분명히하기 위해 ref 및 out에서의 사용은 이미 "부정한 방법으로 선언 된 값 유형 또는 구조체에 대한 참조"이며 이미 잘못 설정되어 있습니다.

참조 유형 인 StringBuilder에서 ref 사용을 고려하십시오.

private void Nullify(StringBuilder sb, string message)
{
    sb.Append(message);
    sb = null;
}

// -- snip --

StringBuilder sb = new StringBuilder();
string message = "Hi Guy";
Nullify(sb, message);
System.Console.WriteLine(sb.ToString());

// Output
// Hi Guy

이것에 대해 :

private void Nullify(ref StringBuilder sb, string message)
{
    sb.Append(message);
    sb = null;
}

// -- snip --

StringBuilder sb = new StringBuilder();
string message = "Hi Guy";
Nullify(ref sb, message);
System.Console.WriteLine(sb.ToString());

// Output
// NullReferenceException

4

ref로 전달 된 인수는 메소드로 전달하기 전에 초기화되어야하지만 out 매개 변수는 메소드로 전달하기 전에 초기화되지 않아도됩니다.


4

왜 사용하고 싶습니까?

변수가 호출 된 메소드에서 리턴 될 때 변수가 초기화됨을 다른 사람들에게 알리기 위해!

위에서 언급했듯이 : "out 매개 변수의 경우 호출 메소드는 메소드가을 리턴하기 전에 값을 지정해야합니다 ."

예:

Car car;
SetUpCar(out car);
car.drive();  // You know car is initialized.

4

기본적으로 ref그리고 out메소드간에 객체 / 값을 전달하기 위해

out 키워드는 인수가 참조로 전달되도록합니다. 이는 ref가 변수를 전달하기 전에 초기화해야한다는 점을 제외하고는 ref 키워드와 같습니다.

out : 인수가 초기화되지 않았으며 메소드에서 초기화되어야합니다.

ref : 인수가 이미 초기화되었으며 메소드에서 읽고 업데이트 할 수 있습니다.

참조 유형에 "ref"를 사용하는 것은 무엇입니까?

주어진 참조를 다른 인스턴스로 변경할 수 있습니다.

알고 계십니까?

  1. ref 및 out 키워드는 서로 다른 런타임 동작을 유발하지만 컴파일시 메소드 서명의 일부로 간주되지 않습니다. 따라서 한 방법이 ref 인수를 사용하고 다른 방법이 out 인수를 사용한다는 점만 차이가 있으면 메소드를 오버로드 할 수 없습니다.

  2. 다음과 같은 방법에는 ref 및 out 키워드를 사용할 수 없습니다.

    • 비동기 수정자를 사용하여 정의하는 비동기 메소드.
    • yield return 또는 yield break 문을 포함하는 반복자 메소드.
  3. 속성은 변수가 아니므로 매개 변수로 전달할 수 없습니다.


4

C # 7에 대한 추가 참고 사항 C # 7
에서는 out을 사용하여 변수를 미리 선언 할 필요가 없습니다. 따라서 다음과 같은 코드 :

public void PrintCoordinates(Point p)
{
  int x, y; // have to "predeclare"
  p.GetCoordinates(out x, out y);
  WriteLine($"({x}, {y})");
}

다음과 같이 쓸 수 있습니다 :

public void PrintCoordinates(Point p)
{
  p.GetCoordinates(out int x, out int y);
  WriteLine($"({x}, {y})");
}

출처 : C # 7의 새로운 기능


4

여전히 좋은 요약이 필요하다고 생각하면 이것이 내가 생각해 낸 것입니다.

요약,

함수 안에있을 때 변수 데이터 액세스 제어를 지정하는 방법입니다 .

in = R

out = R 전에 W이어야 함

ref = R + W


설명,

in

함수는 해당 변수 만 읽을 수 있습니다.

out


함수는 반드시 READ 전에 WRITE해야 하기 때문에 변수를 먼저 초기화해서는 안됩니다 .

ref

함수가 해당 변수를 읽거나 쓸 수 있습니다 .


왜 그렇게 지명 되었습니까?

데이터가 수정되는 위치에 초점을 맞추고

in

(입력) 기능을 시작하기 전에 만 데이터를 설정해야합니다.

out

데이터는 기능을 종료하기 전에 만 설정해야합니다.

ref

(입력) 기능을 시작하기 전에 데이터를 설정해야합니다.
기능을 종료하기 전에 데이터를 설정할 수 있습니다.


아마도 (in / out / ref)는 (r / wr / rw)로 이름을 바꿔야합니다. 또는 아마도, 안팎이 더 좋은 은유입니다.
팅커

0

C # 버전 7.2in 에서 유효한 키워드 임을 유의해야합니다 .

in 매개 변수 수정자는 C # 7.2 이상에서 사용할 수 있습니다. 이전 버전에서는 컴파일러 오류 CS8107이 발생합니다 ( "C # 7.0에서는 '읽기 전용 참조 기능'을 사용할 수 없습니다. 언어 버전 7.2 이상을 사용하십시오."). 컴파일러 언어 버전을 구성하려면 C # 언어 버전 선택을 참조하십시오.

...

in 키워드는 인수가 참조로 전달되도록합니다. 형식 매개 변수를 인수의 별명으로 만듭니다. 변수는 변수 여야합니다. 다시 말해, 매개 변수에 대한 조작은 인수에서 수행됩니다. 인수에서 호출 된 메소드로 수정할 수 없다는 점을 제외하면 ref 또는 out 키워드와 같습니다. ref 인수는 수정 될 수 있지만 out 인수는 호출 된 메소드로 수정해야하며 호출 컨텍스트에서 이러한 수정을 관찰 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.