黑马程序员_学习日记37_601基础加强(enums_truct_类型转换_值类型与引用类型_异常处理_函数返回值)

来源:互联网 发布:决战武林地煞1-10数据 编辑:程序博客网 时间:2024/06/10 19:36

1、索引器我理解索引器是给数组提供了成为属性的方法

public class Chinese

{

       privatestring[] names = new string[]{“乔丹”,”科比”,”韦德”,”赵晓虎”};

       publicstring this[int index]

{

       get

       {

              return names[index];

}

set

{

       name[index] = value;

}

}

}

 

2、显式实现接口

当一个类实现两个接口,两接口有同名的方法,第二个接口需要显式实现

显式实现接口的方法修饰符只能是private,通过类对象访问不到,只能通过接口变量访问。

子类在实现接口的时候可以把接口的方法实现为virtualabstract

使用接口的建议:

       向上转型

       在编程时:

              接口→抽象类→父类→具体类

              避免定义“体积庞大的接口”

 

3、 overload方法重载、override方法重写、new隐藏的区别?

 

4、 enum

一般枚举中每个值都是互斥的

枚举中每个值都有一个对应数值来表示,默认从0开始,可以手动设置每个枚举对应的整数

枚举在编译完成后就已经用对应常量来表示了

l        标志枚举

加上[Flags]标签,枚举类型.ToString()返回的就是文字形式,不是数字了。

验证lyh的枚举中是否有白这一项

if((lyh&GoodPeople.)= = GoodPeople.)

{

       Console.WriteLine(“小伙子很白!”);

}

else

{

       Console.WriteLine(“不白!”);

}

l        字符串转枚举

string meiJu = “QMe”;

UserState state =(UserState)Enum.Parse(typeof(UserState),meiJu);

l        默认枚举都是使用int来代替的,但也可以指定具体的数据类型

public enum UserState : byte

 

5、 结构体struct

结构体与类最大的区别是:结构是值类型,类是引用类型

结构不能继承,但可以实现接口

什么时候用结构?如果需要面向对象的特性,如果存储的数据量比较大,使用类;反之,使用结构。

 

6、 类型转换CAST

Person p = new 秦皇岛(); //隐式类型转换

秦皇岛 qhd = (秦皇岛)p; //显式类型转换

Chinese p1 = new Chinese();

秦皇岛 qhd = (秦皇岛)p1;(×)

ShanXi sx = new ShanXi();

HeBei hb = (HeBei)sx;(×)

l        把字符串转换为数值类型

string n = “123”;

Console.WriteLine(int.Parse(n));

Console.WriteLine(double.Parse(n));

Console.WriteLine(byte.Parse(n));

Convert可以任意类型相互转换

l        字符串转换为intint.TryParse()不抛异常

string n = “123”;

int result;

bool b = int.TryParse(n,out result);

if(b) //如果bTrue表示转换成功!

{

       Console.WriteLine(result);

}

else

{

       Console.WriteLine(“转换失败!”);

}

 

7、 值类型、引用类型

数组是引用类型

所有的引用类型都继承自Object,所有的值类型都继承自System.ValueTypeValueType也继承自Object

值类型在栈上分配内存LIFOLast In FirstOut值类型变量赋值会拷贝一个副本

l        值传递:传的是栈中的内容)值类型与引用类型作为参数传递

引用类型参数传递如果形参new了新的对象,形参的改变将不影响实参。例:

{

       Personpp1 = new Person();

       pp1.Name= “罗远浩”;

       M3(pp1);

Console.WriteLine (pp1.Name);

Console .ReadKey();

}

static void M3(Person p1)

{

       Personp2 = new Person();

       p1=p2;

       p1.Name= “sk”;

}

输出:罗远浩

图解:

ref表示引用传递,传的是栈的地址

 

8、 异常处理

l        几种错误

(1)      语法错误,一般编译器会帮我们解决

(2)      逻辑错误,编译、执行都没问题,就是结果错误。如:把“+”写成“-”号。

(3)      异常:在运行时发生的错误。一般会导致程序崩溃

l        常见异常:

(1)      空指针异常,未将对象引用设置到对象的实例。

Person p = new Person();

p = null;

p.Name = “yzk”;// 未将对象引用设置到对象的实例

Console.WriteLine(p.Name);

Console.ReadKey();

2)除数为0的异常

int n = 10;

int m = 0;

int sum = n / m; // 报异常,试图除以0

l        try…catch…finally…的使用:

string str = “abcd”;

try

{

       Console.WriteLine(“===========程序开始执行============”);

       //把可能发生异常的代码用try块包以来

       intn = Convert.ToInt32(str);//异常,输入字符串的格式不正确

       Console.WriteLine(n);

}

catch(Exception)

{

       //只有当try块中异常,程序才会跳到catch中执行

       Console.WriteLine(“对不起,程序崩溃鸟!!!”);

}

finally

{

       Console.WriteLine(“这句话无论异常与否都执行”);

}

Console.ReadKey();

l        catch块的写法

1catch

       {

              Console.WriteLine(“异常了”);

}

2)如果参数类型是Exception,表示可以捕获所有异常

       catchException ex

       {

       Console.WriteLine(“异常了。{0}”, ex.Message);

}

3)如果参数是NullReferenceException,表示只能捕获“空指针异常”。捕获所有异常的catch不能写在具体异常的前面

              catch(NullReferenceExceptionex)

              {

       Console.WriteLine(“异常。{0}”,ex.Message);

}

catch(Exception ex)

{

       Console.WirteLine(“异常”);

}

l        异常信息的处理

catch(Exceptionex)

{

       Console.WriteLine(ex.Message); //异常消息

       Console.WriteLine(ex.Source); //异常源

       Console.WriteLine(ex.StackTrace); //具体异常信息

}

 

l        因为finally中的代码无论程序是否发生异常都会被执行,所以一般会把一些释放资源的代码放到finally中。在finally中的代码即便某些异常没有被捕获,程序崩溃了也要执行。即便在try中有return语句,finally依然执行

InnerException(?)

throw的用法

1、 catch中用 2new Exception

try…catch…finally…尽量少用

 

9、 函数返回值(函数参数前的修饰符)

params 可变参数可以不传值,则可变参数是一个长度为0的数组,不是Null

       当一个方法有多个参数,并包含可变参数时,可变参数放最后。

       可以为可变参数直接传一个对应的数组

ref 仅仅是一个地址,引用传递。把一个值带进去再带出来

out参数在方法中必须赋值,当一个方法返回多个值考虑用out参数。由于out参数在方法中肯定被赋值了,实参可以不提前赋值

 

Convert.ToToParseTryParse的区别?(Format?)

作业:41结构备注

改点名系统

原创粉丝点击