今天看有有朋友在问try catch,TryParse,substring等知识点问题.就在处随便写写与总结下
----------------try catch----------------
作用: 简单理解为,尝试(try)执行一段代码,如果执行后有隐式错误时,将抓取(catch)错误信息。即保护程序出现异常,导致无法正常运行
使用:
try{
可能出显异常的语句
}
catch//一般catch子句
{
}
catch (ExceptionType1) //特定Catch子句
{
}
catch(ExceptionType e)//带有对象特定Catch子句
{
}
finally
{
//不管是否抛出异常都执行,并且为最后执行
}
执行顺序:
1.执行try中代码
2.如果try中出现异常,将尝试抓取异常信息
a.存在多个特定Catch子句时,系统按顺序搜索Catch子句列表,第一个匹配该异常对象类型时被执行catch中代码。
b.执行finally语句
4.如果try中不出现异常,执行finally语句
catch语句有三种
1.一般catch子句:它能抓取任何异常
2.特定Catch子句:它抓取指定的异常常
3.带有对象特定Catch子句:它能抓取指定异常并存在变量中如e,称为异常变量,通过它能获取关于引起的异常详细信息
特定Catch子句允许多个,但一般catch子句只允许一个。
--以上只是对try catch finally简单使用与说明,希望深入研究时,可以去了解如何抛出和throw new 语句、搜索调用栈等。
下面为使用例子:
int i = 0;
try {
int i2=5/i;
}
catch (InvalidCastException e)
{
throw (e);
}
----------------TryParse------
作用:类型转换,简单的理解为:尝试(try)转换指定类型,如果转换成功返回true,转换失败返回false
使用:
int i;
bool isNumber= int.TryParse("5",out i);//尝试把字符串转为int类型,并存在i中;转换成功时,返回true,否则转为:false
使用tryparse时,需要理解一点就是输出参数out。
这里简单带过,如:
static void Main(string[] args)
{
int num = 1;//给初始值也没用
MyOut(out num);
Console.WriteLine(num.ToString());//输入出
Console.ReadKey();
}
static void MyOut(out int i)
{
i = 2;//使用前必须赋值 i++;
}
执行的原理:
1.声明一个值类型num存于栈中。
2.调用MyOut时,在内存创建一个i,同样存于num所在的栈中
3.i=2时,栈中的数据改为2,同时num也变为2.
如果num为引用类型时,将声明一个堆区用于存数据。栈中存放着num与i的指向到堆中数据。
回过头来看下 int.TryParse("5",out i);
可以用反编译工具查看下内容,这里我就不具体查看了。 简单理解大致是:
1.判断“5”是否为数字类型。
2.如果“5”为数字类型反回true,并且把该值符给i所在的栈。
3.如果“5”不是数字类型返回false。
提示一下,转换的时候,不一定只有int类型。可以有DateTime等。
一般使用TryParse,可以换转类型,与此同学判断它是否为指定类型。
---------------Substring----------
作用:截取字符串中指定字符串 使用:
string str="substringusd";
string s1= str.SubString(1);//一个int类型参数,代表以第几位为开始,截取后面所有字符串
string s2=str.SubString(1,9);//两个int类型参数,第一个参数代表字符串起始位置,第二个参数为,需要截取的长度(并非是截取到那位)
以上s1为"ubstringusd",s2为"ubstringu";
注意:
重载1中的一个参数必须为正整数,并且小于字符串长度,否则截取异常
重载2中的两个参数的截取的长度不能超出索引范围
------------equals--------------------
作用:比较两个值是否相等
使用: string str="456";
bool isEquals=str.equals("456");
str与“456”相等时,返回true,不相等时反加false
原理: 刚查了一下反编译中代码。内部比较比较复杂,没看出个什么。网上收集点信息如下:
MSDN给我们列出了一些准则
除涉及浮点型的情况外,x.Equals(x) 都返回true。
x.Equals(y) 返回与 y.Equals(x) 相同的值。
如果 x 和 y 都为NaN,则 x.Equals(y) 返回true。
当且仅当 x.Equals(z) 返回true时,(x.Equals(y) && y.Equals(z)) 才返回true。
只要不修改 x 和 y 引用的对象,对 x.Equals(y) 的相继调用将返回相同的值。
x.Equals(nullNothingnullptrnull 引用(在 Visual Basic 中为Nothing)) 返回false。
equals与"=="区别与效率:
http://www.cppblog.com/AutomateProgram/archive/2010/08/22/124338.html
http://www.cnblogs.com/ju2ender/archive/2010/03/21/1691033.html
注意:一般字符串比较请少用==.有时反回结果非你意想之中(具体我还没查出,貌似与ASCII码之类有关,谁知道的非常欢迎解说一下)
累,手都酸了。以上为本人理解,有什么不道或有误之处,希望大家多多提出。