C#编程语言与面向对象——类与对象
由于ASP.NET技术是全面向对象的,因此,要掌握这一技术,必须具备有扎实的面向对象理论基础
使用C#编程,所有的程序代码几乎都放在类中,不存在独立于类中之外的函数,因此,类是面向对象编程的基本单元
在绝大多数面向对象语言中,一个类都可以包含两种成员:字段和方法。字段与方法这两个概念是面向对象理论的术语,是通用与各种面向对象语言的。而在各种的具体面向对象语言(比如C#)中,可以简单地理解:
字段及变量,方法及函数。
字段:代表了类中的数据,在类的所有方法之外定义一个变量即定义了一个字段。在字段前加public,private和protected表示字段的访问权限。
方法:为了解决代码重复的问题,绝大多数程序设计语言都将完成某一公用功能的多个语句组合在一起,起一个名字用于代表这些语句的全体,这样的代码块被称为“函数”。
C#函数语法格式
返回值类型 方法名(参数列表) { 语句1; 语句2; return 表达式; }
方法需要向外界返回一个值,由return语句实现
如果一个方法没有返回至或者不关心返回值,则将其返回值定义为void。
void 方法名(参数列表) { 语句1; 语句2; return ; //在return后写一个空语句 }
方法重载
class MathOpt { //整数相加 public int Add(int x,int y) { return x+y; } //浮点数相加 pubilc double Add(double x, double y) { return x+y; } }
上述方法名相同,参数类型不同,这两个同名的函数彼此构成了"重载(Overload)"关系。
重载方法调用:
MathOpt mathOpt=null; mathOpt=new MathOpt; int IResutl=mathOpt.Add(100,200); //调用类的整数相加方法 double DResult=mathOpt.Add(5.5,6.6); //调用类的浮点数相加方法 Console.WriteLine("整数结果:"+IResult.ToString()); Console.WriteLine("浮点数结果:"+DResult.ToString());
两个构成重载关系的方法必须满足:
(1):方法名相同。
(2):参数类型不同,或参数个数不同。
public long Add(int x,int y){...} public int Add(int x,int y){...} //这两个方法就不具备构成重载关系,因为这两个函数的实参类型和数目都相 //同,仅返回值类型不同。另外注意C#是区分大小写的语言,因此如果一个类//中有以下两个方法: public long add(int x,int y){...} public long Add(int x,int y){...} //则可以通过编译并且运行,但这并不是说这两个方法构成重载关系。
类的静态成员
类中的方法,如果在声明是没有加“static”关键字,则称之为类的“实例方法(instance method)”。加上static关键字的方法成为“静态方法(static method)”,类似地,加了static关键字的字段成为“静态字段(static field)”。
静态成员在使用的时候不需要创建对象就能使用。
静态成员是供类的所有对象所共享的。
举例
class StaticMembers { public static int staticVar = 0; public int dynamicVar = 0; public void increaseValue() { staticVar++; dynamicVar++; } }
static void Main(string[] args) { StaticMembers obj = null; //创建100个对象 for (int i = 0; i < 100; i++) { obj = new StaticMembers(); obj.increaseValue(); } //查看静态字段与普通字段的值 Console.WriteLine("dynamicVar:" + obj.dynamicVar); Console.WriteLine("staticVar:" + StaticMembers.staticVar); Console.ReadKey(); }
结果为:
dynamicVar:1 staticVar:100
在本节示例中创建了 100 个对象,每个对象拥有 1 个 dyanmicVar 字段,一共有 100 个dyanmicVar 字段,这些字段是独立的, “互不干涉内政” 。而 staticVar 字段仅有一个,为所有对象所共享。
实例成员和静态成员访问规则
同一个类中的实例成员可直接相互调用。
类的字段可以被同一类中的所有实例方法直接访问。
类中的静态方法只能直接访问静态字段。
类的属性
再设计类使用属性(Property)可以保证只有合法的数据可以传给对象
以Name为例,要求不能为空。
//定义私有字段 private String _Name="姓名默认值"; //定义Name属性 public String Name { get { return _Name; } set { if(value.Lengh==0) throw new Exception("姓名不能为空"); _Name=value; } }
属性由两个特殊的读访问器(get)和写访问器(set)组成。
当读取Name属性时,读访问器被调用,仅返回私有字段_Name;
当设置Name属性时,写访问器被调用,先检查是否符合条件,再将传入的值保存在私有字段中。
编写属性方法:
1).设计一个私有的字段用于保存属性的数据;
2).设计get、set访问器存取私有字段数据。
深入理解类与对象
类和对象的区别
对象是以类为模版创建出来的。类与对象之间是一对多的关系。
在C#中,使用new 关键字创建对象。
在程序中“活跃”的是对象而不是类。
“对象”与“类的实例”这两个概念是同等的。
类的构造函数
当使用new关键字创建一个对象时,一个特殊的函数被自动调用,这就是类的构造函数(constructor)。
构造函数与类的名字相同,没有返回值
class A { //类A的构造函数 public A() { } }
构造函数在以类为模版创建对象是被自动调用,一般用于初始化类的私有数据字段。
引用类型与值类型
.net将变量类型分为“值类型”与“引用类型”,如int和float之类的变量属于值类型,而“类”类型的变量则属于“引用类型”。
两者区别
值类型的变量一定义之后就马上可用。
引用类型的变量定以后,还必须用new关键字创建对象才可以使用。
值类型与引用类型内存分配:
内存区域主要分为线程堆栈(Thread Stack)和托管堆(Managed Heap)
值类型都是在线程堆栈中分配而引用类型是在托管堆中分配
理解值类型和引用类型在面向对象编程中非常关键