c# 변수의 범위 vs 객체는 메소드로 매개 변수화 될 때
문제
나는 상속, 다형성 및 캡슐화를 광범위하게 사용하지만 객체의 범위와 변수의 범위에 대한 다음 동작을 알지 못했다는 것을 깨달았습니다. 차이점은 코드로 가장 잘 표시됩니다.
public class Obj
{
public string sss {get; set;}
public Obj()
{
sss = "0";
}
}
public partial class testScope : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Obj a = new Obj();
String sss = "0";
Context.Response.Write(sss); // 0
FlipString(sss);
FlipString(a.sss);
Context.Response.Write(sss + a.sss); // 0 0
FlipObject(a);
Context.Response.Write(a.sss); // 1
Context.Response.End();
}
public void FlipString(string str)
{ str = "1"; }
public void FlipObject(Obj str)
{ str.sss = "1"; }
}
따라서 변수가 변경된 메소드로 전달 될 때 변경 사항이 메소드의 범위로 제한된다고 생각했습니다. 그러나 객체가 속성으로 변경되는 메소드로 전달되는 경우 방법을 넘어서 확장되는 것으로 보입니다.
규칙이 변수가 아니라 객체에 대한이 동작이 존재한다는 규칙이라면 이것을 받아 들일 수 있습니다. 메소드로 전달하는 매개 변수의 범위?
해결책
당신은 절대 통과하지 않습니다 물체 논쟁으로 - 당신은 단지 a 참조 또는 값 유형 값. 당신이 사용하지 않는 한 ref
키워드, 인수는 값으로 전달됩니다. 즉, 매개 변수의 초기 값은 인수의 평가 된 값이며, 매개 변수의 값에 대한 변경은 발신자가 볼 수 없습니다.
그러나 매개 변수 (참조 유형의 경우)의 값이 단지 참조. 참조가 지칭하는 객체의 내용을 변경하면 저것 변화 ~ 할 것이다 발신자가 볼 수 있습니다.
그것은 몇 단락 이상의 가치가있는 주제입니다. .NET에서 전달되는 매개 변수에 대한 기사 자세한 내용은.
다른 팁
방금 Google을 구글링 한 것으로 생각했는데 .NET의 일부는 "값"유형이고 다른 일부는 "참조"유형이므로 값 유형의 경우 메소드에 마샬링 될 때 값이 복제되지만 참조 유형은 비슷합니다. 포인터 또는 참조는 부모와 동일한 범위를 공유하는 방법으로 전달되었습니다. 그렇다면 내 질문은 무언가가 가치 유형인지 아닌지를 알 수있는 방법입니다. ints와 같은 스트러크는 모두 값 유형이지만 문자열은 객체 시스템이더라도 문자열처럼 행동하는 것처럼 보입니다.
클래스 (귀하의 경우 OBJ)는 참조 유형, 당신이 실제로하고있는 기능을 부를 때는 참조를 전달하는 것입니다 (기본적으로 이것을 유형-안전 포인터로 생각할 수 있음). 변한 객체 (IE 클래스/참조 유형)에 대한 변경을 방지하려면이 객체를 적절한 함수로 전달하기 전에이 객체를 복제해야합니다 (또는 단순히 값으로 복사 할 수 있도록 구조를 고려하십시오).