2010-01-17 3 views
4

없이 액세스 개질제 (따라서 internal 액세스)와 유형이 속성 :C#은 어셈블리의 모든 유형에 액세스 할 수있는 액세스 권한을 설정하고 평가자는 파생 된 유형으로 만 가져옵니다. 어떻게?

class SomeType { 
    private int length; 
    internal int Length { 
     get { return length; } 
     set length = value; } 
    } 
} 

는 SomeType의 어셈블리 내의 모든 유형 및 getset 접근을 사용할 수있다. 문제 : 액세스를 set에서 으로 제한하는 방법 SomeType (실제로 SomeType)에서 파생 된 유형입니까? protected 기발한 internal (보다 덜 제한적인 것으로 알려져 있기

internal int Length { 
    get { return length; } 
    protected set length = value; } 
} 

은 컴파일러에 의해 거부된다 protectedinternal교차이 있지만, 완전히 internal에 포함되지 인 -> 파생 유형 수 internal의 범위를 벗어난 경우).

코드는 어셈블리 내의 모든 유형에서 액세스 할 수 있으며 어셈블리 내에서 파생 된 유형에 의해서만 설정됩니까?

편집은 : 답변을 검토 한 후, 나는 그것이 솔루션의 차이를 만들 수 있기 때문에, 재산의 또 다른 특성을 추가 할 필요가 있다고 생각 : 속성의 유형이 실제로 SomeType입니다. 편집 된 코드는 다음과 같습니다 속성이 다음 컴파일러 오류가 발행 public을 선언

class SomeType { 
    private SomeType length; 
    internal SomeType Length { 
     get { return length; } 
     set length = value; } 
    } 
} 

경우 (프로퍼티 타입의 SomeType이이 건물의 길이 덜 액세스 할 수 있습니다). 난 그냥 확인했습니다, 그리고 속성의 유형이 같은 경우이 경우에도 작동합니다

protected int Length 
{ 
    internal get { return length; } 
    set { length = value; } 
} 
+0

내 생각 엔 클래스의 액세스와 속성의 액세스를 별도로 확인해야한다는 것입니다. 속성에 대한 액세스를 public으로 설정하면 get을 위해 protected를 사용할 수 있습니다. 그러나 클래스가 내부 클래스이기 때문에 SomeType에서 파생되고 이미 SomeType에 액세스 할 수있는 객체 만 (따라서 같은 어셈블리에서) 집합 접근 자에 액세스 할 수 있습니다. 하지만 그게 내게 충분히 명확하지 않다 ... – Mike

+0

편집 된 코드를 다시 시도하십시오. 해당 속성을 아무 문제없이 공개 할 수 있고 setter를 보호 할 수 있습니다. * internal * 유형을 참조하는 * public * 유형에서는 이러한 속성을 만들 수 없습니다. –

+0

Jon, 맞습니다. 이 시점에서 나는 초기 문제를 재현 할 수 없기 때문에 약간 혼란 스럽다. 실제로 종속성 속성에 대한 래퍼를 시작했습니다. 이 포장지에는 문제가있었습니다. 결국, 당신과 다른 사람들이 많은 제안을합니다. 그래서 이번에는 이러한 답을 긍정적으로 표시 할 것입니다. 고마워, 나는 당신의 의견을 apprciated. – Mike

답변

4

(편집 :

-1

당신이 주위를 회전 할 수 없음은 (그것을 테스트하지 않은 경우) 선언 유형입니다. 그러나, 는 않습니다 당신은 호텔의 유형이 내부 유형 인 공공 유형 내에서 속성을 선언하려하지 작동합니다.)

할 수 있습니다 꽤 C#에서 (엄밀히 말하면),하지만 당신은 뭔가 할 수있는 ver y 유사 :

(이는 단순하게하기 위해 자동으로 구현 된 속성을 사용합니다. 동일한 기술은 "일반"속성에도 적용됩니다.)

이렇게하면 동일한 어셈블리 내의 모든 유형에 대해 "getter"액세스가 가능합니다. 파생 유형; "setter"는 파생 된 유형에만 액세스 할 수 있습니다. 어쨌든 클래스가 내부 클래스이기 때문에 어쨌든 꽤 비슷합니다 - 이론적으로 어셈블리 외부의 형식에서는 getter에 액세스 할 수 있지만 클래스는 내부이므로 다른 형식의 어셈블리는 사용자 유형에서 파생되지 않아야합니다.

속성은 한 액세스 수준이 다른 액세스 수준을 "하위 집합"으로 지정해야한다는 점에서 문제가 있습니다. internalprotected은 이와 같이 작동하지 않습니다. 한 유형은 같은 어셈블리에 있지만 해당 유형에서 파생되지는 않습니다. 다른 형식은 다른 형식에서 파생 될 수 있지만 다른 어셈블리에서 파생 될 수 있습니다. 기본적으로 직각입니다. protected internal 그것이 유형으로부터 유도 동일한 어셈블리 또는중 어떤 유형 액세스 뜻 때문에

상기 용액은 작동한다. 명확하게 각각 protectedinternal은이 부분 집합입니다.

당신은 C 번호는 CLR "가족 조립"액세스 수준에 약간 상당이 있다면 더 세터에 대한 제한 된 internal 속성을 만들 수있을 것입니다. (protected internal는 "가족 또는 조립"에 해당합니다.) 불행하게도 당신을 위해, 그것은

을 :(하지 않는 경우 정말는 (원래 명시된 목표를 원하는 예를 들어 나중에 당신이 원하는 공용 클래스에있는 경우 클래스 자체가 선언 조립 (에서만 볼 수 있기 때문에 동일한 제한)를 적용, 당신은 때문에 암시 internal 액세스 한정자에 별도의 방법 대신에 그들 중 적어도 하나, 예를 들어

private int length; 
internal int Length { get { return length; } } 

protected void SetLength(int value) 
{ 
    this.length = value; 
} 
+1

'internal'은'protected'보다 더 제한적이지 않기 때문에 이것이 합법적이지 않다고 생각합니다. – jason

+0

제이슨은 정확합니다. - 컴파일되지 않습니다. –

3

을해야합니다), 속성에 getter를 넣으십시오. public 및 setter protected : 클래스 자체가 표시되지 않기 때문에

class SomeType { 
    private int length; 

    public int Length { 
     get { return length; } 
     protected set { length = value; } 
    } 
} 

게터 는 어셈블리의 외부 밖으로 액세스 할 수 없습니다 것입니다.


주제 끄기 : 당신은 최근 C# 컴파일러가있는 경우, 당신은 대신 자동 속성을 사용할 수 있습니다 :

class SomeType { 
    public int Length { get; protected set; } 
} 

이는 언어/컴파일러 트릭, 컴파일 할 필요가 없습니다 버전 3.X 프레임 워크를 사용하여이를 사용합니다.

+0

자동 구현 된 속성을 사용하기 위해 3.X 프레임 워크에 대해 컴파일 할 필요가 없습니다. C# 3 또는 C# 4 컴파일러 만 사용해야합니다. 여전히 .NET 2.0을 타겟팅 (예 : *에 대해 * 컴파일) 할 수 있습니다. –

+0

글쎄, 그게 효과가 있다고 생각해. 그러나 필자가 제공 한 코드의 단순화 된 샘플에는 표시되지 않는 또 다른 특성이 있습니다. 실제로 속성 유형은 int가 아니고 SomeType 자체입니다. 유형이 내부적 인 동안 속성을 public으로 만드는 것은 컴파일러가 속성보다 속성 유형이 덜 액세스 할 수 있다는 사실에 대해 불평을하게합니다. 사실 이것은 내 머리가 시작되는 곳입니다 ... – Mike

+1

@Mike : 이것이 대표적인 사례를 제시하는 것이 중요한 이유입니다 ... 제 답변을 수정하겠습니다. –