문제

내가 만드는 기능을 통과해야하는 개체는 그것에 의해 변경될 수 있습니다.의 차이점은 무엇입:

public void myFunction(ref MyClass someClass)

public void myFunction(out MyClass someClass)

는 사용해야 하는 이유?

도움이 되었습니까?

해결책

ref 기능을 입력하기 전에 객체가 초기화되었다고 컴파일러에게 알려줍니다. out 컴파일러에게 객체가 함수 내부에서 초기화 될 것이라고 알려줍니다.

그래서 ref 양방향이고 out 전용입니다.

다른 팁

그만큼 ref 수정자는 다음을 의미합니다.

  1. 값은 이미 설정되어 있습니다
  2. 이 방법은 그것을 읽고 수정할 수 있습니다.

그만큼 out 수정자는 다음을 의미합니다.

  1. 값은 설정되지 않았으며 방법으로 읽을 수 없습니다. ~까지 설정되었습니다.
  2. 방법 ~ 해야 하다 돌아 오기 전에 설정하십시오.

TPS 보고서에 대한 메모에 대해 Dom이 Peter 's Cubicle에 나타 났다고 가정 해 봅시다.

Dom이 Ref 주장이라면, 그는 메모의 사본을 인쇄 할 것입니다.

돔이 논쟁이된다면, 그는 베드로가 그와 함께 가져갈 수 있도록 새로운 메모 사본을 인쇄하게 만들 것입니다.

내가 내 손을 시도 설명:

내 생각에는 우리가 방법을 이해하는 값이 유형이 바로 작동?가치 유형(int,long,구조체 etc.).를 보낼 때에는 기능이 없 ref 명령을 복사 데이터.당신이 아무것도하는 데이터 함수에서만 영향을 미치는 복사,지 않는다.Ref 명령을 보낸 실제적인 데이터와 어떤 변화에 영향을 미칠 것이 데이터를 외부의 함수입니다.

에서 확인하는 고네스 골프 클럽 및 파리 르 부르제,reference 유형:

을 만들 수 있습 reference 유형:

List<string> someobject = new List<string>()

할 때 새로운대 someobject, 두 부분이 만들어집니다.

  1. 블록의 메모리 데이터를 보유한 someobject.
  2. 참조()를 포함하는 블록 데이터이다.

지금 보낼 때에 someobject 으로 방법 없이는 심판이 그것을 복사 reference 포인터,데이터는 제외됩니다.그래서 당신은 지금 this:

(outside method) reference1 => someobject
(inside method)  reference2 => someobject

두 가지 참조를 가리키는 동일한 개체입니다.을 수정할 경우 속성 someobject 사용 reference2 에 영향을 미칠 것 같은 데이터가 가리키는 reference1.

 (inside method)  reference2.Add("SomeString");
 (outside method) reference1[0] == "SomeString"   //this is true

는 경우 null out reference2 거나 새로운 데이터에 영향을 미치지 않을 것이다 reference1 데이터 reference1 합니다.

(inside method) reference2 = new List<string>();
(outside method) reference1 != null; reference1[0] == "SomeString" //this is true

The references are now pointing like this:
reference2 => new List<string>()
reference1 => someobject

지금 어떻게 보내는 경우 someobject 여 심판하는 방법은?이 실제 참조 하기 someobject 로 전송하는 방법입니다.그래서 지금 당신이 하나만 있을 참조 데이터:

(outside method) reference1 => someobject;
(inside method)  reference1 => someobject;

하지만 이것은 무엇을 의미합니까?그것은 역할 정확히 동일로 보내 someobject 지 심판을 제외하고는 두 가지 주요 일:

1)When you null 참조 안에,그 방법을 것입니다 null 하나 밖의 방법입니다.

 (inside method)  reference1 = null;
 (outside method) reference1 == null;  //true

2)할 수 있는 이점을 참조하는 완전히 다른 데이터 위치 기준 외부 기능이 지금 지점에 새로운 데이터를 위치에 있습니다.

 (inside method)  reference1 = new List<string>();
 (outside method) reference1.Count == 0; //this is true

심판이 있습니다 그리고 밖으로.

당신은 사용해야합니다 out 귀하의 요구 사항에 충분한 곳이면 어디든 선호합니다.

밖으로:

C#에서 메소드는 하나의 값만 리턴 할 수 있습니다. 둘 이상의 값을 반환하려면 Out Keyword를 사용할 수 있습니다. Out Modifier는 회의별로 반환합니다. 가장 간단한 대답은 키워드 "out"이 메소드에서 값을 얻는 데 사용된다는 것입니다.

  1. 호출 함수의 값을 초기화 할 필요가 없습니다.
  2. 호출 된 함수에 값을 할당해야합니다. 그렇지 않으면 컴파일러가 오류를보고합니다.

ref :

C#에서는 int, float, double 등과 같은 값 유형을 전달할 때 메소드 매개 변수에 대한 인수로서 값으로 전달됩니다. 따라서 매개 변수 값을 수정하면 메소드 호출에서 인수에 영향을 미치지 않습니다. 그러나 매개 변수를 "Ref"키워드로 표시하면 실제 변수에 반영됩니다.

  1. 함수를 호출하기 전에 변수를 초기화해야합니다.
  2. 메소드에서 ref 매개 변수에 값을 할당하는 것은 필수가 아닙니다. 값을 변경하지 않으면 값을 "Ref"로 표시해야 할 필요성은 무엇입니까?

개를 확장하는 고양이 예제. ref의 두 번째 방법은 발신자가 참조한 객체를 변경합니다. 따라서 "고양이"!!!

    public static void Foo()
    {
        MyClass myObject = new MyClass();
        myObject.Name = "Dog";
        Bar(myObject);
        Console.WriteLine(myObject.Name); // Writes "Dog". 
        Bar(ref myObject);
        Console.WriteLine(myObject.Name); // Writes "Cat". 
    }

    public static void Bar(MyClass someObject)
    {
        MyClass myTempObject = new MyClass();
        myTempObject.Name = "Cat";
        someObject = myTempObject;
    }

    public static void Bar(ref MyClass someObject)
    {
        MyClass myTempObject = new MyClass();
        myTempObject.Name = "Cat";
        someObject = myTempObject;
    }

참조 유형 (클래스)을 통과하기 때문에 사용할 필요가 없습니다. ref 기본적으로 만 a 참조 실제 객체로 전달되므로 항상 참조 뒤에 객체를 변경합니다.

예시:

public void Foo()
{
    MyClass myObject = new MyClass();
    myObject.Name = "Dog";
    Bar(myObject);
    Console.WriteLine(myObject.Name); // Writes "Cat".
}

public void Bar(MyClass someObject)
{
    someObject.Name = "Cat";
}

수업을 통과하는 한 사용할 필요가 없습니다. ref 메소드 내부의 객체를 변경하려면

ref 그리고 out 다음 차이를 제외하고 비슷하게 행동하십시오.

  • ref 사용하기 전에 변수를 초기화해야합니다. out 변수는 할당없이 사용할 수 있습니다
  • out 매개 변수는 그것을 사용하는 함수에 의해 할당되지 않은 값으로 취급되어야합니다. 따라서 초기화를 사용할 수 있습니다 out 호출 코드의 매개 변수이지만 함수가 실행될 때 값이 손실됩니다.

모범으로 배우는 사람들을 위해 (나처럼) 여기에 Anthony Kolesov가 말합니다.

나는 요점을 설명하기 위해 Ref, Out 등의 최소한의 예를 만들었습니다. 나는 모범 사례를 다루는 것이 아니라 차이점을 이해하기위한 예입니다.

https://gist.github.com/2upmedia/6d98a57b68d849ee7091

"빵 굽는 사람"

첫 번째는 문자열 참조를 변경하여 "베이커"를 가리키기 때문입니다. 참조 키워드를 통해 전달했기 때문에 참조를 변경할 수 있습니다 (=> 문자열 참조 참조). 두 번째 호출은 문자열에 대한 참조 사본을 얻습니다.

문자열은 처음에는 일종의 특별한 것 같습니다. 그러나 문자열은 단지 참조 클래스이고 당신이 정의하는 경우

string s = "Able";

그런 다음 S는 "Able"텍스트가 포함 된 문자열 클래스에 대한 참조입니다! 동일한 변수에 대한 또 다른 할당

s = "Baker";

원래 문자열을 변경하지는 않지만 새 인스턴스를 생성하고 S가 해당 인스턴스를 가리 키게합니다!

다음 작은 코드 예제로 시도 할 수 있습니다.

string s = "Able";
string s2 = s;
s = "Baker";
Console.WriteLine(s2);

당신은 무엇을 기대합니까? S2가 원래 인스턴스를 가리키는 반면 S로 참조를 다른 인스턴스로 설정하기 때문에 여전히 "할 수있는"것입니다.

편집 : 문자열도 불변이므로 기존 문자열 인스턴스를 수정하는 메소드 나 속성이 없음을 의미합니다 (문서에서 하나를 찾을 수는 있지만 다음과 같은 핀은 없습니다 :-)). 모든 문자열 조작 메소드 새 문자열 인스턴스를 반환합니다! (그래서 StringBuilder 클래스를 사용할 때 종종 더 나은 성능을 얻는 이유입니다)

심판 ref 매개 변수의 값이 이미 설정되어 있으며 메소드가 읽고 수정할 수 있음을 의미합니다. Ref 키워드를 사용하는 것은 발신자가 매개 변수의 값을 초기화 할 책임이 있다고 말하는 것과 동일합니다.


밖으로 객체의 초기화가 함수의 책임이므로 컴파일러에게 함수가 Out 매개 변수에 할당해야한다고 알려줍니다. 할당되지 않은 상태로 두는 것은 허용되지 않습니다.

밖으로: 반환 명령문은 함수에서 하나의 값만 리턴하는 데 사용할 수 있습니다. 그러나 출력 매개 변수를 사용하면 함수에서 두 값을 반환 할 수 있습니다. 출력 매개 변수는 기준 매개 변수와 같습니다.이 매개 변수는 데이터가 아닌 방법으로 데이터를 전송한다는 점을 제외하고는 참조 매개 변수와 같습니다.

다음 예는 다음을 보여줍니다.

using System;

namespace CalculatorApplication
{
   class NumberManipulator
   {
      public void getValue(out int x )
      {
         int temp = 5;
         x = temp;
      }

      static void Main(string[] args)
      {
         NumberManipulator n = new NumberManipulator();
         /* local variable definition */
         int a = 100;

         Console.WriteLine("Before method call, value of a : {0}", a);

         /* calling a function to get the value */
         n.getValue(out a);

         Console.WriteLine("After method call, value of a : {0}", a);
         Console.ReadLine();

      }
   }
}

ref :참조 매개 변수는 변수의 메모리 위치에 대한 참조입니다. 값 매개 변수와 달리 매개 변수를 참조별로 전달하면 이러한 매개 변수에 대한 새 저장 위치가 생성되지 않습니다. 참조 매개 변수는 방법에 제공되는 실제 매개 변수와 동일한 메모리 위치를 나타냅니다.

C#에서는 Ref 키워드를 사용하여 참조 매개 변수를 선언합니다. 다음 예는 이것을 보여줍니다.

using System;
namespace CalculatorApplication
{
   class NumberManipulator
   {
      public void swap(ref int x, ref int y)
      {
         int temp;

         temp = x; /* save the value of x */
         x = y;   /* put y into x */
         y = temp; /* put temp into y */
       }

      static void Main(string[] args)
      {
         NumberManipulator n = new NumberManipulator();
         /* local variable definition */
         int a = 100;
         int b = 200;

         Console.WriteLine("Before swap, value of a : {0}", a);
         Console.WriteLine("Before swap, value of b : {0}", b);

         /* calling a function to swap the values */
         n.swap(ref a, ref b);

         Console.WriteLine("After swap, value of a : {0}", a);
         Console.WriteLine("After swap, value of b : {0}", b);

         Console.ReadLine();

      }
   }
}

참조를 통과하고 C ++에서와 같이 포인터를 통과하는 것과 같은 Ref and Out은 작동합니다.

심판의 경우, 인수는 선언하고 초기화되어야합니다.

아웃에 대해서는 주장이 선언되어야하지만 초기화되거나 초기화되지 않을 수도 있습니다.

        double nbr = 6; // if not initialized we get error
        double dd = doit.square(ref nbr);

        double Half_nbr ; // fine as passed by out, but inside the calling  method you initialize it
        doit.math_routines(nbr, out Half_nbr);

저작 시간 :

(1) 호출 방법을 만듭니다 Main()

(2) 목록 개체 (참조 유형 객체)를 생성하고 변수에 저장합니다. myList.

public sealed class Program 
{
    public static Main() 
    {
        List<int> myList = new List<int>();

런타임 중 :

(3) 런타임은 #00의 스택에 메모리를 할당하며 주소를 저장하기에 충분히 넓습니다 ( #00 = myList, 변수 이름은 실제로 메모리 위치의 별칭이기 때문에)

(4) 런타임은 메모리 위치 #ff에서 힙에 목록 객체를 만듭니다 (이 모든 주소는 예를 들어 Sakes)

(5) 런타임은 개체의 시작 주소 #ff를 #00에 저장합니다 (또는 단어로, 목록 개체의 참조를 포인터에 저장합니다. myList)

저작 시간으로 돌아 가기 :

(6) 그런 다음 목록 개체를 인수로 전달합니다. myParamList 호출 된 방법에 modifyMyList 새 목록 개체를 할당합니다

List<int> myList = new List<int>();

List<int> newList = ModifyMyList(myList)

public List<int> ModifyMyList(List<int> myParamList){
     myParamList = new List<int>();
     return myParamList;
}

런타임 중 :

(7) 런타임은 호출 된 메소드의 호출 루틴을 시작하고 그 일부로 매개 변수 유형을 확인합니다.

(8) 참조 유형을 찾으면 매개 변수 변수 별칭을 위해 #04의 스택에 메모리를 할당합니다. myParamList.

(9) 그런 다음 값 #ff도 저장합니다.

(10) 런타임은 메모리 위치 #004에서 힙에 목록 개체를 생성하고 #04의 #ff를이 값으로 대체합니다 (또는 원래 목록 개체를 디 렌트 하고이 방법에서 새 목록 개체를 가리 킵니다).

#00의 주소는 변경되지 않았으며 #ff (또는 원본에 대한 참조를 유지합니다. myList 포인터는 방해받지 않습니다).


그만큼 심판 키워드는 (8) 및 (9)에 대한 런타임 코드 생성을 건너 뛰는 컴파일러 지침으로 메소드 매개 변수에 대한 힙 할당이 없음을 의미합니다. 원래 #00 포인터를 사용하여 #ff의 객체에서 작동합니다. 원래 포인터가 초기화되지 않으면 변수가 초기화되지 않으므로 런타임이 불평을 중단합니다.

그만큼 밖으로 키워드는 (9) 및 (10)에서 약간 수정 된 Ref와 거의 동일한 컴파일러 지침입니다. 컴파일러는 인수가 초기화되지 않을 것으로 예상하며 (8), (4) 및 (5)와 계속해서 힙에 객체를 만들고 인수 변수에 시작 주소를 저장합니다. 발고되지 않은 오류가 발생하지 않으며 이전 참조 저장된 참조가 손실됩니다.

그것들은 거의 동일합니다. 유일한 차이점은 Out 매개 변수로 전달하는 변수를 초기화 할 필요가 없으며 REF 매개 변수를 사용하는 메소드를 설정해야한다는 것입니다.

int x;    Foo(out x); // OK 
int y;    Foo(ref y); // Error

Ref 매개 변수는 수정 될 수있는 데이터에 대한 것이며, Out 매개 변수는 이미 무언가에 대한 반환 값을 사용하고있는 함수 (예 : int.rasyparse)의 추가 출력 인 데이터에 대한 것입니다.

아래에서 나는 두 가지를 사용하여 예를 보여 주었다 심판 그리고 밖으로. 이제, 당신은 모두 Ref and Out에 대해 해결 될 것입니다.

내가 댓글을 달 때 언급 된 예에서 // myRefoBj = new myClass {name = "ref outsele ref nall !!"};줄, 오류가 발생합니다 "할당되지 않은 로컬 변수 'MyRefobj'사용", 그러나 그러한 오류는 없습니다 밖으로.

참조를 사용하는 곳: IN 매개 변수로 절차를 호출 할 때 동일한 매개 변수가 해당 Proc의 출력을 저장하는 데 사용됩니다.

사용 장소 : 우리가 매개 변수가없는 절차를 호출 할 때, 동일한 매개 변수를 사용하여 해당 Proc의 값을 반환합니다. 또한 출력에 유의하십시오

public partial class refAndOutUse : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        myClass myRefObj;
        myRefObj = new myClass { Name = "ref outside called!!  <br/>" };
        myRefFunction(ref myRefObj);
        Response.Write(myRefObj.Name); //ref inside function

        myClass myOutObj;
        myOutFunction(out myOutObj);
        Response.Write(myOutObj.Name); //out inside function
    }

    void myRefFunction(ref myClass refObj)
    {
        refObj.Name = "ref inside function <br/>";
        Response.Write(refObj.Name); //ref inside function
    }
    void myOutFunction(out myClass outObj)
    {
        outObj = new myClass { Name = "out inside function <br/>" }; 
        Response.Write(outObj.Name); //out inside function
    }
}

public class myClass
{
    public string Name { get; set; }
} 
 public static void Main(string[] args)
    {
        //int a=10;
        //change(ref a);
        //Console.WriteLine(a);
        // Console.Read();

        int b;
        change2(out b);
        Console.WriteLine(b);
        Console.Read();
    }
    // static void change(ref int a)
    //{
    //    a = 20;
    //}

     static void change2(out int b)
     {
         b = 20;
     }

이 코드를 확인할 수 있습니다. "Ref"를 사용할 때 완전한 차이를 설명합니다.

그러나 "out"을 사용하면 int/string을 초기화하는 것만 큼 두 조건에서 작동하지만 u는 해당 함수의 int/string을 초기화해야합니다.

REF : Ref 키워드는 인수를 참조로 전달하는 데 사용됩니다. 이것은 메소드에서 해당 매개 변수의 값이 변경되면 호출 방법에 반영됩니다. Ref 키워드를 사용하여 전달되는 인수는 호출 메소드로 전달되기 전에 호출 메소드에서 초기화되어야합니다.

OUT : OUT 키워드는 Ref 키워드와 같은 인수를 전달하는 데 사용되지만 값을 할당하지 않고도 인수를 전달할 수 있습니다. OUT 키워드를 사용하여 전달되는 인수는 호출 메소드로 돌아 가기 전에 호출 된 메소드에서 초기화되어야합니다.

public class Example
{
 public static void Main() 
 {
 int val1 = 0; //must be initialized 
 int val2; //optional

 Example1(ref val1);
 Console.WriteLine(val1); 

 Example2(out val2);
 Console.WriteLine(val2); 
 }

 static void Example1(ref int value) 
 {
 value = 1;
 }
 static void Example2(out int value) 
 {
 value = 2; 
 }
}

/* Output     1     2     

메소드 과부하로 참조 및 출력

REF와 OUT은 동시에 과부하하는 방법에 사용할 수 없습니다. 그러나 REF and Out은 런타임에 다르게 처리되지만 컴파일 시간에 동일하게 처리됩니다 (CLR은 Ref and Out을 위해 IL을 생성하는 동안 둘을 구분하지 않습니다).

매개 변수를 수신하는 방법의 관점에서 ref 그리고 out C#은 메소드가 모든 것에 쓸 필요가 있어야합니다. out 반환하기 전에 매개 변수를 가지고 있으며, 그러한 매개 변수로 아무것도하지 않아야합니다. out 매개 변수 또는 글쓰기는 out 다른 방법으로 매개 변수 또는 직접 작성. 다른 언어는 그러한 요구 사항을 부과하지 않습니다. C#로 선언 된 가상 또는 인터페이스 방법은 out 매개 변수는 그러한 매개 변수에 대한 특별한 제한을 부과하지 않는 다른 언어로 재정의 될 수 있습니다.

발신자의 관점에서 C#은 많은 상황에서 메소드를 호출 할 때 가정합니다. out 매개 변수로 인해 전달 된 변수가 먼저 읽지 않고 작성됩니다. 이 가정은 다른 언어로 작성된 방법을 호출 할 때 정확하지 않을 수 있습니다. 예를 들어:

struct MyStruct
{
   ...
   myStruct(IDictionary<int, MyStruct> d)
   {
     d.TryGetValue(23, out this);
   }
}

만약에 myDictionary an을 식별합니다 IDictionary<TKey,TValue> C#이외의 언어로 작성된 구현이지만 MyStruct s = new MyStruct(myDictionary); 과제처럼 보이면 잠재적으로 떠날 수 있습니다 s 수정되지 않은.

VB.NET로 작성된 생성자는 C#에있는 것과는 달리 호출 된 메소드가 수정 될지 여부에 대한 가정을하지 않습니다. out 매개 변수 및 모든 필드를 무조건 지우십시오. 위에서 언급 한 홀수 동작은 전적으로 VB 또는 C#에 전적으로 작성된 코드로 발생하지 않지만 C#에 작성된 코드가 vb.net에 작성된 메소드를 호출 할 때 발생할 수 있습니다.

매개 변수를 Ref로 전달하려면 매개 변수를 함수로 전달하기 전에 초기화해야합니다. 그렇지 않으면 컴파일러 자체가 오류가 표시되지만 매개 변수의 경우 객체 매개 변수를 초기화 할 필요가 없습니다. 메소드. 호출 메소드 자체에서 객체를 초기화 할 수 있습니다.

뿐만 아니라 당신을 허용 할당을 다른 사람의 변수를 다른 클래스의 인스턴스,여러 값을 반환하는 등, refout 할 수 있습 다른 사람을 알아에서 필요한 것이 그들고 당신은 무엇으로 하는 것을 예정하는 변수들은 제공

  • 당신 할 필요가 없 refout 모든 경우에 당신이해야 할 수정하는 것 MyClass 인스턴스를 통해 전달되는 인수 someClass.

    • 호출하는 방법은 변화를 볼 수처 someClass.Message = "Hello World" 사용 여부 ref, out 또는 아무것도
    • someClass = new MyClass()myFunction(someClass) 환 개체 보 someClass 의 범위 내에서 myFunction 방법니다.호출하는 방법도에 대한 원 MyClass 인스턴스를 만들었고 전달하는 방법
  • 당신 refout 계획인 경우에는 교환 someClass 대한 완전히 새로운 개체고 원하는 호출하는 방법의 변경

    • someClass = new MyClass()myFunction(out someClass) 변경 사항체에 의해 볼 수 있는 방법을 불 myFunction

다른 존재하는 프로그래머

고 그들은 알고 싶은 당신이 무엇을 하는 데 있습니다.상상을 작성된 라이브러리에 의해 사용됩니다 수백만의 개발자입니다.당신은 그들이 원하는 무엇을 할 것인지의 변수를 호출할 때의 방법

  • ref 문의"전달 변수를 할당하여 어떤 가치를 호출할 때는 내 방법입니다.인식 될 수 있는 변경을 위해 그것을 밖으로 완전히 다른 무언가 과정 동안의 방법입니다.기대하지 않는다 당신의 변수를 가리키는 오래된 개체는 때 내가 완료"

  • out 문의"통과하는 자리 표시자 변수 내 방법입니다.지 그 값이나컴파일러를 할당하는 새로운 값입니다.나는 절대적으로 보장하는 개체에 의해 지정된 변수하기 전에 당신은 내 방법 다른 시간에 의해 나는 끝났어요

여 C#에서 7.2 가 in modifier 도

고를 방지하는 방법에서 교환된 인스턴스에 대한 다른 인스턴스입니다.의 생각처럼 말하는 그는 수백만의 개발자가"나를 원본 변수를 참조,그리고 약속하지 않을 교환하게 데이터를 다른 것". in 는 다음과 같은 특이점이 있습니다,그리고 일부 경우에는 같은 곳으로는 암시적으로 변환이 필요할 수 있습의 짧은 호환 in int 컴파일러에 일시적으로 int,넓은 당신의 짧은,그것을 참조로 전달할 마무리.그것은 이것을 할 수 있기 때문에 당신이 선언하지 않겠다는 엉망으로 그것.


Microsoft 았다는 이와 .TryParse 는 방법에 숫자 형식은:

int i = 98234957;
bool success = int.TryParse("123", out i);

신고하여 매개변수 out 그들은 적극적으로 선언하면 여기서"우리는 를 변경하려 근면하게 만들어진 값의 98234957 위해 뭔가 다른"

물론 그들은 좀가,같은 것들에 대한 구문 분석 값이 유형이기 때문에면 분석 방법은 허용되지 않으로 교체 가치 유형을 위해 뭔가 다른 그것은 작동하지 않을 것이 매우 잘..하지만 상상이 있었다 어떤 가상의 방법에 당신은 라이브러리를 만들기:

public void PoorlyNamedMethod(out SomeClass x)

당신이 볼 수있는 그것의 out, 할 수 있습 따라서 알고 있는 경우에 당신은 시간을 보내는 숫자를 만드는 완벽한 SomeClass:

SomeClass x = SpendHoursMakingMeAPerfectSomeClass();
//now give it to the library
PoorlyNamedMethod(out x);

었는데,시간의 낭비 모든 그 시간을 만드는 완벽한 클래스입니다.그것은 확실히 될 것 던져 멀리하고 대체 PoorlyNamedMethod

함수 내부에 전달 된 참조 매개 변수가 직접 작동합니다.

예를 들어,

    public class MyClass
    {
        public string Name { get; set; }
    }

    public void Foo()
    {
        MyClass myObject = new MyClass();
        myObject.Name = "Dog";
        Bar(myObject);
        Console.WriteLine(myObject.Name); // Writes "Dog".
    }

    public void Bar(MyClass someObject)
    {
        MyClass myTempObject = new MyClass();
        myTempObject.Name = "Cat";
        someObject = myTempObject;
    }

이것은 고양이가 아니라 개를 쓸 것입니다. 그러므로 당신은 sobject에서 직접 작업해야합니다.

나는 이것에 능숙하지 않을 수도 있지만, 끈은 (기술적으로 참조 유형이고 힙에 살더라도) 참조가 아니라 가치에 의해 전달됩니까?

        string a = "Hello";

        string b = "goodbye";

        b = a; //attempt to make b point to a, won't work.

        a = "testing";

        Console.WriteLine(b); //this will produce "hello", NOT "testing"!!!!

그렇기 때문에 기능의 범위를 벗어나는 변경을 원한다면 Ref가 필요한 이유는 그렇지 않으면 참조를 전달하지 않습니다.

내가 아는 한, 스트러크/값 유형 및 문자열 자체에 대한 참조 만 필요합니다. 문자열은 척하지만 값 유형이 아닌 참조 유형이기 때문입니다.

그래도 나는 완전히 잘못되었을 수 있습니다. 나는 새롭습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top