C#学习笔记—Static和封装
1、Static关键字
a、C#类(或结构)可以通过static关键字来定义许多静态成员。如果这样的话,这些成员就只能直接从类级别而不是对象引用调用。
b、静态成员只能操作静态数据或调用类的静态方法。
View Code
1 class Teenager
2 {
3 public static Random r = new Random();
4 public static int GetRandomNumber(short upperLimit)
5 {
6 return r.Next(upperLimit);
7 }
8 public static string Complain()
9 {
10 string[] messages = { "Do I have to?", "He startrd it!","I'm too tired...", "I hate school!","You are sooooo wrong!"};
11 return messages[GetRandomNumber(5)];
12 }
13 }
14 static void Main(string[] args)
15 {
16 for (int i = 0; i < 5; i++)
17 {
18 Console.WriteLine(Teenager.Complain());
19 }
20 Console.ReadLine();
c、如果类定义了非静态数据(或者说实例数据),类型的每一个对象都会维护字段的独立副本;静态数据分配一次并且在相同类型的所有对象之间共享。
静态数据字段是由所有对象共享的,因此,如果要定义一个所有对象都可以分享的数据点,就可以使用静态成员。
d、静态构造函数是特殊的构造函数,并且非常适用于初始化在编译时未知的静态数据的值:1、一个类只可以定义一个静态构造函数,换句话说,静态构造函数不能被重载;2、静态构造函数不允许访问修饰符并且不能接受任何参数;3、无论创建了多少类型的对象,静态构造函数只执行一次。。。
e、如果一个类被定义为静态的,就不能使用new关键字来创建,并且只能包含用static关键字标记的成员或字段。
2、默认情况下,类型成员是隐式私有的,而类型是隐式内部的。
嵌套类型上可以应用private访问修饰符,而非嵌套类型只能用public或internal修饰符定义。
3、封装:对象的内部数据不应该从对象实例直接访问,如果调用者想改变对象的状态,就要使用访问方法(getter)和修改方法(setter)。
View Code
1 class Employee
2 {
3 //字段
4 private string empName;
5 private int empId;
6 private float currPay;
7 private int empAge;
8 //构造函数
9 public Employee() { }
10 public Employee(string name, int id, float pay) : this(name, 0, id, pay) { }
11 public Employee(string name, int age, int id, float pay)
12 {
13 Name = name;
14 Age = age;
15 ID = id;
16 Pay = pay;
17 }
18 //方法
19 public void GiveBonus(float amount)
20 {
21 Pay += amount;
22 }
23
24 public void DisplayStats()
25 {
26 Console.WriteLine("Name:{0}",Name);
27 Console.WriteLine("ID:{0}",ID);
28 Console.WriteLine("Age:{0}",Age);
29 Console.WriteLine("Pay:{0}",Pay);
30 }
31 //属性
32 public string Name { get; set; }
33 public int Age { get; set; }
34 public int ID { get; set; }
35 public float Pay { get; set; }
36 }
4、C#用const关键字来定义常量,定义常量是必须为常量指定初始值,常量字段是隐式静态的,不能改变常量,但是可以在类型成员在定义和访问常量。
5、和常量相似,只读字段不能在赋初始值后改变,不同的是它可以在运行时决定,因此在构造函数作用域中进行赋值时合法的(其他地方不行)。
6、只读字段不是静态的,如果在运行时才知道静态只读字段的值,就必须使用静态构造函数。