C#에서 ref, out 및 in 키워드의 사용법은 무엇입니까?

WBOY
풀어 주다: 2023-09-18 12:45:03
앞으로
776명이 탐색했습니다.

C# 中 ref、out 和 in 关键字的用法是什么?

C#에서 대부분의 메서드에는 메서드에 제공해야 하는 데이터를 정의하는 0개 이상의 매개 변수가 있을 수 있습니다. 메서드를 호출하는 모든 코드는 데이터(매개변수라고 함)를 메서드에 전달해야 합니다. 메서드는 입력을 매개 변수로 선언하고 호출 코드에서 매개 변수로 제공됩니다.

예를 들어 다음 메서드와 후속 메서드 호출을 고려해 보세요.

static void Greet(string greeting){
   Console.WriteLine(greeting);
}
...
Greet("Hello");
로그인 후 복사

위의 예에서 Greeting은 Greet() 메서드의 매개 변수이고 "Hello"는 메서드에 전달되는 매개 변수입니다.

메서드를 호출하고 인수를 전달하면 값으로 전달됩니다. 즉, 메서드에 전달될 때 값의 복사본이 생성됩니다. 메서드 내부의 매개 변수에 대한 변경 사항은 원래 변수에 반영되지 않습니다.

using System;
int number = 8;
Increase(number);
Console.WriteLine(number); // prints 8
static void Increase(int num){
   num = num + 1;
   Console.WriteLine(num); // prints 9
}
로그인 후 복사

참조 유형 변수(예: 개체)를 전달하면 변수가 실제 개체가 아닌 참조를 보유하므로 C#은 여전히 ​​reference를 값으로 복사합니다. 따라서 참조 변수의 복사본을 전달하더라도 모두 메모리의 동일한 개체를 참조합니다. 따라서 메서드 내부의 변수에 의해 개체에 적용된 모든 변경 사항은 메서드 외부의 변수에 표시됩니다.

using System;
var john = new User{
   Name = "John",
   Salary = 50000
};
Promote(john);
Console.WriteLine(john.Salary); // prints 60000
static void Promote(User u){
   u.Salary += 10000;
   Console.WriteLine(u.Salary); // prints 60000
}
로그인 후 복사

하지만 메소드 내부에서 변수 자체의 값을 변경하면 실제 객체가 아닌 복사본만 변경되기 때문에 메소드 외부에는 변경 사항이 반영되지 않습니다. 예를 들어 메서드 내에서 매개변수를 null에 할당하면 실제 변수는 변경되지 않고 그대로 유지됩니다.

using System;
var john = new User{
   Name = "John",
   Salary = 50000
};
Promote(john);
Console.WriteLine(john.Salary); // prints 50000
static void Promote(User u){
   u = null;
}
로그인 후 복사

C#에서는 세 가지 다른 수정자 키워드를 사용하여 메서드의 매개변수를 제어할 수 있습니다.

ref modifier

C#을 사용하면 ref modifier를 사용하여 참조로 매개변수를 전달할 수 있습니다. 전달되는 변수가 참조 유형인지 값 유형인지는 중요하지 않습니다. 인수와 인수는 동일한 메모리 위치를 참조합니다.

아래 예에서 u 매개 변수를 null로 설정하면 john 변수도 null이 되어 null 참조 예외가 발생합니다.

using System;
var john = new User{
   Name = "John",
   Salary = 50000
};
Promote(ref john);
Console.WriteLine(john.Salary); // throws System.NullReferenceException
static void Promote(ref User u){
   u = null;
}
로그인 후 복사

ref 수정자를 사용하여 전달된 매개변수는 전달하기 전에 초기화되어야 합니다.

out 수정자

다음을 제외하면 ref 수정자와 유사합니다.

  • 매개변수는 함수에 들어가기 전에 초기화할 필요가 없습니다.

  • 매개변수는 함수에서 나오기 전에 초기화(할당)되어야 합니다

다음 예에서 Hire 함수는 out 수정자를 통해 전달된 새 사용자 개체를 초기화합니다. Hire 메소드가 호출될 때 변수 john이 즉시 선언된다는 점에 유의하십시오.

using System;
Hire(out User john);
Console.WriteLine(john.Salary); // prints 50000
static void Hire(out User u){
   u = new User{
      Name = "John",
      Salary = 50000
   };
}
로그인 후 복사

ref 수정자와 마찬가지로 out 수정자로 표시된 변수는 참조로 전달됩니다.

일반적으로 out > 변수는 아래와 같은 함수에서 여러 반환 값을 가져오는 데 사용됩니다. -

using System;
var john = new User{
   Name = "John",
   Salary = 50000
};
bool shouldPromote = Raise(john.Salary, out double hike);
Console.WriteLine(shouldPromote); // True
Console.WriteLine($"Hike Amount = {hike}"); // prints 5000
static bool Raise(int salary, out double hike){
   hike = salary * 0.1;
   return hike < 7000;
}
로그인 후 복사

in 수정자

refout 매개변수와 유사하지만 차이점은 을 허용한다는 것입니다. in 매개변수 메서드는 이 매개변수의 값을 수정할 수 없습니다. 수정을 시도하면 C# 컴파일러에서 컴파일 타임 오류가 발생합니다.

in매개변수는 객체가 실수로 수정되는 것을 방지하면서 큰 값 유형의 메모리를 매개변수 변수에 복사하는 것을 방지할 수 있습니다. 이는 큰 값 유형을 메소드에 전달할 때 유용합니다.

var point = new Coord();
Verify(point);
static void Verify(in Coord c){
   // error: Cannot assign to variable &#39;in Coord&#39; because it is a readonly variable
   c = new Coord();
}
struct Coord{
   public int X;
   public int Y;
}
로그인 후 복사

실시간 시연

using System;
class Program{
   static void Main(){
      int number = 8;
      Increase(number);
      Console.WriteLine(number); // prints 8
      var john = new User { Name = "John", Salary = 50000 };
      Promote(john);
      Console.WriteLine(john.Salary); // prints 60000
      Leave(john);
      Console.WriteLine(john.Salary); // prints 60000

      LeaveByRef(ref john);
      Console.WriteLine(john?.Salary); // prints nothing

      User dave;
      Hire(out dave);
      Console.WriteLine(dave.Salary); // prints 50000
   }
   static void Increase(int num){
      num = num + 1;
      Console.WriteLine(num); // prints 9
   }
   static void Promote(User u){
      u.Salary += 10000;
      Console.WriteLine(u.Salary); // prints 60000
   }
   static void Leave(User u){
      u = null;
   }
   static void LeaveByRef(ref User u){
      u = null;
   }
   static void Hire(out User u){
      u = new User{
         Name = "John",
         Salary = 50000
      };  
   }
}
class User{
   public string Name { get; set; }
   public int Salary { get; set; }
}
로그인 후 복사

출력

9
8
60000
60000
60000
50000
로그인 후 복사

위 내용은 C#에서 ref, out 및 in 키워드의 사용법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:tutorialspoint.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!