programing

문자열은 어떻게 전달됩니까?NET?

linuxpc 2023. 8. 19. 09:56
반응형

문자열은 어떻게 전달됩니까?NET?

가 내가를통때할과▁a▁i때를 통과할 때.string 포인터가되었습니까? 문자열 되었습니까?struct그럴 것 같습니까?

참조는 전달되지만 기술적으로는 참조로 전달되지 않습니다.이것은 미묘하지만 매우 중요한 차이입니다.다음 코드를 고려합니다.

void DoSomething(string strLocal)
{
    strLocal = "local";
}
void Main()
{
    string strMain = "main";
    DoSomething(strMain);
    Console.WriteLine(strMain); // What gets printed?
}

여기서 일어나는 일을 이해하기 위해 알아야 할 세 가지가 있습니다.

  1. 문자열은 C#의 참조 유형입니다.
  2. 그것들은 또한 불변하기 때문에, 여러분이 줄을 바꾸는 것처럼 보이는 것을 할 때마다, 여러분은 그렇지 않습니다.완전히 새로운 문자열이 생성되고, 참조가 해당 문자열을 가리키며, 이전 문자열은 버려집니다.
  3. , 문열이참유불도구고하에형임조자▁even▁are,고,.strMain참조로 전달되지 않습니다.참조 유형이지만 참조 자체가 값으로 전달됩니다.매개변수를 전달할 때마다 매개변수를 지정하지 않습니다.ref)out매개 변수), 값으로 무언가를 전달했습니다.

그러니까 당신은... 값으로 참조를 전달하고 있다는 뜻이겠지요.참조 유형이기 때문에 참조만 스택에 복사되었습니다.하지만 그것은 무엇을 뜻하나요?

값을 기준으로 기준 유형 전달:당신은 이미 그것을 하고 있습니다.

C# 변수는 참조 유형이거나 값 유형입니다.C# 매개 변수는 참조를 통해 전달되거나 값을 통해 전달됩니다.용어는 여기서 문제가 됩니다. 이것들은 같은 것처럼 들리지만 그렇지 않습니다.

임의 유형의 매개 변수를 전달하고 다음을 사용하지 않는 경우ref키워드를 입력하면 값으로 전달됩니다.값으로 통과했다면, 실제로 통과한 것은 사본이었습니다.그러나 매개 변수가 참조 유형인 경우 복사한 것은 참조이지, 가리키는 것이 아닙니다.

여기 첫 번째 줄이 있습니다.Main방법:

string strMain = "main";

이 줄에서 두 가지를 만들었습니다. 값이 있는 문자열입니다.main, 메리어 저있어고장되, 참변같다습다니라는 참조 .strMain그것을 가리키고 있습니다.

DoSomething(strMain);

이제 우리는 그 언급을 에 전달합니다.DoSomething우리는 그것을 가치별로 전달했기 때문에, 그것은 우리가 복사본을 만들었다는 것을 의미합니다.참조 유형이므로 문자열 자체가 아니라 참조를 복사했다는 의미입니다.이제 각각 메모리의 동일한 값을 가리키는 두 개의 참조가 있습니다.

통화자 내부

이것이 가장 중요한 것입니다.DoSomething방법:

void DoSomething(string strLocal)

아니요.ref 워드키, 그서래.strLocal그리고.strMain같은 값을 가리키는 두 개의 서로 다른 참조입니다.재할당하면,strLocal...

strLocal = "local";   

...값은. ...라는 저장된 값은 변경하지 않았습니다. 다음과 같은 참조를 사용했습니다.strLocal그리고 완전히 새로운 끈을 겨냥했습니다.어떻게 됩니까?strMain우리가 그럴 때?아무것도. 그것은 여전히 오래된 끈을 가리키고 있습니다.

string strMain = "main";    // Store a string, create a reference to it
DoSomething(strMain);       // Reference gets copied, copy gets re-pointed
Console.WriteLine(strMain); // The original string is still "main" 

불변성

잠시 상황을 바꿔보겠습니다.우리가 문자열을 사용하는 것이 아니라 당신이 만든 클래스와 같은 변형 가능한 참조 유형을 사용한다고 상상해 보십시오.

class MutableThing
{
    public int ChangeMe { get; set; }
}

만약 당신이 참조를 따른다면,objLocal개체가 가리키는 개체에 대한 속성을 변경할 수 있습니다.

void DoSomething(MutableThing objLocal)
{
     objLocal.ChangeMe = 0;
} 

MutableThing메모리에서 복사된 참조와 원래 참조가 모두 해당 참조를 가리킵니다.자체 속성이 변경되었습니다.

void Main()
{
    var objMain = new MutableThing();
    objMain.ChangeMe = 5; 
    Console.WriteLine(objMain.ChangeMe); // it's 5 on objMain

    DoSomething(objMain);                // now it's 0 on objLocal
    Console.WriteLine(objMain.ChangeMe); // it's also 0 on objMain   
}

입니다!", 하만끈은 불변니다입아지!다▁ah니끈불입변!ChangeMe설정할 속성입니다.은 할 수 요.strLocal[3] = 'H' C 당이로 C 일할수 C 로타있 C 스는것럼 C 처신▁you#▁in C #로▁c▁with.char배열; 대신 완전히 새로운 문자열을 구성해야 합니다.할 수 유일한 은 하는유방법한입니다.strLocal참조를 다른 문자열로 가리키는 것이며, 그것은 당신이 아무것도 하지 않는다는 것을 의미합니다.strLocal영향을 미칠 수 있음strMain값은 불변이며 참조는 복사본입니다.

참조로 참조 전달

차이가 있다는 것을 증명하기 위해 참조를 참조로 전달하면 다음과 같이 됩니다.

void DoSomethingByReference(ref string strLocal)
{
    strLocal = "local";
}
void Main()
{
    string strMain = "main";
    DoSomethingByReference(ref strMain);
    Console.WriteLine(strMain);          // Prints "local"
}

이에는있, 는문자열에안에 있는 입니다.Main참조를 스택에 복사하지 않고 전달했기 때문에 실제로 변경됩니다.

따라서 문자열이 참조 유형일지라도 값으로 전달하면 호출자에서 진행되는 모든 작업이 호출자의 문자열에 영향을 미치지 않습니다.그러나 참조 유형이기 때문에 전체 문자열을 전달할 때 메모리에 복사할 필요가 없습니다.

추가 리소스:

C#의 문자열은 변경할 수 없는 참조 개체입니다.즉, 해당 문자열에 대한 참조가 값별로 전달되므로 문자열이 생성되면 수정할 수 없습니다.문자열의 수정된 버전(부분 문자열, 잘린 버전 등)을 생성하는 메서드는 원본 문자열의 수정된 복사본을 생성합니다.

문자열은 특수한 경우입니다.각 인스턴스는 불변입니다.문자열 값을 변경하면 메모리에 새 문자열이 할당됩니다.

따라서 참조만 함수로 전달되지만 문자열을 편집하면 새 인스턴스가 되고 이전 인스턴스는 수정되지 않습니다.

언급URL : https://stackoverflow.com/questions/10792603/how-are-strings-passed-in-net

반응형