成员修饰:静态和实例成员

依然范特西╮ 提交于 2020-03-13 07:44:02
对类的内部数据成员和函数成员都可以用static修饰。

如果成员被static修饰,那该成员就是静态的,从应用角度讲,类的使用者通过类来访问静态成员在语义上更能够被理解,而通过实例来访问静态成员在语义上显得不合适。
在类的内部,所有成员都可以访问静态成员。但反过来,静态成员绝对不可以访问实例成员。
静态成员的值对于所有实例对象而言,是共享的,所以任何实例都可以访问或修改静态成员,且更改的结果也同样影响所有实例的访问。
 1    public class Space
 2    {
 3
 4        public static void Main(string[] args)
 5        {
 6            System.Console.WriteLine(new Order().CreateNumber());//725-1
 7            System.Console.WriteLine(new Order().CreateNumber());//725-2
 8        }

 9
10    }

11
12    
13
14
15    public class Order
16    {
17
18        private static int Count;// 该Count能被所有的实例访问
19        public string Number;
20
21        public string CreateNumber()
22        {
23
24            Count++;
25            return System.DateTime.Now.ToString("yMd-"+ Count.ToString();
26        
27        }

28    }
上面的代码中,Count就是一个静态成员,可以被所有的实例访问,且数据共享。


不过,在上述代码中,CreateNumber的方法作为实例方法其实有点不妥,因此最好改为静态方法。
 1    public class Space
 2    {
 3
 4        public static void Main(string[] args)
 5        {
 6            System.Console.WriteLine(Order.CreateNumber());//725-1
 7            System.Console.WriteLine(Order.CreateNumber());//725-2
 8        }

 9
10    }

11
12    public class Order
13    {
14
15        private static int Count;// 该Count能被所有的实例访问
16        public string Number;
17
18        public static string CreateNumber()
19        {
20
21            Count++;
22            return System.DateTime.Now.ToString("yMd-"+ Count.ToString();
23
24        }

25    }


注意上面代码中第6、7行对于CreateNumber的调用。

static方法的运用,很多在于语义领会。比如CreateNumber如果是实例方法的话,就会出现以下不合理的代码。

1            Order order1 = new Order();
2            Order ordre2 = new Order();
3            ordre2.Number = order1.CreateNumber();//虽然编译通过,但语义上也太离奇了吧
4            System.Console.WriteLine(ordre2.Number);

所以当CreateNumber是静态的时候,下面的代码更明确的告诉我们正常的语义

1            Order order1 = new Order();
2            Order ordre2 = new Order();
3            ordre2.Number = Order.CreateNumber();//Number由Ordr总控分配
4            System.Console.WriteLine(ordre2.Number);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!