2012-05-24 2 views
3

간단한 질문 :정적 변수는 클래스 인스턴스 변수입니까?

정적 변수는 class instance variable 또는 class variable 기준입니까?

class instance variable은 정의 된 각 클래스 및 하위 클래스에 대해 정의되는 변수입니다. 그리고 class variable은 자체를 포함하여 정의 된 모든 하위 클래스에 대해 전역 변수입니다.

EDIT : 많은 C#을 사용하는 사람을 질식시키는 것을 알기 때문에 나는 class 클래스 인스턴스를 클래스처럼 사용합니다. MetaClass 인스턴스입니다. 이것은 크게 내 질문을 단순화합니다. VM이 확실히 evrey 클래스 (메서드 dictionay, 인스턴스 크기, 수퍼 클래스 등)를 나타내는 아티팩트를 가지고 있다고 생각하면 완전히 잘못 말하는 것은 아닙니다. 감사합니다.

답변

1

이들은 클래스 변수입니다. C#에서 스몰 토크 클래스 인스턴스 변수와 같은 것이 없습니다. 나는. 클래스의 모든 인스턴스에서 공통이지만 하위 클래스에 대해 다른 값을 갖는 변수를 정의하는 방법은 없습니다.

는 "비슷한"행동을 얻으려면,하지만 단점으로 클래스 인스턴스 VAR은이 같은 짓을 한 클래스의 인스턴스를 생성 한 후 액세스 할 수 있는지 :

public class BaseClass 
{ 
    private static Dictionary<Type, object> ClassInstVarsDict = new Dictionary<Type, object>(); 

    public object ClassInstVar 
    { 
     get 
     { 
      object result; 
      if (ClassInstVarsDict.TryGetValue(this.GetType(), out result)) 
       return result; 
      else 
       return null; 
     } 
     set 
     { 
      ClassInstVarsDict[this.GetType()] = value; 
     } 
    } 
} 

public class DerivedClass1 : BaseClass 
{ 
} 

public class DerivedClass2 : BaseClass 
{ 
} 
+0

제안 해 주셔서 감사합니다. 또 다른 단점이 있는데 ClassInstVar는 인스턴스 측면 속성 일뿐입니다. 그것은 클래스 측면 ("일명 kindof 정적") 수 없습니다 – mathk

+0

@ mathk 이제는 내가 원하는 것 이해할 수도 일종의,이 대안에 대한 내 대답을 수정했습니다. –

9

정적 변수는 유형에 속하며 인스턴스 변수가 아닙니다.

즉폐쇄 형을 포함하여 모두 개의 인스턴스간에 공유됩니다.

정적 변수는 ThreadStatic으로 장식되어 변수가 스레드 내에서 고유하게됩니다.

+2

제네릭이란 정적 인수가 일반 인수가 포함 된 유형에도 속한다는 것을 의미합니다. –

+1

정적 변수는 스레드간에 공유됩니다. –

+0

@AdamHouldsworth - 참. 제네릭 형식에 정의 된 정적은 [닫힌 된 생성 된 일반 형식] (http://msdn.microsoft.com/en-us/library/sz6zd40f.aspx)의 인스턴스간에 공유됩니다. – Oded

4

정적 변수는 주어진 AppDomain에 대해 정의 된 유형의 범위입니다. 또한 ThreadStaticAttribute을 사용하지 않는 한 스레드간에 공유됩니다. 어느 시점에서 그들은 스레드 당 스레드가됩니다.

클래스 멤버는 클래스의 인스턴스으로 분명히 범위가 지정되지만 파생 클래스에는 "전역"이 아닙니다. 액세스 한정자에 따라 멤버는 파생 인스턴스에서도 볼 수 있습니다.

class MyClass<T> 
{ 
    public static string Name; 
} 

그래서 MyClass<int> 다른 사본이있을 것이다 NameMyClass<string>의 복사본이있을 것이다 : 일반적인 인수

클래스 폐쇄 제네릭 형식에 따라 정적 변수가 있습니다.


원하는 답을 보면, 파생 클래스 당 정적 변수가 필요한 것 같습니다.

당신은 속임수 위의 제네릭 규칙을 사용할 수 있습니다

class Program 
{ 
    static void Main(string[] args) 
    { 
     Derived1.WhatClassAmI = "Derived1"; 
     Derived2.WhatClassAmI = "Derived2"; 

     Console.WriteLine(Derived1.WhatClassAmI); // "Derived1" 
     Console.WriteLine(Derived2.WhatClassAmI); // "Derived2" 

        Console.WriteLine(BaseClass<Derived1>.WhatClassAmI); // "Derived1" 
        Console.WriteLine(BaseClass<Derived2>.WhatClassAmI); // "Derived2" 
     Console.Read(); 
    } 

    class BaseClass<T> where T : BaseClass<T> 
    { 
     public static string WhatClassAmI = "BaseClass"; 
    } 

    class Derived1 : BaseClass<Derived1> 
    { 
    } 

    class Derived2 : BaseClass<Derived2> 
    { 
    } 
} 

는 그들은 "동일한"정적 사용하지만, 각 유형의 폐쇄로 인해 자신의 값을 가진다.

+0

어쨌든 다른 유형 매개 변수를 가진 제네릭 클래스의 각 인스턴스는 다른 유형의 객체를 생성하므로 완벽하게 논리입니다. – mathk

+0

흥미로운 솔루션, 비록 내가 정말 좋아하지 않는다. 나는 내 뒤에 코드를 유지하려고하는 사람을 당황하게하고 싶지 않다. 그래서 나는 추상적 인 속성을 추가하고 각 서브 클래스에서 정적 변수를 "재정의"하기로 결정했다. – mathk

+0

@mathk 필자는 개인적으로이 솔루션을 실제로 사용하지 말라고 권하고 싶습니다. 이것은 하나의 거대한 코드 냄새입니다. 당신이 무엇을 성취하고자하는지 알고 있다면, 나는 더 적절한 솔루션을 제공 할 수 있습니다. 그러나 그 의미대로 당신의 질문은 분명하지 않습니다. –

관련 문제