2013-02-20 3 views
3

System.Array 클래스는 ICollection 인터페이스를 구현합니다. 이 인터페이스에는 배열의 요소 수를 나타내는 Count이라는 공용 속성이 있습니다.배열의 요소 수 계산

내가 당신은 화면에 10 참조 기대 속성

Array numbers = Array.CreateInstance(typeof(int), 10); 
Console.WriteLine(numbers.Count); 

배열을 선언하고 액세스 가정하자. 그러나 숫자 뒤에 마침표를 넣은 후 Count 속성을 볼 수 없습니다. 그러나 Length이라는 속성이 있습니다. 왜 그래야만하지?

업데이트 : 이것은 명시 적 인터페이스 구현 때문입니다. 광산과 비슷한 또 다른 질문이 있기 때문에, 나는 그것을 다시 말하기로 결정했다. 이 특정 속성을 명시 적으로 구현하기 위해 디자인 결정을 내린 이유는 무엇입니까? 동일한 기능을 가진 또 다른 속성이 Length입니다. 그렇다면 왜 명시 적으로 구현 된 Count을 제공하는 데 문제가 있습니까?

+0

'ICollection'으로 전송하십시오. –

+0

왜 당신은'int [] number = new int [10];'을 사용하고 있지 않습니까? – PhonicUK

+0

@PhonicUK, 내가 사용하고있는 방법은 'Array'를 선언하는 유효한 방법이기도합니다. 언급 한 구문을 선호하는 이유가 있습니까? – TheSilverBullet

답변

2

System.Array 클래스는 명시 적으로 ICollection 인터페이스를 구현합니다.당신은

Array numbers = Array.CreateInstance(typeof(int), 10); 
ICollection numbersCollection = (ICollection)numbers; 
Console.WriteLine(numbersCollection.Count); 

Implicit and Explicit Interface Implementations

System.Array.Count 실제로 재산 나는이 프로그램의 문제가 아니라고 생각

int ICollection.Count 
{ 
    get 
    { 
     return this.Length; 
    } 
} 
+0

그래서, 당신은 기본적으로 그 차이는 단지 사용 된 단어에 불과하다고 말하고있다. 그리고 이것은 이해를 돕기 위해 이루어졌습니다. 본질적으로 편의의 문제. – TheSilverBullet

+0

왜 이렇게했는지 모르겠습니다. –

+0

켄 킨 (Ken Kin)은 아래에서 매우 인정되는 설명을합니다. 답변 해주셔서 감사합니다! 나는 너를 받아 들였다. – TheSilverBullet

1

CountICollection 인터페이스에서 명시 적으로 구현됩니다. 그것이 보이지 않는 이유입니다. Count 속성에 액세스하려면 ((ICollection) numbers).Count을 전송해야합니다.

+1

감사합니다, ybee. 일단 배열 변수를 타입 변환하는 구문을 사용하면 속성을 묻는 메시지가 표시되지 않습니다. 나는 '백작 (Count)'을 타이핑해야만했다. 왜 이렇게 생각하니? – TheSilverBullet

+1

@ TheSilverBullet : 'Count'가 명시적인 이유는 무엇입니까? 대신 'Length'가있는 이유는 무엇입니까? 프로그래머들은 우리가 배열에 대해 말할 때, 우리는'Length'에 대해 말하고 있다는 것에 익숙합니다. 그러나 다른 한편으로는, 배열 상에 작동하는 경우 실제로'Length'를 리턴하는'Count()'라고 불리는'IEnumerable'을위한 확장 메소드가 있습니다. 아마 당신은 여기서'ICollection'으로 캐스팅하는 대신에'IEnumerable.Count()'를 사용해야합니다. –

4

ICollection으로 전송해야합니다.

Array.ICollection.Count 재산권

이 멤버는 명시 적 인터페이스 멤버 구현입니다. Array 인스턴스가 ICollection 인터페이스로 캐스팅 된 경우에만 을 사용할 수 있습니다. I can not access Count property of the array but through casting to ICollection !

업데이트 :

이 때문에 명시 적 인터페이스 구현이다

, BTW 여기에 중복입니다. 내 질문과 유사한 또 다른 질문이 있기 때문에 다시 말씀하기로 결심했습니다. 이 특정 속성을 명시 적으로 구현하기 위해 디자인 결정을 한 이유는 무엇입니까? 동일한 기능을 가진 또 다른 속성이 있습니다. 길이. 그렇다면 왜 명시 적으로 Count를 구현하는 데 문제가 있습니까?

에서 ICollection<T>을 상속합니다. 그래서 대신 why array implements IList?을 물어볼 수 있습니다.

+0

"그것은'IList '..."에서 상속합니다. 내가 아는 한'Array'는'List '에서 상속받지 않습니다. 내가 여기서 뭔가를 놓치고 있니? 그리고 링크에 감사드립니다. 토론에서 귀중한 것을 배웠습니다. – TheSilverBullet

+1

@ TheSilverBullet : C# 2.0 이상에서는 0의 하한을 갖는 1 차원 배열이 자동으로'IList '을 구현합니다. http://msdn.microsoft.com/en-us/library/ms228502(v=vs.110).aspx –

+0

제공하신 링크는 매우 유용하며 목록 작성을 위해 인터페이스 디자인의 일부분을 다시 읽게되었습니다 . 또한 왜 자동적으로 'IList '을 구현할 것인지 결정을 내 렸습니다. 그러나 나는 지금 그것을 다른 날을 위해 두는 것을 더 좋아한다. 나는 당신의 질문을 받아 들일 수 있었으면 좋겠다. – TheSilverBullet

1

, 그것은 질문의 Array.Length 사용 ArrayICollection에 캐스팅 후 ICollection의 방법을 사용할 수 있습니다 논리적 인 intension.

당신은이 두 가지 질문을 스스로에게 물어 있습니다

Q1합니다. 배열 컬렉션입니까?

Q2. 콜렉션 배열입니까? C#에서

는 기존 실현하는 것이 1 분기의 답이 있음을 알려줍니다

A1 : 예, 배열이 컬렉션이다. 따라서 ArrayICollection을 구현합니다.

그리고 Q2는 어떨까요? 그것은 비슷한 질문을 묻는 것입니다 흰 말은 말입니다? 답을 보려면 [When a white horse is not a horse]을 보길 원할 수 있습니다.

Q2를 사용하면 다음과 같이 응답합니다. "컨텍스트에 따라 달라집니다." 그렇다면 문맥은 무엇일까요? 인터페이스가 ICollection을 구현할 때 배열을 전달하면 그렇습니다.이 컬렉션도 배열입니다. 그러나 동일한 인터페이스를 가진 배열을 제외하고는 다른 객체를 전달할 수 있습니다. 그렇다면 필연적으로 배열일까요? 이것의 일부 확장에 관심이 있다면, [this answer]의 A3가 당신에게 아이디어를 줄 수도 있습니다.

따라서, 그것은 ArrayLength 속성을 가지고 있으며, 또한 ICollection의 명시 적 구현에서 인 Count 속성이, 완전히 합리적이다.

+0

이 답변은 다른 답변에 비해 완전히 다른 방식으로 도움이되었습니다. 긴장감에 의문을 제기하는 이유는 실제 디자인에 대한 실제 결정을 파헤 치고 그것이 완료된 방식으로 완료된 이유를 이해하기 위해서입니다. – TheSilverBullet