黑马程序员技术交流社区

标题: 求教关于try catch, TryParse以及几个关键词的用法. [打印本页]

作者: 天高地阔    时间: 2012-4-2 21:41
标题: 求教关于try catch, TryParse以及几个关键词的用法.
try catch
TryParse
Substring
equals
求教以上这些的用法,最好带上例子,
特别是前2个,我感觉有些时候前2个有些相似的说,
作者: 蔡纯富    时间: 2012-4-2 21:55
try catch是用于捕获异常的,和TryParse毫无关系,
TryParse是一个数据类型进行数据类型转换的一个方法,该方法返回一个bool类型的值,若为false,则表示转换失败,ture表示转换成功;
Substring是截取字符串获得字符串的子串,
equals用于判断两个对象是否相等,返回类型也是bool类型的值
作者: 天高地阔    时间: 2012-4-2 22:12
能不能举点例子,来的明白些{:soso_e121:}
作者: 黄雄斌    时间: 2012-4-2 22:36
  1. private List<Int32> TestParse(String[] strings)
  2. {
  3. Int32 intValue;
  4. List<Int32> intList = new List<int>();
  5. for (int i = 0; i < 5000000; i++)
  6.       {
  7.        intList.Clear();
  8.        foreach (String str in strings)
  9.                    {
  10.                     try
  11.                        {
  12.                          intValue = Int32.Parse(str);
  13.                          intList.Add(intValue);
  14.                        }
  15.                    catch (System.ArgumentException) { } catch (System.FormatException){ }
  16.                    catch (System.OverflowException){ }
  17.                   }
  18.       }
  19. return intList;
  20. }

  21. private List<Int32> TestTryParse(String[] strings)
  22. {
  23. Int32 intValue;
  24. List<Int32> intList = new List<int>();
  25. Boolean ret;
  26. for (int i = 0; i < 5000000; i++)
  27.       {
  28.        intList.Clear();
  29.        foreach (String str in strings)
  30.                     {
  31.                     ret = Int32.TryParse(str, out intValue);
  32.                     if (ret)
  33.                        {
  34.                          intList.Add(intValue);
  35.                        }
  36.                     }
  37.     }
  38.        return intList;
  39. }
复制代码

作者: 郑帅    时间: 2012-4-3 00:21
本帖最后由 郑帅 于 2012-4-3 00:36 编辑

---------------------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码之类有关,谁知道的非常欢迎解说一下)

累,手都酸了。希望以上的解答对你能所帮助。如有不恰到之处,请多多指出




作者: 天高地阔    时间: 2012-4-3 00:26
十分感谢,正在对着研究...{:soso_e152:}
作者: 张世豪    时间: 2012-4-3 09:40
本帖最后由 张世豪 于 2012-4-3 09:42 编辑

try catch与TryParse没关系,try catch是用来处理异常的,而TryParse是处理类型转化的结果的,TryParse的返回值是bool类型:例如
string s = Console.ReadLine();
            int i;
            if (int.TryParse(s, out i))
            {
                Console.WriteLine("转化成功!");
            }
Console.ReadKey();

Substring是用来截取字符串的:Substring(要截取的字符串位置,要截取字符串的长度)。
equals是字符串与字符串之间的比较:"abc".Equals("aa"),它的返回值也是bool类型。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2