对象和类型
对象(Object)是问题域或实现域中某些事物的一个抽象,它反映此事物在系统中需要保存的信息和发挥的作用;它是一组属性和有权对这些属性进行操作的一组服务的封装体。
面向对象编程将数据和方法封装在一个整体(类)里面,通过定义一个类,将一系列具有相同抽象概念的事物的共同特性概括起来,并在类中定义对数据的处理和访问方法。
类型包含引用类型和值类型,结构是指类型,类是引用类型,结构和类实际都是创建对象的模板。
类
在面向对象编程中,类是最基本的单位,包含静态成员和实例成员。静态成员用static修饰。成员列表如图:
字段
与类相关的变量,一般用private修饰,最好不要直接访问字段,而是通过属性访问,因为一旦修改字段,必须要经过重新编译。
class customer()
{
private string name;
private int age;
}
属性
可以通过客户端访问的一对方法,包含get和set访问器,来检索和设置支持字段的值。
class customer()
{
private string name;
public string Name
{
get{return name;}
set{name=value;}
}
}
- 可以不写逻辑,直接用属性初始化器实现自动属性
- 可以给set添加访问修饰符,来限制访问
- 可以只写其中一个属性,只读或只写
方法
和类相关的访问数据和处理数据的函数。
访问修饰符 返回值 方法名 (参数类型 参数名称)
{ 函数体}
public bool IsSquare(Rectangle rect)
{
return rect.width==rect.height;
}
- 若函数体只有一条语句,可以使用表达式体:lambda表达式
- 方法的重载,方法名称相同,参数个数或者参数类型不同
- 参数的命名,若参数通过名称很难区分,可以添加命名
r.move(10,20,30);
r.move(X:10,Y:20,Z:30);
- 可选参数,放在最后一个,给定默认值
public void Test(int x,int y=10)
{
Console.WriteLine(x+y);
}
可以传递一个参数x=10——>Test(20)
也可以传递两个参数x=10,y=20——>Test(30)
- 个数可变的参数,通过声明数组(eg :int)类型的参数,添加params关键字,则可以使用任意个int类型参数调用该方法。
public void AnyNumeber(params int[]data)
{
foreach(int a in data)
{
Console.WriteLine(a);
}
}
构造函数
与类同名,但是没有返回类型的方法,若不带参数,可以不声明,编译器自动生成。
- 从构造函数内调用其他构造函数,包含几个构造函数,将同样的字段放在一起,通过构造函数初始化器,利用this关键字来选择最合适的那个构造函数。
- 静态构造函数,只能有一个,用static修饰,只执行一次,不能带参数,只能访问静态的成员
结构
用关键字struck修饰,值类型,存储在堆栈上stack,不支持继承。当需要小的数据结构,而不需要复杂的实现时用结构,性能损失小。
- ref 参数,按引用传递,无论定义还是调用都需要加上这个关键字
- out参数,若返回多个值,并且类型不同,利用out输出不同类型的参数
// 解析是否类型转换成功
string input=Console.ReadLine();
int result;
if (int.TryParse(input,out result))
{
Console.WriteLine(result);
}
部分类
partial关键字,一般在winform窗体生成时,默认的很多属性通过代码生成器放在一起,自定义用代码实现的部分放在一起,代码放的位置不同,编译时会合成一个类
Object类
所有类的基类,包含很多公共的方法:
- ToString(),获取对象的字符串
- GetHashCode(),若对象放在字典数据结构中,通过此方法来确定把对象放在结构的什么地方
- Equals(),比较对象相等性
- Finalize(),引用对象作为垃圾被回收清理资源时调用
- GetType(),返回从Syste.Type中派生的类的一个实例
- Clone(),浅层复制对象