2017-10-05 11 views
4

저는 최근에 C#을 배우기 시작했는데 뭔가 혼란 스러워요. 정적 클래스 용 documentation은 정적 멤버 만 포함 할 수 있다고 알려줍니다. 그러나 정적 클래스 내에서 정적이 아닌 중첩 클래스와 구조체를 정의 할 수 있습니다.C# 정적 클래스가 정적이 아닌 클래스/구조체를 포함 할 수있는 이유는 무엇입니까?

클래스/구조체 정의가 구성원 인 수로 계산되지는 않지만 그 이유는 무엇입니까? 정적 클래스의 중첩 클래스를 인스턴스화 할 수 있으면 정적 클래스의 지점과 모순되지 않습니까? 나는 여기서 명백한 것을 오해하고 있는가?

+0

나쁜 표현이 들어, 나는 중첩 된 클래스 말을 의미했다. –

+0

나는 당신이 명백한 것을 놓치고 있다고 말할 것이다. 정적 인 클래스의 주요 목적은 그 클래스의 인스턴스화를 방지하는 것이다. – Phil1970

+0

중첩 된 클래스는 * 정적 클래스 *인지 여부에 관계없이 해당 둘러싸는 클래스의 * 정적 멤버 *로 간주합니다. (중첩 된 클래스가 항상 둘러싸는 클래스의 정적 멤버가 아닌 Java와는 달리, "정적 클래스"라는 용어는 정적 멤버 인 중첩 클래스를 의미합니다. –

답변

7

C# 중첩 클래스는 하위 클래스가 아니며 주변 클래스는 다른 네임 스페이스와 비슷합니다. 내부 클래스에서 외부 클래스의 인스턴스에 액세스 할 수 없습니다 (예 : Java와 반대). 그래서 정적 클래스는 중첩 된 유형을 포함 할 수 있습니다.

유명한 예로 LINQ class Enumerable은 정적입니다. 여기에는 많은 도우미 클래스가 포함됩니다.

public static class Enumerable 
{ 
    // many static LINQ extension methods... 

    class WhereEnumerableIterator<TSource> : Iterator<TSource> 
    { 
     // ... 
    } 

    internal class EmptyEnumerable<TElement> 
    { 
     public static readonly TElement[] Instance = new TElement[0]; 
    } 

    public class Lookup<TKey, TElement> : IEnumerable<IGrouping<TKey, TElement>>, ILookup<TKey, TElement> 
    { 
     // ... 
    } 

    // many others 
} 

주변의 정적 클래스는 내부 클래스의 논리적 컨테이너입니다. 그것은 정적 클래스에서 사용되기 때문에 거기에 속하며 다른 곳에서 액세스 할 수없는 경우가 많습니다 (공용이 아닌 경우).

하지만 맞아요, 문서가 부족합니다. 그들은 말했다해야합니다

는 정적 구성원 또는 중첩 유형

내 부분에
+0

의미에서 (중첩 된) 클래스 정의는 정적 인 것이다. – Haukinger

+0

@Haukinger : 아니요, 여러 인스턴스를 만들 수 있습니다 :'var i1 = new OuterC.InnerC(); var i2 = new OuterC.InnerC();'(액세스 할 수있는 경우) –

+0

확실한 것은 정의 된 유형이 정적 일 수도 있고 그렇지 않을 수도 있지만 _defnition_는 정적입니다. 당신은'var x = new OuterC(); var y = new x.InnerC();'... – Haukinger

4

설명서가 조금 부족하지만 중첩 된 클래스/구조체는 정적 클래스에서 사용할 수 있으며 static 일 수도 있고 인스턴스화 할 수도 있습니다. 다음 코드를 고려하십시오

namespace StaticClasses 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      new Foo(); // Cannot create an instance of the static class 'Foo' 
      new Foo.Bar(); // Cannot create an instance of the static class 'Foo.Bar' 
      new Foo.Baz(); 
     } 
    } 

    static class Foo 
    { 
     public static class Bar 
     { 

     } 

     public class Baz 
     { 

     } 
    } 
} 

이러한 맥락에서를, 정적 클래스는 네임 스페이스와 비슷하지만 네임 스페이스는 (아마) 상자의 클래스보다 더 의미 론적 관계를 설명합니다.