一步一步学习C#(三对象和类型)

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#中,不存在独立的函数,都必须与类或结构相关,以后我们所要做的函数,其实就是方法了

 用out关键字定义,可以实现ref+不需要初始化的功能。 。

方法的声名:

 

复制代码
代码
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
复制代码

 

 

 

posted on   MR_ke  阅读(1062)  评论(0编辑  收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示