1.类和结构
类
1 class PhoneCustomer
2 {
3 public const string DayOfSendingBill ="Monday";
4 public int CustomerID;
5 public string FirstName;
6 public string LastName;
7 }
8
结构
1 struct PhoneCustomerStruct
2 {
3 public const string DayOfSendingBill = "Monday";
4 public int CustomerID;
5 public string FirstName;
6 public string LastName;
7 }
8
类和机构相同点:
(1)类和结构都是创建对象的模板。
(2)都可以包含字段和方法。
(3)都需要用new实例化。
(4)类中可以初始化非常量字段值,但是结构中不可以初始化非常量字段值。
(5)结构是值类型,使用结构可以提高性能,类是引用类型
(6)结构不支持继承
(7)类要比结构常用得多。
区别:
(1)结构好像缩小的类。
(2)结构是值类型,不是引用类型。
(3)结构不支持继承。
(4) 结构的构造函数不能无参,无参构造函数是系统默认的。
类成员:
(1)类的成员包括数据和函数(方法)。
(2)类中可以嵌套其它的类型(例如类)。
(3)public 可以在类的外部直接访问它们 private 只能在类中使用。
数据成员:
(1)数据成员叫字段。
(2)它必须跟类一起被引用Customer1.FirstName = "Simon";
(3)定义为public,则可以在外部访问,如果定义为private,或者有const关键字定义,则不可以访问。
函数成员:
(1)函数成员就是方法、属性、构造函数、析构函数、运算符、索引器
(2)构造函数是实例化对象时首先处理的函数。它与所属的类同名,不能有返回类型。一般构造函数用于初始化字段的值。构造函数可以不定义。
(3)析构函数是销毁对象时调用的。它们的名称也与类相同,但前面有一个~符号。前面不能定义参数。
2.方法
(1)在C#中,不存在独立的函数,都必须与类或结构相关,以后我们所要做的函数,其实就是方法了
方法的声名:
代码
1 (1)用public或private来修饰,定义如下:[modifiers] return_type MethodName([parameters])
2 {
3 // Method body
4 }
5 (2)没有参数要加void,如果有返回值,则要用return return_type_value来返回。
6 (3)例如:
7 public bool IsSquare(Rectangle rect)
8 {
9 return (rect.Height == rect.Width);
10 }
11
调用方法:
代码
1 class MathTest
2 {
3 public int value;
4 public int GetSquare()
5 {
6 return value * value;
7 }
8 public static int GetSquareOf(int x)
9 {
10 return x * x;
11 }
12 public static double GetPi()
13 {
14 return 3.14159;
15 }
16 }
17 //调用静态函数
18 Console.WriteLine("Pi is " + MathTest.GetPi());
19 int x = MathTest.GetSquareOf(5);
20 Console.WriteLine("Square of 5 is " + x);
21 //实例化MathTest对象
22 MathTest math = new MathTest();
23 //调用非静态函数
24 math.value = 30;
25 Console.WriteLine(
26 "Value field of math variable contains " + math.value);
27 Console.WriteLine("Square of 30 is " + math.GetSquare());
28 Console.ReadLine();
给方法传递参数:
1.值传递。
2.引用传递(地址传递)
代码
1 首先声明一个方法:
2 static void SomeFunction(int[] ints, int i)
3 {
4 ints[0] = 100;
5 i = 100;
6 }
7 调用它:
8 int i = 0;
9 int[] ints = { 0, 1, 2, 4, 8 };
10 // 显示初始值
11 Console.WriteLine("i = " + i);
12 Console.WriteLine("ints[0] = " + ints[0]);
13 Console.WriteLine("Calling SomeFunction...");
14 // 在调用方法后,返回值改变,但是i不改变
15 SomeFunction(ints, i);
16 Console.WriteLine("i = " + i);
17 Console.WriteLine("ints[0] = " + ints[0]);
18 Console.ReadLine();
19
ref 和 out 修饰符:
ref
(1)默认为值传送
(2)ref关键字将值传送改为引用传送
static void SomeFunction(int[] ints, ref int i)
{
ints[0] = 100;
i = 100; //the change to i will persist after SomeFunction() exits
}
(3)调用时也要加上ref。
SomeFunction(ints, ref i);
(4)传入参数在调用之前必须初始化。
out
1 用out关键字定义,可以实现ref+不需要初始化的功能。
2
3.属性
1 一种特殊的方法:
2 public string SomeProperty
3 {
4 get
5 {
6 return "This is the property value";
7 }
8 set
9 {
10 // do whatever needs to be done to set the property
11 }
12 }
13 实际使用:
14 mainForm.Height = 400;
15 //其实是调用了public int Height { set { //…}}
16 注意:
17 Get和set访问器都不带参数
18 Value为赋给ForeName 的值
19 公共属性第一个字母大写,而私有字段第一个字母小写,有时候会用_foreName来表示。
20 (1)设置只有get的则是只读
21 (2)设置只有set的则是只写
22 (3)可以设置public和private来修改属性
23
4.构造函数
1 public class MyClass
2 {
3 public MyClass()
4 {
5 }
6 (1)同名
7 (2)没有也可以,系统默认一个
8 (3)可以重载,如:
9 public MyClass() // zero-parameter constructor
10 {
11 // construction code
12 }
13 public MyClass(int number) // another overload
14 {
15 // construction code
16 }
17 (1)如果提供了带参数的构造函数,编译器就不会自动提供默认的构造函数
18 (2)使用this关键字区分成员字段和同名的参数。
19 (3)实例化时要带参数
20 (4)构造函数如果定义为private或protected,则不能实例化它
21
22
23 静态构造函数:
24 class MyClass
25 {
26 static MyClass()
27 {
28 // initialization code
29 }
30 // rest of class definition
31 }
32 1 如果没有构造函数,那么会执行默认构造函数在实例化的时候
33 2 如果访问一个类中的静态成员,那么默认构造函数将不会执行
34 3 如果类中的构造函数是静态的,那么访问静态成员,构造函数会执行一次,下一次再访问静态成员,则不会执行了
35
5.obect类
1 (1)所有的.NET类与类型都派生于System.Object。
2 其中类都派生于object
3 而值类型则通过system.valuetype间接派生于system.object。它们的关系是
4 System.object-system.valuetype-值类型
5 (2)所有的值类型都是结构
6 (3)结构继承于valuetype类,不代表结构可以继承,你自己用就不可以继承,这是微软做的规定。
7
8 object类提供的原始方法有:
9 (1)静态的
10 Equal(object a,object b)
11 ReferenceEquals(object a,object b)
12 (2.1)非静态公共的
13 Equal(object a)
14 GetHashCode()
15 GetType()
16 ToString()
17 (2.2)非静态受保护的
18 Finalize ()
19 MemberwiseClone()
20 ToString()方法:获取对象的字符串表示。
21 GetHash|Code()方法:返回唯一的对象哈希码,这个码是唯一的。
22 Equals()(两个版本)和ReferenceEquals()方法:比较两个类的实例是否相同,在运算符重载时讲解。
23 Finalize()方法:析构函数调用的方法。
24 GetType()方法:返回从System.Type派生的类的一个实例。是反射技术的入口。
25 MemberwiseClone()方法:对象的浅复制(阴影复制)
26
27 备注中的代码演示了这几个方法的使用
28 Object对象还提供了继承类可以对三个方法的重写
29 见备注中的代码
30
代码:
代码
1 class Program:object
2 {
3
4 static void Main(string[] args)
5 {
6 Money cash1 = new Money();
7 cash1.Amount = 40M;
8 Console.WriteLine("cash1.ToString() returns: " + cash1.ToString());
9 Money cash2 = cash1;
10 Console.WriteLine("因为改写了equals方法,所以返回值永远是false " + cash1.Equals(cash2));
11 Console.WriteLine("因为改写了gethashcode方法,所以返回值永远是 " + cash1.GetHashCode());
12 Console.ReadLine();
13
14 }
15
16 }
17
18 class Money
19 {
20 private decimal amount;
21 public decimal Amount
22 {
23 get
24 {
25 return amount;
26 }
27 set
28 {
29 amount = value;
30 }
31 }
32 public override string ToString()
33 {
34 return "$" + Amount.ToString();
35 }
36 public override bool Equals(object obj)
37 {
38 //return base.Equals(obj);
39 return false;
40 }
41 public override int GetHashCode()
42 {
43 return 1;
44 //return base.GetHashCode();
45 }
46 }
47