방법: 메서드에 대한 구조체 전달과 클래스 참조 전달 간의 차이점 이해(C# 프로그래밍 가이드)
다음은 구조체를 메서드로 전달할 때는 구조체의 복사본이 전달되나 클래스 인스턴스를 전달할 때는 참조가 전달된다는 사실을 보여 주는 예제입니다.
다음 예제의 출력에서는 클래스 인스턴스가 ClassTaker 메서드로 전달될 때 클래스 필드의 값만이 변경되었음을 보여 줍니다. 그러나 구조체 필드는 인스턴스를 StructTaker 메서드로 전달해도 변경되지 않습니다. 그 이유는 ClassTaker 메서드에는 클래스에 대한 참조가 전달되는 반면 StructTaker 메서드에는 구조체의 복사본이 전달되기 때문입니다.
예제
class TheClass
{
public string willIChange;
}
struct TheStruct
{
public string willIChange;
}
class TestClassAndStruct
{
static void ClassTaker(TheClass c)
{
c.willIChange = "Changed";
}
static void StructTaker(TheStruct s)
{
s.willIChange = "Changed";
}
static void Main()
{
TheClass testClass = new TheClass();
TheStruct testStruct = new TheStruct();
testClass.willIChange = "Not Changed";
testStruct.willIChange = "Not Changed";
ClassTaker(testClass);
StructTaker(testStruct);
Console.WriteLine("Class field = {0}", testClass.willIChange);
Console.WriteLine("Struct field = {0}", testStruct.willIChange);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Class field = Changed
Struct field = Not Changed
*/