函数在成为类的成员之后,就被成为方法。
方法永远都是类或者结构体(用struct生成)的成员
结构体跟类很相似,也能定义字段,方法和构造函数,都能实例化对象,但是数据存储不同。
struct Books{ public string title; public string author; public string subject; public int book_id;};
https://blog.csdn.net/Circle__Gossoon/article/details/52126583
这两种数据类型的本质区别主要是各自指向的内存位置不同。传递类的时候,主要表现为是否同时改变了源对象。
1.结构体是值类型,类是引用类型
虽然结构体的初始化也使用了new操作符,可是结构体对象依然分配在堆栈上而不是堆上
类在传递的时候,传递的内容是位于托管内存中的位置,结构体在传递的时候,传递的内容是位于程序堆栈区的内容。当类的传递对象修改时,将同时修改源对象,而结构体的传递对象修改时,不会对源对象产生影响。
堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑
因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用
注:
a.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object
b.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用
2.结构体不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed
类完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
虽然结构不能被继承,可是结构能够继承接口,方法和类继承接口一样
3.结构:不能包含显式默认构造函数;没有析构函数,没有abstract和sealed(因为不能继承);不能有protected修饰符,可以不使用new初始化
在结构中初始化实例字段是错误的
类: 有默认的构造函数,有析构函数,可以使用abstract和sealed,有protected修饰符,必须使用new初始化。
如何选择结构还是类
讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:
1. 堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些
2. 结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。
3. 在表现抽象和多级别的对象层次时,类是最好的选择
4. 大多数情况下该类型只是一些数据时,结构时最佳的选择
方法调用的目的
1)复用 reuse
2)隐藏复杂的计算过程和逻辑
3)分解计算过程:自顶向下,逐步求精
方法的声明就是方法的定义
方法的构成包括
方法头:
有效的修饰符组合 + 方法名 + (参数列表)
1)有效的修饰符组合
2)方法的名字
方法的命名必须是一个动词或动词短语,所有单词的首字母大写。
3)参数列表
参数指的是Parameter, 全称 formal parameter ,简称“形参”。形参会参与构成方法的算法逻辑。跑龙套,在形式上,让算法能够通过编译。
Parameter是一种变量,C#有7种变量,其中有三种是参数(值参数,引用参数和输出参数)
方法体
1)语句
可以是语句块,
也可以 甚至只有一个分号 ";",说明它的算法还没有实现,被成为抽象方法。
2)返回值
void不需要返回值,其他要return
方法的调用
在方法名后跟上一对圆括号,在圆括号内写入必要的实际参数(argument)。
只有在方法后面加了圆括号,才算是调用了这个方法。
形参用于声明变量,实参意味着调用这个方法时的真实条件。实参必须和方法定义中的形参一致(数量一致,类型一致)
静态方法和实例方法
所有非静态方法都是实例方法。//public的实例方法,可以用 “方法实例+“.”" 来调用
静态方法隶属于类,跟类是绑定的。
public static 的静态方法,必须要用 “类+“.”" 来调用