追述String.Format()方法而发现的奇怪问题
2006-10-20 01:10
411 查看
String类的Format重载方法,用来格式化需要的字符串非常方便。常用的重载方法原型有:
Format(String, Object)
Format(String, Object, Object)
Format(String, Object, Object, Object)
Format(String, Object[])
它们都调用了另外一个重载方法:
Format(IFormatProvider, String, Object[])
在这个方法中,调用了System.Text.StringBuilder类中的AppendFormat方法:
AppendFormat(IFormatProvider, String, Object[])
在这个方法内部对字符串进行了解析,包括我们常常利用大括号”{}”对来匹配变量参数,如:
String.Format(”this is {0}”, UserName);
不知道大家有没有在这个format参数中误用大括号的经历,比如参数本身是段脚本语句,需要使用到大括号,如:
String.Format(”return 1;} function Method{0}(){”, id);
这段代码会抛出FormatException的异常。我们察看Reflector,看看当AppendFormat方法解析这个 “return 1;} function Method{0}(){” 字符串时候,会发生什么情况:
switch (ch1) {
case ‘}’:
if ((num1 < num2) && (chArray1[num1] == ‘}’))
{ num1++; }
else { StringBuilder.FormatError(); }
break;
大概在24行开始,开始判断是否是“}”字符,如果在其后没有紧跟另一个“}”符号,程序立即会抛出异常(通过StringBuilder的FormatError方法)。所以能够解释我们上面所举例子中的情况。但是根据这个反编译的源代码,就不能解释很多正常的情况,比如:
String.Format(”this is {0}”, UserName);
仔细跟踪这个AppendFormat方法,发现都会出现第49行一个数组的调用超出边界,将抛出System.IndexOutOfRangeException:
chArray1[num4++] = ch1;
不知何故,此方法在Framework中能顺利运行,难道是Reflector反编译有误?
以下为反编译的AppendFormat方法代码(真佩服写FCL的牛人,代码逻辑真是深奥阿 ):
public StringBuilder AppendFormat(IFormatProvider provider, string format, params object[] args)
2
213
214
Format(String, Object)
Format(String, Object, Object)
Format(String, Object, Object, Object)
Format(String, Object[])
它们都调用了另外一个重载方法:
Format(IFormatProvider, String, Object[])
在这个方法中,调用了System.Text.StringBuilder类中的AppendFormat方法:
AppendFormat(IFormatProvider, String, Object[])
在这个方法内部对字符串进行了解析,包括我们常常利用大括号”{}”对来匹配变量参数,如:
String.Format(”this is {0}”, UserName);
不知道大家有没有在这个format参数中误用大括号的经历,比如参数本身是段脚本语句,需要使用到大括号,如:
String.Format(”return 1;} function Method{0}(){”, id);
这段代码会抛出FormatException的异常。我们察看Reflector,看看当AppendFormat方法解析这个 “return 1;} function Method{0}(){” 字符串时候,会发生什么情况:
switch (ch1) {
case ‘}’:
if ((num1 < num2) && (chArray1[num1] == ‘}’))
{ num1++; }
else { StringBuilder.FormatError(); }
break;
大概在24行开始,开始判断是否是“}”字符,如果在其后没有紧跟另一个“}”符号,程序立即会抛出异常(通过StringBuilder的FormatError方法)。所以能够解释我们上面所举例子中的情况。但是根据这个反编译的源代码,就不能解释很多正常的情况,比如:
String.Format(”this is {0}”, UserName);
仔细跟踪这个AppendFormat方法,发现都会出现第49行一个数组的调用超出边界,将抛出System.IndexOutOfRangeException:
chArray1[num4++] = ch1;
不知何故,此方法在Framework中能顺利运行,难道是Reflector反编译有误?
以下为反编译的AppendFormat方法代码(真佩服写FCL的牛人,代码逻辑真是深奥阿 ):
public StringBuilder AppendFormat(IFormatProvider provider, string format, params object[] args)
2
213
214
相关文章推荐
- .NET String.Format 方法 线程安全问题
- string.Format 里面包含 javascript方法参数的时候 单引号变成双引号的问题解决方法
- String.Format方法格式化字符串时嵌入大括号的问题
- String.Format()方法问题
- String.Format方法格式化字符串时嵌入大括号的问题
- [疑问]关于dataformatstring奇怪的问题
- 循环体中调用[NSString stringWithFormat:@"%@",Object] 方法的内存问题
- 我的Android进阶之旅------>Java字符串格式化方法String.format()格式化float型时小数点变成逗号问题
- java笔记(一)[static和final常量&String.format()问题&Array类&finalize方法及内存回收]
- 构建方法返回String的报错问题
- java字符串格式化:String.format()方法的使用
- C#中的String.Format方法
- Fiddler获取ResponseBody乱码问题解决方法----oSession.GetResponseBodyAsString();
- C#中的String.Format方法
- CString.format 发现点问题
- String.Format 格式化货币的小问题
- javascript实现类似C# String的format方法
- String.Format("{0:yyyy-MM-dd}" ,dr["ar_time"].toString())不能格式化的问题
- Maven奇怪的问题,当找不到Maven输出的提示错误时可以试下这个方法
- String.format()使用方法