int.TryParse非预期执行引发的思考 ASP.NET -- WebForm -- 给图片添加水印标记 Windows -- 使用批处理文件.bat删除旧文件...
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() ?? 0out關鍵字和ref關鍵字的區別
說到out關鍵字,就不得不提ref關鍵字,他們之間的區別是什么呢?
額,這個稍后我會再寫一篇博文的,到時候此處會貼上鏈接,敬請期待...
參考
?
?
?
?
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="上傳" οnclick="Button1_Click" /> 水印文字:<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><asp:Button ID="Button2" runat="server" Text="添加水印" οnclick="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删除旧文件...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Winform下的键盘事件
- 下一篇: CTP 客户端 技术相关 简介 一