类与对象浅析
类是创建对象的模板,是对象的概括和描述
声明:<类修饰符> class <类名><:基类或者接口>{类体}
1、类的几种修饰符简介
public 公开访问
protected 类和所在类的子类才能访问
internal 只有所在类才能访问
private 只有.net中的应用程序和库才能访问
abstract 抽象类,不允许建立类的实例
sealed 密封类,不允许被继承
2、类的构造函数
构造函数是特殊的成员函数是一种方法,与类同名,通常用来初始化新对象并为对象分配内存!
示例:
public class people
{
public people()
{
Console.WriteLine("无参类");
Console.ReadKey();
}
public people(int age)
{
Console.WriteLine("年龄:"+age);
Console.ReadKey();
}
public people(string name)
{
Console.WriteLine("姓名:"+name);
Console.ReadKey();
}
}
class Program
{
static void Main(string[] args)
{
people p1 = new people();
people p2 = new people(19);
people p3 = new people("赵钱孙");
}
}
3、类的析构函数(类~命名,自动调用,用于垃圾回收)
4、对象(具有数据、行为、标识 的编程结构;可以包含变量成员、方法类型,也可能不包含数据,只包含方法并用方法表示一个过程;也可以称为类的实例)
people p3 = new people("赵钱孙"); p2即是people类的实例化对象
类是具有相同或相似结构、操作和约束规则的对象组成的一个集合,而对象是某一类的具体化实例,每个类都是具有某些共同特征的对象的抽象。
5、内部类(一种特殊的类,嵌套在类的内部)(内部类无法使用console类)
6、分布类(将接口、类、结构的定义拆分到2个或多个源文件中,每个源文件包含类定义的一部分,编译时再组合起来。例如创建windows窗体应用程序,即有分布类的使用。)
字段和属性
字段是程序中常见的部分,是类的一个构成部分,使得类和结构可以封装数据,
string name = string.Empty;//定义只读空字段
public student()//在构造函数中对只读字段初始化
{
name = "tom";
}
只读字段和常量 的区别(扩展):一个值在程序中保持不变,且在编写程序时已经知道这个值,那么是常量;编写程序时不知道,在运行时才得到,且一旦得到这个值就不会再改变,就是字段。
属性是对现实实体特征的抽象,提供对类或对象性质的访问。属性提供了一套机制,把读取和写入对象的某些特征与一些操作管理起来。属性不能作为ref参数和out参数传递。
<修饰符><类型><属性名(首字母大写)>{get{};set{};}
{ int age = 18;
public int Age
{
get
{
return age;
}
set
{
if(value>18&&value<100)
age = value;
}
}
上面是属性的定义代码,下面是属性在主方法中的使用,属性可以对赋予的值进行检查,避免因赋予错误的值导致的错误!
Console.WriteLine(p1.Age);
p1.Age = 40;
Console.WriteLine(p1.Age);
属性和字段的区别:属性和字段都可以访问对象中包含的数据。对象数据用来区分不同的对象,同一个类的不同对象可以在属性和字段中存储了不同的值。对象和属性都可以输入,通常把信息存储在字段和属性中,但属性和字段是不同的,属性不能直接访问数据,字段可以直接访问数据。在属性中可以添加对数据访问的限制。
通常提供属性,因属性可以更好的控制访问过程和读写权限。除此之外,属性的可访问性确定了哪些代码可以访问这些成员,可以声明公有、私有或其他更为复杂的方式。
方法
方法的声明格式:
<修饰符><返回类型><方法名>(形式参数列表) {<方法体>}
静态方法是一种特殊的方法,他不属于类 的某个具体实例或对象,而是属于类本身,只能访问类中的静态成员。访问静态方法只能使用类名,不需要创建对象,也不能使用对象名来引用。静态方法不支持this关键字。
非静态方法必须使用类的实例或对象来调用。
名称相同,参数不同的方法称为重载方法。
结构:
结构是一种可以包含数据成员和方法成员的值类型数据结构,具有以下特点:结构是值类型;向方法传递结构时,是通过传值传递的,而不是作为引用传递;结构是实例化可以不使用new关键字;结构可以声明构造函数,但必须带参数;一个结构不能从另一个结构或类继承;结构可以实现接口;结构中不可以实例化字段。
语法:<结构修饰符> struct <结构名>{结构体}
结构特别适合表示点、矩形、颜色这样的轻量对象(自:结构是组合属性、方法实现较为简单的对象,类似简单、基础的工件:方便复用)
枚举:
枚举是一种独特的值类型,用于声明一组命名的常量。
语法:<枚举修饰符> enum <枚举名>{枚举体}
/// <summary> 通过枚举列举一周7天
/// 通过枚举列举一周7天
/// </summary>
public enum MyDate
{
Sun=0,
Mon=1,
Tue=2,
Wed=3,
Thr=4,
Fri=5,
Sat=6
}
主方法中调用:
MyDate date=(MyDate)(int.Parse(Console.ReadLine()));
switch(date)
{
case MyDate.Sun:
Console.WriteLine("今天是周日");
break;
case MyDate.Mon:
Console.WriteLine("今天是周一");
break;
case MyDate.Tue:
Console.WriteLine("今天是周二");
break;
}
枚举有一些使用限制:枚举不能定义自己的方法;枚举不能实现接口;枚举中不能定义属性或事件。
枚举补充:
枚举是一个指定的常数
枚举的基础类型可以是除 Char 外的任何整型。如果没有显式声明基础类型,则使用 Int32。编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举。
Enum 提供比较此类的实例的方法、将实例的值转换为其字符串表示形式的方法、将数字的字符串表示形式转换为此类的实例的方法和创建指定枚举和值的实例的方法。
每一个枚举元素都是一个对象!
可以用普通类模拟枚举的实现
枚举的常用方法示例:
public enum WeekDay //enum 枚举代码段,Enum枚举的基类 星期
{ SUN,MON,TUE,WED,THI,FRI,SAT }
主方法:
WeekDay week1 = new WeekDay();//默认初始化为第一个枚举值
Console.WriteLine(week1);
WeekDay week2 = WeekDay.SAT;
Console.WriteLine(week2.GetType());//获得枚举类型
Console.WriteLine(Enum.GetName(typeof(WeekDay), 3));//在指定枚举中检索具有指定值的常数的名称。
foreach(string s in Enum.GetNames(typeof(WeekDay)))//遍历枚举中的值
Console.WriteLine(s);
Console.WriteLine(Enum.IsDefined(typeof(WeekDay), 7));//枚举中是否有常数7 对应的值
注意事项:
枚举最好声明为值为0的成员,否则枚举在创建时将包含非法值
如果明显存在应用程序表示的默认情况,请考虑使用值为零的枚举常量表示默认值。如果不存在默认情况,请考虑使用值为零的枚举常量(这指定该情况不由任何其他枚举常量表示)。