int.TryParse非预期执行引发的思考

 

问题出现

这天在写一个页面,想谨慎些就用了int.TryParse,结果出问题了。

代码如下:

Copy
int id = 1000;
//Request.QueryString["id"] = null
int.TryParse( Request.QueryString["id"], out id );
//使用 id 进行其他操作...

因为Request.QueryString["id"] = null,所以我的预期是id=1000。可是我错了,实际结果是id=0。测试多次都是这样。我感觉要出事了。

事实上我对TryParse一直存在这么个认知(以上面代码举例):

  • 如果转换成功,id=转换后的值;
  • 如果转换失败,不进行任何操作,id仍然是1000。

可是现在我知道我错了,更严重的是我按照这样的思维写了不少代码。。。还好我确保输入正确使其都能转化成功,至今没出什么幺蛾子。出幺蛾子的话我早就滚蛋了吧。

不过现在不是考虑这些的时候,工作要紧,就赶紧改了代码,先把新功能上线了再说...

问题分析

几天后,有空了,就开始研究这个问题,总结如下:
TryParse转换失败时,out参数返回的是什么?

网上搜了下,在stackoverflow上看到了这么一段话(谷歌翻译):

你是对的,如果失败,TryParse使用0。(MSDN非常清楚地说明了这一点)但你可以检查paseSuccess并返回你的默认值,如果这是你想要的。

现在发现当时看的是VB.NET...还好此时此刻这货特性和C#是一样的...不然又坑了...

既然提到了MSDN,那就去看看。果然,MSDN上在result处写着这么一段话:

result Int32
当此方法返回时,如果转换成功,则包含与s中所包含的数字等效的 32 位无符号整数值;如果转换失败,则包含零。 如果s参数为null或为 Empty、格式不正确,或者表示小于 MinValue 或大于 MaxValue 的数,则转换失败。 此参数未经初始化即进行传递;最初在result中提供的任何值都会被覆盖。

有这么几处重点:

  • 当此方法返回时,如果转换成功,则包含与s中所包含的数字等效的 32 位无符号整数值;如果转换失败,则包含零。
  • 此参数未经初始化即进行传递;最初在result中提供的任何值都会被覆盖

”out参数“、“未经初始化即进行传递”,看到这些,我突然想到了out参数的特性:“out参数好像是不需要初始化的“。如果传入时不需要初始化,那么在TryParse方法内部,当转换成功时可以赋值(转换后的值);当转换失败时,也必须赋值,要赋值就必定是默认值。

到此我的疑惑已经解开了。搞了大半天,竟然是out关键字的性质。恍然大悟的同时,又感觉到自己的C#基础的薄弱。。。

总结

TryParse使用时,传入的out参数的原始值会被覆盖掉,具体如下:

  • 如果转换成功,使用转换成功后的值覆盖
  • 如果转换失败,使用该类型的默认值覆盖

其他

转换失败时不使用默认值覆盖原始值的2种方法

既然已经了解了本质,当然也不能忘了咱们的初衷,那就是TryParse转换失败时,怎么不使用默认值覆盖我们设定的原始值?

下面分享一下在stackoverflow上看到的2种方法

Copy
//方法1、使用out参数的性质
int i = int.TryParse(s, out i) ? i : 42;

//方法2、扩展方法
public class Extensions
{
    public static int? TryParse(string this Source)
    {
        if(int.tryparse ....
    }
}
//使用
v = "234".TryParse() ?? 0

out关键字和ref关键字的区别

说到out关键字,就不得不提ref关键字,他们之间的区别是什么呢?

额,这个稍后我会再写一篇博文的,到时候此处会贴上链接,敬请期待...

参考

  1. SF:https://stackoverflow.com/questions/1078512/why-does-integer-tryparse-set-result-to-zero-on-failure?noredirect=1&lq=1
  2. SF:https://stackoverflow.com/questions/10693231/elegant-tryparse
  3. MSDN:Int32.TryParse Method

ASP.NET -- WebForm -- 给图片添加水印标记

ASP.NET -- WebForm: 给图片添加水印标记

ASP.NET:使用 WebForm(C#) 制作一个简单的为图片添加水印的页面。

1. Test2.aspx文件

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test2.aspx.cs" Inherits="Test2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:FileUpload ID="FileUpload1" runat="server" />
        <asp:Button ID="Button1" runat="server" Text="上传" onclick="Button1_Click" />
        &nbsp;&nbsp;&nbsp;&nbsp;水印文字:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:Button ID="Button2" runat="server" Text="添加水印" onclick="Button2_Click" /><br />
        <asp:Image ID="Image1" runat="server" />
        <asp:Image ID="Image2" runat="server" />
    </div>
    </form>
</body>
</html>

2. Test2.aspx.cs文件

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Drawing;

public partial class Test2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        //上传图片并保存
        HttpPostedFile imgfile = Context.Request.Files[0];
        imgfile.SaveAs(Context.Request.MapPath("image/TestImg.jpg"));
        Image1.ImageUrl = "./image/TestImg.jpg";
    }

    protected void Button2_Click(object sender, EventArgs e)
    {
        //创建位图,位图来自image文件
        using (Bitmap map = (Bitmap)Bitmap.FromFile(Context.Request.MapPath("image/TestImg.jpg")))
        {
            using (Graphics g=Graphics.FromImage(map))
            {
                //画水印文字在位图上
                g.DrawString(TextBox1.Text, new Font("黑体", 14.0f, FontStyle.Bold), Brushes.Blue, new PointF(map.Width - 120, map.Height - 30));
                //将画好水印文字的位图保存
                map.Save(Context.Request.MapPath("image/TestImg2.jpg"));
            }
        }

        Image2.ImageUrl = "./image/TestImg2.jpg";
    }
}

3. 实现结果

(1) 上传要添加水印的图片

(2) 输入水印文字

(3) 添加水印在图片上

Windows -- 使用批处理文件.bat删除旧文件

Windows  --  写一个批处理文件.bat删除旧文件

1. 批处理文件 del_old_file.bat

rem 删除D:\temp目录下7天前的文件
Forfiles /p D:\temp /s /d -7 /m *.* /c "cmd /c del /q /f @path"

rem 删除C:\inetpub\logs目录下14天前的文件
Forfiles /p C:\inetpub\logs  /s /d -14 /m *.* /c "cmd /c del /q /f @path"

2. 各参数的含义

rem: 注释命令,只是起一个注释的作用

/p:指定要删除的目录

/s:表示递归搜索子目录

/d:-14表示14天前的文件,-7表示7天前的文件

/m:*.* 表示所有文件类型,如果要删除特定文件格式,可自行指定(如:只删除txt文件,可写成 *.txt )

/c:自行指定的命令,后面双引号括起来的是删除文件命令

  自行指定的命令 "cmd /c del /q /f @path" 中:
        /c: 表示执行完批处理命令后,关闭CMD窗口

        del: 删除文件的命令

        /q: 安静模式。删除全局通配符时,不要求确认

        /f:  强制删除只读文件。

3. 使用方式及会用到的地方

使用方式:可以在Windows任务计划程序中,创建定时任务来执行该批处理文件(如:每天什么时间执行、执行频率......)。

会用到的地方:用于删除占用资源且没有用的文件,可用于定时删除服务器上的很久以前的临时文件、IIS服务器log......

优点:只需简单几行命令,完成设定来实现目的是比较快的。

int.TryParse非预期执行引发的思考 ASP.NET -- WebForm -- 给图片添加水印标记 Windows -- 使用批处理文件.bat删除旧文件的更多相关文章

  1. int.TryParse非预期执行引发的思考

    问题出现 这天在写一个页面,想谨慎些就用了int.TryParse,结果出问题了. 代码如下: int id = 1000; //Request.QueryString["id"] ...

  2. 曲演杂坛--一条DELETE引发的思考

    原文:曲演杂坛--一条DELETE引发的思考 场景介绍: 我们有一张表,专门用来生成自增ID供业务使用,表结构如下: CREATE TABLE TB001 ( ID ,) PRIMARY KEY, D ...

  3. 一个ScheduledExecutorService启动的Java线程无故挂掉引发的思考

    2018年12月12日18:44:53 一个ScheduledExecutorService启动的Java线程无故挂掉引发的思考 案件现场 不久前,在开发改造公司一个端到端监控日志系统的时候,出现了一 ...

  4. c# 类型转换 int.TryParse() 方法

    public static bool TryParse(string s, out Int32 result); 如果转换成功则返回true.否则返回false int.TryParse(string ...

  5. Go select 死锁引发的思考

    Go select 死锁引发的思考 https://mp.weixin.qq.com/s/Ov1FvLsLfSaY8GNzfjfMbg一文引发的延续思考 上文总结 总结一 package main i ...

  6. C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别

    转自:http://www.cnblogs.com/leolis/p/3968943.html 在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为 整型(int)来讲, ...

  7. C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别 <转>

    作者:Statmoon 出处:http://leolis.cnblogs.com/   在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为整型(int)来讲,有四种方法 ...

  8. int.Parse()、int.TryParse()和Convert.ToInt32()的区别

    1:int.Parse(一个参数)        此参数必须满足: 1 只能是字符串: 2 只能是 “整型” 字符串,即各种整型ToString()之后的形式,也不能为浮点型. 2:int.TryPa ...

  9. (int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别

    C#中(int).int.Parse().int.TryParse()和Convert.ToInt32()的区别   原文链接:http://www.cnblogs.com/leolis/p/3968 ...

随机推荐

  1. SilverLight学习笔记--使用WebClient实现通讯(一)(上传和下载字符串数据)

    一.什么是WebClient类   1.基本知识    WebClient类是Mircsoft在.NET框架下提供的向 URI 标识的资源发送数据和从 URI 标识的资源接收数据的公共方法.通过这个类 ...

  2. CentOS下使用KVM克隆虚拟机自动修改网卡的MAC地址

    克隆完虚拟机之后Mac地址还保留着母机的配置,此时需要修改成新的Mac地址才能继续,网上一般都是这样的手动操作: 参考:http://blog.51cto.com/freedyong/1361907 ...

  3. iOS学习之iOS沙盒(sandbox)机制和文件操作复习

    1.iOS沙盒机制 iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. ...

  4. JavaScript在IE6下超级链接window.location.href不跳转的bug 及 解决方案

    今天遇到个很诡异的问题,就是<a href="javascript:void(0);" onclick="window.location.href=url" ...

  5. sql 锁类型与锁机制 转

      SQL Server锁类型(SQL)收藏1. HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁.   2. NOLOCK:不添加共享锁和排它锁,当这个 ...

  6. Fiddler2 抓取手机APP数据包

    原文:http://blog.goyiyo.com/archives/2044 下载安装运行后,查出运行机器的IP,手机连接同一网域内的WIFI,手机WIFI连接设置里的高级里,代理设置填写上Fidd ...

  7. ArcGIS Engine中空间参照(地理坐标)相关方法总结转

    ArcGIS Engine中空间参照(地理坐标)相关方法总结 来自:http://blog.csdn.net/u011170962/article/details/38776101 1.创建空间参考 ...

  8. SharePoint 在中国为什么吃不开?

    1.功能不完善,二次开发费时费力?2.没有完整的解决方案,案例太少,很多企业不敢下手?3.国内人员,操作性比较差,不愿意接受SharePoint的操作方式?4.价格太贵,小型企业花费性价比不高?5.界 ...

  9. .Net线程问题解答

    基础篇 怎样创建一个线程 受托管的线程与 Windows线程 前台线程与后台线程 名为BeginXXX和EndXXX的方法是做什么用的 异步和多线程有什么关联 WinForm多线程编程篇 我的多线程W ...

  10. unity 的reflection probe和environmentmap

    unity做了个很恶心的事情 unity_SpecCube0这里如果在reflectionprobe范围内就传reflectionprobe 如果在probe范围外这里就传environmap 在GI ...