문제

나는 상속, 다형성 및 캡슐화를 광범위하게 사용하지만 객체의 범위와 변수의 범위에 대한 다음 동작을 알지 못했다는 것을 깨달았습니다. 차이점은 코드로 가장 잘 표시됩니다.

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 클래스/참조 유형)에 대한 변경을 방지하려면이 객체를 적절한 함수로 전달하기 전에이 객체를 복제해야합니다 (또는 단순히 값으로 복사 할 수 있도록 구조를 고려하십시오).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top