zoukankan      html  css  js  c++  java
  • c#中静态成员和实例成员(转)

    7.5  静态成员与实例成员

    在类的成员的类型或者返回值类型前面加上关键字static,就能将该成员定义为静态成员(static member)。常量或类型声明会隐式地声明为静态成员,其他没有用static修饰的成员都是实例成员(instance member)或者称为非静态成员。静态成员属于类,被这个类的所有实例所共享;实例成员属于对象(类的实例),每一个对象都有实例成员的不同副本。

    静态成员具有下列特征:

    — 静态成员必须通过类名使用 . 运算符来引用,而不能用对象来引用。

    — 一个静态字段只标识一个存储位置。无论创建了一个类的多少个实例,它的静态字段在内存中都只占同一块区域。

    — 静态函数成员(方法、属性、事件、运算符或构造函数)不能作用于具体的实例,在这类函数成员中不能直接使用实例成员,必须通过类名来引用。

    实例成员具有以下特点:

    — 实例成员必须通过对象名使用 . 运算符来引用,而不能用类名来引用。

    — 类的实例字段属于类的实例所有,每创建一个类的实例,都在内存中为实例字段开辟了一块区域。类的每个实例分别包含一组该类的所有实例字段的副本。

    — 实例函数成员(方法、属性、索引器、实例构造函数或析构函数)作用于类的给定实例,在它们的代码体内可以直接引用类的静态和实例成员。

    其实,我们在前面的几章中大量使用的Console类的WriteLine等方法都是静态方法,都是通过类名Console来引用的。

    理解下面的代码,体会静态成员和实例成员的使用方法:

    class Test

    {

        int x;             // 实例字段

        static int y;         // 静态字段

        void F()              // 实例方法

        {

            x = 1;             // 正确:实例方法内可以直接引用实例字段

            y = 1;             // 正确:实例方法内可以直接引用静态字段

        }

        static void G()       // 静态方法

        {

            x = 1;             // 错误:静态方法内不能直接引用实例字段

            y = 1;             // 正确:静态方法可以直接引用静态字段

        }

        static void Main()       // 静态方法

        {

            Test t = new Test();  // 创建对象

            t.x = 1;           // 正确:用对象引用实例字段

            t.y = 1;           // 错误:不能用对象名引用静态字段

            Test.x = 1;        // 错误:不能用类名引用实例字段

            Test.y = 1;        // 正确:用类名引用静态字段

            t.F();             // 正确:用对象调用实例方法

            t.G();             // 错误:不能用对象名调用静态方法

            Test.F();          // 错误:不能用类名调用实例方法

            Test.G();          // 正确:用类名调用静态方法

        }

    }

    注意  上述代码中,Main也是Test类的静态方法,可以在其中直接使用静态成员,而不需要使用类名来引用。

    下面的程序演示了静态字段的性质:

    // StaticMember.cs

    // 静态字段的例子

    using System;

    public class Count

    {

        static int count;

        int number;

        public Count()

        {

            count = count + 1;

            number = count;

        }

        public void show()

        {

            Console.WriteLine("object{0} : count={1}", number, count);

        }

    }

    class Test

    {

        public static void Main()

        {

            Count a = new Count();

            a.show();

            Console.WriteLine("-----------------");

            Count b = new Count();

            a.show();

            b.show();

            Console.WriteLine("-----------------");

            Count c = new Count();

            a.show();

            b.show();

            c.show();

        }

    }

    其输出结果为:

    object1 : count=1

    -----------------

    object1 : count=2

    object2 : count=2

    -----------------

    object1 : count=3

    object2 : count=3

    object3 : count=3

    从上面的例子中可以看出,无论何时,类的所有实例的静态字段count的值都是相同的,一个实例改变了它的值,其他实例得到的值也将随之变化,说明所有实例都使用同一个count字段;而每个实例的成员字段number的值都是不同的,也不能被其他的实例化改变。

  • 相关阅读:
    《Programming WPF》翻译 第8章 1.动画基础
    一些被遗忘的设计模式
    《Programming WPF》翻译 第4章 数据绑定
    《Programming WPF》翻译 第3章 控件
    《Programming WPF》翻译 第5章 样式和控件模板
    《Programming WPF》翻译 第7章 绘图
    《Programming WPF》翻译 第9章 自定义控件
    《Programming WPF》翻译 第7章 绘图 (2)
    《Programming WPF》翻译 第8章 前言
    关于Debug和Release之本质区别
  • 原文地址:https://www.cnblogs.com/treasurelife/p/1076094.html
Copyright © 2011-2022 走看看