2012-05-24 3 views
3

Простой вопрос:Статические переменные - это переменные класса-экземпляра?

Возможны ли статические переменные class instance variable или class variable основания?

Зная, что class instance variable являются переменными, которые определены для каждого класса и подкласса, где он определен. И class variable являются переменными, которые являются глобальными для всех подклассов, где он определяет, включая себя.

EDIT: Зная, что я задыхаюсь от большого количества C# -образного парня, я использую экземпляр класса term как класс, в котором есть экземпляр некоторого MetaClass. Это очень упростило мой вопрос. Хотя не совсем неправильно говорить, что если вы считаете, что VM, безусловно, имеет артефакт, который представляет класс evrey (содержащий метод dictionay, размер экземпляра, суперкласс, ...). Thanks

ответ

1

Это переменные класса. В C# нет ничего подобного переменной экземпляра класса Smalltalk. То есть нет способа определить переменную, которая является общей для всех экземпляров класса, но которая имеет разные значения для своих подклассов.

Чтобы получить «подобное» поведение, но с тем недостатком, что экземпляр класса вар доступен только после создания экземпляра вашего класса я сделал что-то вроде этого:

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 может быть только экземпляром. Это не может быть классной стороной («aka kindof static») – mathk

+0

@mathk Теперь я, возможно, мог бы понять, что вы хотите, я изменил свой ответ с альтернативой этому. –

9

Статические переменные «принадлежат» типу - они не являются переменными экземпляра.

То есть, они разделяют между все экземпляры этого типа, включая generic закрытые построенные типы.

Исключения составляют статические переменные, украшенные ThreadStatic, что делает переменную уникальной в потоке.

+2

Стоит отметить, что generics будет означать, что статичность относится к типу с учетом общего аргумента. –

+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> будет иметь свою собственную копию Name и MyClass<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 Я лично никогда не предлагаю на самом деле использовать это решение, это один гигантский запах кода. Если бы я знал, чего вы хотели достичь, я мог бы предложить более подходящее решение, но, поскольку это так, ни один из ваших вопросов не был очень ясен. –