C#面向对象笔记

面向对象(Object Oriented Programming)

面向过程的语言:C语言

------------------------------------

--方法,类,命名空间的关系--

方法和函数是属于某个类的.

一个类可以声音几个属性.也能声明几个方法或函数

基本上类库这种概念.有的话就是所有类的集合就算是类库了.

一个类文件声明时会指定属于哪个命名空间的.

把类比作一个人.那么吃饭就是人的一种方法或函数.

你住的房间就是命名空间.这样别人你的时候就知道上哪个房间找你了.但这房间里不一定会只有你一个人.

 

-->>对象

对象是具有数据、行为和标识的三部分编程结构。

对象的数据包含在对象的字段、属性、事件中。

对象的行为则由对象的方法和接口定义。

对象通过classestruts定义。

对象通过标识来区分是否相同。

对象都是从类和结构中定义的模板实例化得到。

均继承于Object类。

 

以对象为单位,考虑它的属性和方法,而不考虑具体实现过程

 

OOP 的主要思想:将处理数据的操作封装到类(class)中

      使用类时,定义的变量叫对象(Object

 

面向对象的三大特性:

– 封装,隐藏内部实现(类,修饰符)

– 继承,复用现有代码

– 多态,改写对象行为(方法重载)

 

类:一组具有相同数据结构和相同操作对象的集合

   由方法成员、数据成员组成

 

对象:类的实例化

类的访问:

-->>实例方法

没有加static的方法或属性,

先实例化 类名 实例名=new 类名;

实例名.方法名  实例名.属性  来访问

 

-->>静态方法

static的方法或属性:

访问:类名.属性   类名.方法名

 

[访问修饰符] class 类名 [:基类]

{

类成员(变量、常量 、属性、事件、操作符、索引器等)定义

}

 

5个常用的访问修饰符:

1.public : 公有成员,任何类都可访问

  

2.private: 私有成员,当前类下可访问

3.internal: 当前项目下可访问

4.protected: 受保护的成员,本类和子类可以访问.

5.protected internal:同一个.NET集合或继承此类的子类可以访问.

 

命名空间下默认的修饰符:

结构体(struct)intrnal(本项目可访问)

枚举(enum)intrnal

(class) intrnal

类中的成员private(私有)

 

类 数据 方法

变量: 

静态变量 如:public static int iage;

实例变量static

方法: 

静态方法 如:public static void Do(){}

实例方法 无static

 

类的实例化:

类名 实例名(对象名)=new 类名(参数);

 

class Person

{

public string name;//数据成员、变量成员、全局变量

        public string sex;

        public int age;

 

        public void Speak()//公有实例无返回值方法

        {

            Console.WriteLine("姓名:{0}\n性别:{1}\n年龄:{2}", name, sex, age);

}

public static void say()//公有静态无返回值方法

        {

            Console.WriteLine("大家好!");

        }

}

 

调用:

Person zs = new Person();//类的实例化

 

            zs.name = "张三";

            zs.sex = "";

            zs.age = 25;

 

            zs.Speak();//实例方法访问

    Person.say();//静态方法访问

 

注:

同一个类下,实例方法可以直接访问静态和实例成员

同一个类下,静态方法只能直接访问静态成员(加static的成员)

静态成员的访问不用实例化,访问时:类名.实例名

 

实例化时数据类型的初始化:

数值型  00.0

sring  null

char  \0

字段与属性:

在类中定义的变量为字段

字段有三个属性:只读,只写,可读写

 

属性:   定义一个公共的具有get/set方法的变量,这个变量用于保护一个私有变量

读写属性:具有get/set方法的属性

只读:只有get方法的属性

只写:只有set方法的属性

 

注:

字段命名:首字母小写(骆驼命名法)

属性命名:首字母大写(帕斯卡命名法)

属性是为了保证对字段的读取和赋值符合要求

允许外部访问的变量一定要声明为属性

 

命名空间:namespace 名字

用于建立类并解决类的重名(类的文件夹)

System 是根命名空间

 

类的调用:

不同命名空间下类的访问:

1.using 命名空间名(引用命名空间)

2.命名空间名.类名

 

方法:(Member Function)用来操作类的数据

方法头 方法体

 

方法的重载的特点是(两必须一可以):

·           方法名必须相同

·           参数列表必须不相同

·           返回值类型可以不相同

 

方法的参数类型:

值类型:int x

引用类型: ref int x

输出类型: out int x

数组类型:params int[] arrlist 或 arrMylnt(数组)-----引用型

 

refout的区别:

ref 在使用前必需初始化,而out不需要。

ref 引入变量,有进有出

out 引出变量,只出不进

out 参数在进入方法(函数)时后清空自己

两者都是按地址传递,使用后都将改变原来的数值。

out适合用在需要retrun多个返回值的地方,

ref则用在需要被调用的方法修改调用者的引用的时候。

 

值类型与引用类型比较:

值类型引用类型

存储位置:存实际值存指向实际值的引用地址

内存分配:堆栈托管堆

内存需求:较少较大

执行效率:较快较慢

内存释放时间点:超过变量的作用域空窗时期回收

是否可以为null:不能可以

 

构造方法(函数)[析构函数]

构造方法

创建对象:用于给类的成员赋初始值

 

方法名与类名相同

class  类名{

        访问权限  类名称(类型参数1,类型参数2,......

              {

                  程序语句;

               }

            }

注:

构造方法没有返回值,不用void

名字与类名相同

类有一个默认的无参构造方法

一旦定义了一个构造方法,默认的构造方法将不复存在

 

构造方法的重载:

方法的不同版本,同一种方法,不同的参数

实现重载的条件:个数/类型/顺序

 

析构函数:

用于回收对象,释放内存空间

不能在结构中定义,只能用于类

一个类只有一个析构函数

无法继承或重载,没有修饰符,也无参数

无法调用,系统自动调用

如:~Student(){}    一般在程序结束时使用,最后使用

 

抛异常(报错)

throw new Exception ("错误信息");

或者:

Exception ex = new Exception("错误信息");

throw ex;

 

==>>>String 字符串类:

相当于char的只读数组集合

具有不可变性,一旦声明就不能再改变,只能通过索引来读取指定位置的char

不能对指定位置的char进行修改

字符串重复赋值时,原值不会消失,新值以新内存空间存储(引用型)

 

bool StartsWith(d)判断字符串是否以d开头

bool EndsWith(d)判断字符串是否以d结尾

int IndexOf(b)查找b在字符串中的位置

int IndexOf(b, 5)从索引号5的位置开始查找b的位置

 

字符串与char数组的转换:

ToCharArraynew string(arr);

    string word = "Hello word!";

            char[] chars = word.ToCharArray();//将字符串转换为char数组

            chars[4] = '';

            word = new string(chars);//char数组生成一个字符串

            Console.WriteLine(word);

输出结果:Hell哦 word!

 

字符串的切割:

string data = "2000.2.5";

        string[] D = data.Split('.');//将字符串按.分割,存入string数组中

 

string大写与小写转换:

string ToLower():得到字符串的小写形式

string ToUpper():得到字符串的大写形式

Trim():去掉字符串两端的空白

s1.Equals(s2.StringComparison.OrdinallgnoreCase)

两个字符串忽略大小写比较

例如:比较 s1 == s2

    string s1 = "hello";

            string s2 = "HEllO";

            s1 = s1.ToUpper();//s1 = s1.ToLower();

            s2 = s2.ToUpper();//s2 = s2.ToLower();

 

字符串的替换:

string Replace(参数1,参数2)参数只能是charstring

把参数1替换成参数2

 

字符串的截取:

string Substring (int1,[int2]) 截取字符串

int1:索引位置

int2:长度

 

字符串的连接:

string C = string.Concat(A, B);//将字符串AB拼接

 

字符串的查找:

int i = A.IndexOf('e');//从左向右找e,返回其索引号

        int i2 = A.IndexOf('e',3,5);//从索引号3开始的5个数里查找e,返回其索引号

bool b=str.Contains('a');//判断字符串中是否含有字符a,返回布尔值

** IndexOfContains的区别:

* IndexOf返还的是索引号,Contains返回的是truefalse

使用Contains方法的效率比IndexOf的效率高很多

 

判断字符串否以指定的字符开头或结尾:

bool a = A.StartsWith("W");//判断字符串是否以W开始,返回TrueFalse

        bool b = B.EndsWith("t");//判断字符串是否以t结尾,返回TrueFalse

 

判断字符串是否相同 :

bool x = A == B;

bool x1 = string.Equals(A,B);

bool x2 = A.Equals(B);

 

字符串的复制:Copy();

string A1 = string.Copy(A);(不常用)

 

字符串的截取:

string Substring (int1,[int2]) 截取字符串

int1:索引位置

int2:长度

string m1 = C.Substring(5);//从索引号5开始截取,截取到最后

        string m2 = C.Substring(5,3);//从索引号5开始截取3个字符

 

去除字符串两端的空格:

   string r = "   1  22 2   ";

           string R1 = r.TrimStart();//去除字符串前面的空格

           string R2 = r.TrimEnd();//去除字符串后面的空格

           string R3 = r.Trim();//去除字符串两端的空格

 

向字符串中插入元素:

string R4 = r.Insert(4,"eee");//将字符串eee插入到索引号为4的后面

 

 

Format格式化字符串 Copy复制 Insert插入........

 

===========

**类的继承**

===========

基类(父类):被继承的类

派生类(子类):继承自其它类的类

 

继承性的语法:

[访问修饰符] class 派生类名称:基类

public class ChildClass:BaseClass{}

 

C#只允许单继承

派生类只能继承一个基类(也就是一个子类只能有一个父类)

一个类可以是基类也可以是派生类

 

在静态方法中不能使用this关键字

 

========

**封装**

========

1.模块信息通过类来封装

2.对象是封装的基本单位

3.类的成员通过字段、属性、方法、事件封装

4.类的成员通过修饰符来封装(private/public/protected

 

========

**多态**

========

相同方法的不同能力的实现

 

实现多态的方式 :

重载、继承、抽象类、接口

 

虚方法:virtual

写于基类中

覆盖(重写):override

写于派生类中,用于覆盖父类的虚方法

重写的方法名、参数个数、类型及返回值都必须和虚方法一致

 

抽象类:(Abstract Class

类有两种:一种是具体类,另一种是抽象类

具体类可以实例化,抽象类不可以实例化。在类声明中使用 abstract 修饰符以指示类只能是其他类的基类。

 

public  abstract class Animal{ }

 

抽象类的特点:

1)抽象方法是隐式的 virtual 方法。 

 

2)只允许在抽象类中使用抽象方法声明。 

 

3)因为抽象方法声明不提供实现,所以没有方法体;

4)在抽象方法声明中使用 static 或 virtual 修饰符是错误的。 

5)在派生类中,通过包括使用 override 修饰符的属性声明可以重写抽象的继承属性。

 

密封类:

密封类不能用作基类。它也不能是抽象类。

 

密封类主要用于防止派生。

 

使用sealed关键字创建密封类:

 

public  sealed class Animal{ }

 

<<<<<<<==========================>>>>>>>>>

     目录和文件操作

<<<<<<<==========================>>>>>>>>>

 

先导入命名空间using System.IO;

 

=>>目录操作:Directory静态/DirectoryInfo实例

 

创建目录:CreateDirectory()

Directory.CreateDirectory(@"E:\work\00000\1111");

 

删除目录:Delete()

Directory.Delete(@"E:\work", true);

 

获取文件夹目录:GetDirectories()

string[] dirs = Directory.GetDirectories(@"e:\");

 

获取计算机的逻辑驱动器:GetLogicalDrives()

string[] logic = Directory.GetLogicalDrives();

 

获取文件目录: GetFiles()

        string[] files = Directory.GetFiles(@"d:\");

 

获取文件创建日期和时间

        DateTime dt = Directory.GetCreationTime(@"d:\2003");

 

获取当前应用程序的工作目录: GetCurrentDirectory()

        Console.WriteLine(Directory.GetCurrentDirectory());

 

判断文件是否存在: Exists()

        bool ex = Directory.Exists(@"d:\2003")

 

获取文件上次的访问时间:

        Console.WriteLine(Directory.GetLastAccessTime(@"d:\2003"));

 

同盘符下移动文件夹:

Directory.Move(@"d:\00\11",@"d:\22\11");

 

获取文件最后一次修改时间:

        Console.WriteLine(Directory.GetLastWriteTime(@"d:\2003"));

 

DirectoryInfo类:

Name : 当前实例名

            

Parent : 当前实例的上一级父目录名

            

Root :  当前实例所在根目录名

            

CreationTime :  当前实例创建时间

            

LastAccessTime :  当前实例上次被访问时间

            

LastWriteTime :当前实例上次修改时间

 

DirectoryInfo dir1 = new DirectoryInfo(@"e:\22\11");

        string na = dir1.Name;

 

=>>文件操作:File/FileInfo

 

File类:静态

Create(string path ) :创建文件

Delete( string path) :删除文件

Copy( string spath,string dpath) : 复制文件

Move(string spath,string dpath) : 移动文件

Exists(string path) : 判断文件是否存在

 

FileInfo类:实例

Name : 获取当前文件的名称

 

Extension  : 获取当前文件扩展名

 

FullName : 获取文件所在的完整路径。

 

Exists : 检查当前文件是否存在

 

Length : 获取当前文件的大小。

 

Directory : 获取父目录的

DirectoryInfo.

DirectoryName : 获取文件的完整目录路径

 

向文件中写入数据:

            StreamWriter x = new StreamWriter(@"e:\001.txt");

            x.Write("欢迎你来到这个地方!");

            x.Close();

 

 

==>>异常捕获

 

C#中异常都是以类的形式出现的,

所有的异常类的基类是:Exception

常见的几个异常类:

    

ArrayTypeMismatchException:当向数组中保存一个与元素类型不兼容的值时,将会抛出该异常。

    

DivideByZeroException:当除数为0时,将会抛出该异常。

    

IndexOutofRangeException:使用超出数组边界的索引时,将会抛出该异常。

 

try catch 方法:捕捉异常,提示错误!

语法格式:

          

try

            

{      语句块      }

catch(异常对象声明1)

             

{      语句块1     }

     

catch(异常对象声明2)

        

{      语句块2     }

      

……

finally        

        

{       存在于异常处理的标准事件流之外。

用来清理资源或还原相关设置信息等其他操作

是否发生异常,均要执行的代码块;      }

 

注:

Try 块的代码是程序中可能出现错误的操作部分。

 

Catch 块的代码是用来处理各种错误的部分(可以有多个)。

finally语句,无论是否产生异常,Finally块都会执行。

例:

try

{

Console.WriteLine("请输入一个整数:");

        int a = int.Parse(Console.ReadLine());

}

catch (Exception m)

{

       Console.WriteLine("输入错误,错误为:"+m.Message);

//如果输入字符不能转换为int,输出:输入错误,错误为:输入字符串格式不正确

}

 

 

 

throw

用于引发异常,可引发预定义异常和自定义异常。 

throw new Exception("出错时的提示");

posted @ 2012-11-03 11:06  TOGGLE  阅读(497)  评论(0)    收藏  举报