의 기준 매개 변수와 출력 매개 변수 간의 차이입니다.그물
사이의 차이점은 무엇입니까?ref그리고.out매개 변수.NET? 하나가 다른 하나보다 더 유용할 수 있는 상황은 무엇입니까?하나는 사용할 수 있고 다른 하나는 사용할 수 없는 코드 조각은 무엇입니까?
- 를 의비슷니로 입니다. 유일한 차이점은 변수로 전달하는 변수입니다.out, 를 개매변수초필로요없는지매로 합니다.ref매개 변수는 어떤 것으로 설정되어야 합니다.
int x;
Foo(out x); // OK
int y;
Foo(ref y); // Error: y should be initialized before calling the method
Ref 변수는될 수 입니다.out에 대한 예: 파미터는함대예추데대것한에입니다터이인력출가한수라에예▁that:(▁param것입다:int.TryParse이미 어떤 것에 대한 반환 값을 사용하고 있습니다.
C#에 'ref'와 'out'이 모두 있는 이유는 무엇입니까?
out 매개 변수를 가져오는 메서드의 호출자는 호출 전에 out 매개 변수로 전달된 변수에 할당할 필요가 없지만, 호출자는 반환 전에 out 매개 변수에 할당해야 합니다.
대조적으로 기준 파라미터는 처음에 호출자가 할당한 것으로 간주됩니다.따라서, 사용하기 전에 수신자가 ref 파라미터에 할당할 필요가 없습니다.기준 매개변수는 메서드 내부와 외부로 모두 전달됩니다.
그렇게,out는 의미이지만, 반면에ref출입용입니다.
이것들은 다음과 밀접하게 일치합니다.[out]그리고.[in,out]COM 변수, COM의 은 다음과 같습니다out매개 변수는 호출 중인 메서드에 의해 필요하지 않은 경우에 미리 할당된 개체를 호출자가 전달할 필요가 없다는 것입니다. 이렇게 하면 할당 비용과 마셜링과 관련된 모든 비용이 방지됩니다(COM과 함께 더 가능성이 높지만 에서 흔하지는 않습니다). NET).
ref그리고.out둘 다 호출된 메서드에서 매개 변수를 수정할 수 있습니다.그들 사이의 차이점은 당신이 전화를 걸기 전에 일어나는 것입니다.
ref함수로 들어가기 전에 매개 변수에 값이 있음을 의미합니다.호출된 함수는 언제든지 값을 읽거나 변경할 수 있습니다.매개 변수가 들어갔다가 나옵니다.out함수로 들어가기 전에 매개 변수에 공식 값이 없음을 의미합니다.호출된 함수가 초기화해야 합니다.매개 변수만 꺼집니다.
가장 과 같습니다: 제가가장좋관는다점같음다습니과은아하다▁here같.ref변수를 기준으로 전달하는 것입니다. out함수에 대한 2차 반환 값을 선언하는 것입니다.당신이 이것을 쓸 수 있다면:
// This is not C#
public (bool, string) GetWebThing(string name, ref Buffer paramBuffer);
// This is C#
public bool GetWebThing(string name, ref Buffer paramBuffer, out string actualUrl);
다음은 각 대안의 효과에 대한 자세한 목록입니다.
메서드를 호출하기 전에:
ref호출자는 호출된 메서드에 전달하기 전에 매개 변수 값을 설정해야 합니다.
out호출자 메소드는 메소드를 호출하기 전에 인수 값을 설정할 필요가 없습니다.아마도, 당신은 하지 말아야 할 것입니다.실제로 현재 값은 모두 삭제됩니다.
통화 중:
ref호출된 메서드는 언제든지 인수를 읽을 수 있습니다.
out호출된 메서드는 매개 변수를 읽기 전에 초기화해야 합니다.
원격 통화:
ref현재 값은 원격 호출로 마샬링됩니다.추가 성능 비용.
out원격 호출에 전달되는 항목이 없습니다.빠른.
엄밀히 말하면, 당신은 항상 사용할 수 있습니다.ref신에를 out,그렇지만out인수의 의미에 대해 더 정확하게 설명할 수 있으며, 때로는 훨씬 더 효율적일 수 있습니다.
OUT의 예 : 변수는 메서드로 이동한 후 값이 초기화됩니다.나중에 동일한 값이 주 방법으로 반환됩니다.
namespace outreftry
{
class outref
{
static void Main(string[] args)
{
yyy a = new yyy(); ;
// u can try giving int i=100 but is useless as that value is not passed into
// the method. Only variable goes into the method and gets changed its
// value and comes out.
int i;
a.abc(out i);
System.Console.WriteLine(i);
}
}
class yyy
{
public void abc(out int i)
{
i = 10;
}
}
}
출력:
10
===============================================
Ref의 예: 변수는 메소드로 들어가기 전에 초기화되어야 합니다.나중에 동일한 값 또는 수정된 값이 주 메서드로 반환됩니다.
namespace outreftry
{
class outref
{
static void Main(string[] args)
{
yyy a = new yyy(); ;
int i = 0;
a.abc(ref i);
System.Console.WriteLine(i);
}
}
class yyy
{
public void abc(ref int i)
{
System.Console.WriteLine(i);
i = 10;
}
}
}
출력:
0 10
=================================
이제 맑았으면 좋겠네요.
- A
ref변수를 전달하기 전에 변수를 초기화해야 합니다. - 안 안
out. out매개 변수는 추가 반환 변수로 생각할 수 있습니다(입력이 아님).ref파라미터는 입력 변수와 출력 변수 모두로 생각할 수 있습니다.
참조 및 출력 매개 변수:
그out 리고그고.ref모수는 메서드의 인수로 전달하는 동일한 변수의 값을 반환하는 데 사용됩니다.이 두 모수는 메서드가 둘 이상의 값을 반환해야 하는 경우에 매우 유용합니다.
척도 메서드 본문의 out 매개 변수에 값을 할당해야 합니다. 그렇지 않으면 메서드가 컴파일되지 않습니다.
Ref Parameter : Method로 전달하기 전에 초기화되어야 합니다.그
ref메서드 매개 변수의 키워드를 사용하면 메서드가 동일한 메서드에 대한 입력 매개 변수로 전달된 동일한 변수를 참조합니다.변수를 변경하면 변수에 반영됩니다.int sampleData = 0; sampleMethod(ref sampleData);
기준 매개변수의 Ex
public static void Main()
{
int i = 3; // Variable need to be initialized
sampleMethod(ref i );
}
public static void sampleMethod(ref int sampleData)
{
sampleData++;
}
Out Parameter : Method로 전달하기 전에 초기화할 필요가 없습니다.그
out매개 변수는 메서드의 매개 변수로 전달된 동일한 변수의 값을 반환하는 데 사용할 수 있습니다.매개 변수에 대한 모든 변경 사항이 변수에 반영됩니다.int sampleData; sampleMethod(out sampleData);
Ex of Out 매개 변수
public static void Main()
{
int i, j; // Variable need not be initialized
sampleMethod(out i, out j);
}
public static int sampleMethod(out int sampleData1, out int sampleData2)
{
sampleData1 = 10;
sampleData2 = 20;
return 0;
}
아웃:
C#에서 메서드는 하나의 값만 반환할 수 있습니다.둘 이상의 값을 반환하려면 out 키워드를 사용할 수 있습니다.out 한정자는 return-by-reference로 반환됩니다.가장 간단한 대답은 "out" 키워드를 사용하여 메소드에서 값을 얻는 것입니다.
- 호출 기능에서 값을 초기화할 필요는 없습니다.
- 호출된 함수에 값을 할당해야 합니다. 그렇지 않으면 컴파일러가 오류를 보고합니다.
참조:
C#에서 int, float, double 등의 값 유형을 메서드 매개 변수로 전달하면 값으로 전달됩니다.따라서 매개 변수 값을 수정해도 메서드 호출의 인수에는 영향을 주지 않습니다.그러나 "ref" 키워드로 파라미터를 표시하면 실제 변수에 반영됩니다.
- 함수를 호출하기 전에 변수를 초기화해야 합니다.
- 메서드에서 ref 매개 변수에 값을 할당할 필요는 없습니다.값을 변경하지 않으면 "ref"로 표시할 필요가 있습니까?
함수에서 ref 매개변수를 설정할 필요가 없는 반면 out 매개변수는 함수를 종료하기 전에 값에 바인딩되어야 합니다.전달된 변수는 초기화되지 않고 함수에 전달될 수도 있습니다.
out매개 변수가 출력 매개 변수임을 지정합니다. 즉, 메소드에 의해 명시적으로 설정되기 전까지는 값이 없습니다.
ref값이 메서드 내에서 변경할 수 있는 값을 가진 참조임을 지정합니다.
out" 매변수다음같과방초은기다니법됩화로으는개,▁다▁method"라는 됩니다.ref메서드를 호출하기 전에 매개 변수가 초기화됩니다. 그므로러,out 반환 값인 매차변환 는▁a▁you▁need,▁▁to를 얻기만 됩니다.ref매개 변수는 값을 가져오고 잠재적으로 해당 값의 변경 사항을 반환하는 데 사용됩니다(2차적으로 주 반환 값으로).
ref 키워드는 기준으로 값을 전달하는 데 사용됩니다.(이는 전달된 값이 값 유형 또는 참조 유형이 되는 것을 배제하지 않습니다.)out 키워드로 지정된 출력 파라미터는 메서드에서 값을 반환하기 위한 것입니다.
코드의 한 가지 주요 차이점은 메서드 내에서 출력 매개 변수 값을 설정해야 한다는 것입니다.기준 매개 변수의 경우에는 그렇지 않습니다.
자세한 내용은 http://www.blackwasp.co.uk/CSharpMethodParameters.aspx 을 참조하십시오.
안 안out는 매개변입는다니수입니다.ref 특 변 가 있 특 변 수 수 는수가 있는 Out()속성이 추가되었습니다.#가 C#으로 out컴파일러는 매개 변수를 읽기 전에 그리고 메소드가 반환되기 전에 쓰기를 요구합니다.가 C#인 Out()컴파일러는 "임의 변수" 오류를 보고할지 여부를 결정하기 위해 메소드를 호출하기 직전에 변수가 쓰여진 것처럼 가장합니다.다른 .net 언어는 동일한 의미를 사용하지 않으므로 주의하십시오.Out()사용하여 할 수 .out매개 변수는 문제의 변수에 영향을 주지 않습니다.가 변수로 out매개 변수가 확실히 할당되기 전에 C# 컴파일러는 코드를 생성하여 사용하기 전에 어느 시점에서 지워지는지 확인하지만, 이러한 변수가 떠나 스코프로 다시 들어가면 다시 지워진다는 보장은 없습니다.
ref는 아마도 기존 객체를 수정할 것으로 예상되기 때문에 null에서 질식할 것입니다.새 개체를 반환하므로 out은 null을 예상합니다.
out과 ref는 정확히 동일하지만 out 변수는 심연으로 보내기 전에 초기화할 필요가 없습니다.저는 그렇게 똑똑하지 않습니다, MSDN 라이브러리에서 크립팅했습니다 :).
그러나 이들 변수의 사용에 대해 좀 더 명확하게 설명하자면, 코드에서 해당 변수의 참조를 변경하면 out 및 ref가 호출 변수의 참조도 변경된다는 의미입니다.아래 코드에서 ceo 변수는 doStuff에 대한 호출에서 돌아오면 새로운 Guy에 대한 참조가 될 것입니다.참조(또는 아웃)가 없었다면 참조는 변경되지 않았을 것입니다.
private void newEmployee()
{
Person ceo = Person.FindCEO();
doStuff(ref ceo);
}
private void doStuff(ref Person employee)
{
Person newGuy = new Person();
employee = newGuy;
}
C#의 출력 및 참조 매개 변수에는 몇 가지 좋은 예가 있습니다.
요약된 기본적인 차이점은out전달 시 매개 변수를 초기화할 필요가 없는 반면, 참조 매개 변수는 초기화할 필요가 없습니다.
그들은 미묘하게 다릅니다.
안 안out메서드에 전달되기 전에 호출자가 매개 변수를 초기화할 필요가 없습니다. 따서갖, 다을모방이 있는 out
- 매개 변수에 값을 할당하기 전에 매개 변수를 읽을 수 없습니다.
- 반환하기 전에 값을 할당해야 합니다.
이 값은 이전 값에 관계없이 인수를 덮어써야 하는 메서드에 사용됩니다.
A ref매개 변수는 메서드에 전달하기 전에 호출자에 의해 초기화되어야 합니다. 따서갖, 다을모방이 있는 ref
- 값을 할당하기 전에 검사할 수 있습니다.
- 원래 값을 그대로 반환할 수 있습니다.
이는 값을 검사하고 유효성을 검사하거나 정규화해야 하는 방법에 사용됩니다.
out은 C#7 https://learn.microsoft.com/en-us/dotnet/articles/csharp/whats-new/csharp-7#more-expression-bodied-members 에서 새로운 succint 구문을 얻었으며, 훨씬 더 흥미로운 것은 ref and out IMHO를 사용하는 것보다 더 우아한 선택인 C#7 튜플 향상입니다.
언급URL : https://stackoverflow.com/questions/135234/difference-between-ref-and-out-parameters-in-net
'codememo' 카테고리의 다른 글
| WPF에 "All Children loaded" 이벤트가 있습니까? (0) | 2023.05.03 |
|---|---|
| OS X에서 환경 변수 설정 (0) | 2023.05.03 |
| 설명에서 Enum 특성 가져오기 (0) | 2023.05.03 |
| C#에서 메서드 그룹이란 무엇입니까? (0) | 2023.05.03 |
| 브라우저에서 Azure Blob Storage에 직접 파일을 업로드하시겠습니까? (0) | 2023.05.03 |