2009-12-02 8 views
0

저는 건물에있는 라이브러리에서 다소 이상한 동작을 감지했습니다.개인 필드가있는 클래스 동작

나는이 방법이 있습니다

public class Lib 
{ 
private string field = "field"; 

public string Field 
{ 
    get 
    { 
    return field; 
    } 
} 

public void Add(Lib lib) 
{ 
    string field = DoSomething(lib); 
    Console.WriteLine(field); 
} 

protected string DoSomething(Lib lib) 
{ 
    return lib.field; 
} 
} 

그래서,이 라이브러리를 사용하는 프로그램에서 메서드를 호출하는 경우 :

Lib lib = new Lib(); 
Lib lib2 = new Lib(); 

lib.Add(lib2); 

콘솔 지금 ... 나에게 출력으로 "field"을 제공을, 왜 그렇게되는지 이해가 안됩니다. 필드를 private로 선언했는데, 왜 한 클래스가 다른 클래스의 private 속성에 액세스 할 수 있으며 액세스 제한에 대한 예외를주지 않습니까?!

내 이해에 따라 Lib은 자신의 필드에 액세스 할 수 있지만이 메서드에 Lib의 다른 인스턴스를 지정하면 첫 번째 인스턴스가 초의 개인 필드에 액세스 할 수 없어야합니다. 다른 인스턴스와 개인이기 때문에 글쎄요!

+0

_public 문자열이 아니어야합니다. _ 필드 문자열은 _private 문자열이어야합니다. –

+0

아니요, 필드는 private이고 필드는 공용보기에서'field'에 액세스하는 데 사용할 수있는 접근 자입니다. 물론이 예에서 그것은별로 센을하지 않습니다. se, 왜냐하면 그냥'field'를 반환하기 때문입니다.하지만 거기에 논리를 추가하여'Field'에 접근 할 때받는 출력을 향상시킬 수 있습니다. some Reformatting or so) –

답변

1

이것은 의도적으로 private 액세스 한정자가 포함 된 형식에 대한 액세스를 제한합니다. 유형의 인스턴스가 아닙니다. 중첩 된 형식은 포함하는 형식의 전용 필드에도 액세스 할 수 있습니다.

class MyType 
{ 
    private string secret; 

    public MyType(string secret) { this.secret = secret; } 

    public void SomeMethod(MyType myType) 
    { 
     // Works because the private modifier pertains to the Type, not the instance 
     Console.WriteLine(myType.secret); 
    } 

    public class MyNestedType 
    { 
     public MyNestedType(MyType myType) 
     { 
      // Also works because the we are in a nested type of MyType 
      Console.WriteLine(myType.secret); 
     } 
    } 
} 

관련 링크

: Accessibility Levels, private

+0

그리고 클래스의 인스턴스에 필드를 '비밀'로 선언 할 수 있습니까? –

+0

내가 아는 액세스 수정자가 없습니다. –

0

개인 클래스가 아니라 인스턴스에 개인을 의미합니다.

처음에는 이상하게 생각하고 .NET에서 "버그"를 발견했다고 생각했습니다. 소년은 내가 그 이론을 발표했을 때 나는 그 자리에 놓았다. ...

0

"콘솔은 출력으로"필드 "를 제공한다 ... 지금 나는 그 이유를 이해하지 못한다. 개인, 그래서 왜 한 클래스가 다른 클래스의 개인 속성에 액세스 할 수 있으며 액세스 제한에 대한 예외를주지 않습니까? "

그러나 다른 클래스는 에 직접 액세스하지 않습니다.; 클래스가 자신의 개인 멤버에 액세스 할 수 있기 때문에 그냥, 다시 그것을 할 수있는 개인 회원 field을 (액세스하는 Lib 클래스의 인스턴스의 공공 방법에 접근합니다.

그것은 같은 비트입니다 내 집에 들어가서 내 물건을 가져갈 수 없다는 말은 사적인 것입니다. 그러나 공개적으로 그렇게하기 때문에 내 물건을 두드리면 내 문을 두드리면됩니다.

+0

이 메소드는 private 필드 인 "Lib"의 매개 변수화 된 인스턴스에서 "field"에 액세스합니다. –

+0

좋아, 방금 "반환 lib.field;"나타났습니다.어떤 상황에서도 개인 유형의 인스턴스에 액세스 할 수 없어야한다고 생각했지만 인스턴스가 클래스 정의 (예 : 함수)에서 사용되면 개인 필드는 다음과 같을 수 있습니다. 액세스되었습니다. –

관련 문제