Members of a class are either static members or instance members. Generally speaking, it is useful to think of static members as belonging to classes and instance members as belonging to objects (instances of classes).
When a field, method, property, event, operator, or constructor declaration includes a static
modifier, it declares a static member. In addition, a constant or type declaration implicitly declares a static member. Static members have the following characteristics:
E.M
, E
must denote a type. It is an error for E
to denote an instance.this
in a static function member.When a field, method, property, event, indexer, constructor, or destructor declaration does not include a static
modifier, it declares an instance member. An instance member is sometimes called a non-static member. Instance members have the following characteristics:
E.M
, E
must denote an instance. It is an error for E
to denote a type.this
(§7.5.7).The following example illustrates the rules for accessing static and instance members:
class Test { int x; static int y; void F() { x = 1; // Ok, same as this.x = 1 y = 1; // Ok, same as Test.y = 1 } static void G() { x = 1; // Error, cannot access this.x y = 1; // Ok, same as Test.y = 1 } static void Main() { Test t = new Test(); t.x = 1; // Ok t.y = 1; // Error, cannot access static member through instance Test.x = 1; // Error, cannot access instance member through type Test.y = 1; // Ok } }
The F
method shows that in an instance function member, a simple-name (§7.5.2) can be used to access both instance members and static members. The G
method shows that in a static function member, it is an error to access an instance member through a simple-name. The Main
method shows that in a member-access (§7.5.4), instance members must be accessed through instances, and static members must be accessed through types.