NOD32 與 無法將工作階段狀態要求送至工作階段狀態伺服器

當我們在設定 ASP.NET 應用程式以 "ASP.NET 狀態服務" 儲存 Session 資料時,可能有人曾經預過這個問題,錯誤訊息如下:

無法將工作階段狀態要求送至工作階段狀態伺服器。請確定 ASP.NET 狀態服務已經啟動且用戶端與伺服器的通訊埠都相同。如果伺服器是在遠端電腦上,請檢查 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection 的值,確定它是否接受遠端要求。如果伺服器是在本機電腦上,而且前述登錄值不存在或設定為 0,狀態伺服器連接字串就必須使用 'localhost' 或 '127.0.0.1' 做為伺服器名稱。

 '/' 應用程式中發生伺服器錯誤。

無法將工作階段狀態要求送至工作階段狀態伺服器。請確定 ASP.NET 狀態服務已經啟動且用戶端與伺服器的通訊埠都相同。如果伺服器是在遠端電腦上,請檢查 HKEY_LOCAL_MACHINE\ SYSTEM\ CurrentControlSet\ Services\ aspnet_state\ Parameters\ AllowRemoteConnection 的值,確定它是否接受遠端要求。如果伺服器是在本機電腦上,而且前述登錄值不存在或設定為 0,狀態伺服器連接字串就必須使用 'localhost' 或 '127.0.0.1' 做為伺服器名稱。

我之前就是怎麼調整都還是連不上,明明只是「本地連接 ( Local Connection )」而已,也沒有設定任何讓【ASP.NET 狀態服務】開放遠端連接的機碼,但為什麼總是連不上呢!而且自己用 Telnet 指令測試連結 ASP.NET 狀態服務的 Port 42424 也都可以正常連線,但就是 ASP.NET 無法連線而已,遇到這種情況真的會吐血。

查了好幾個小時後才知道,原來是 NOD32 防毒軟體的問題,阻擋了「疑似」HTTP 的連線,因為 NOD32 有支援 Internet Monitor (IMON) 的功能,可以偵測與過濾有問題的 HTTP 封包,就是因為這樣才導致無法使用 ASP.NET 狀態服務。

解決的方法如下:

  1. 先開啟 NOD32 Control Center,點選 IMON,再點選 Setup 按鈕

    先開啟 NOD32 Control Center,點選 IMON,再點選 Setup 按鈕

  2. 開啟 IMON Setup 後選取 HTTP 頁籤,然後取消勾選 Automatically detect HTTP communication on other ports.



  3. 按下 OK 後就立即可以用 ASP.NET 狀態服務了

 

所以如果有人有安裝防毒軟體或個人防火牆軟體的話,注意可能是這個問題,去看看有沒有設定可以將 ASP.NET 狀態服務排除在掃瞄範圍之外!

 

  

此文章由 will 發表於 2008/1/31 上午 12:25:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: ASP.NET

標籤: ,

收藏:

介紹好用工具:grepWin

你有想找檔案但是找不到的經驗嗎? 或是為了想將某個目錄下所有檔案的內容批次取代特定字串的經驗嗎?

我們知道 Windows 有內建的搜尋工具,但是用過的都知道,大概只能找檔名而已,雖然有找 "檔案裡的字或片語" 的功能,但卻常常都找不到,急的時候真的會氣死!

Windows 內建的搜尋工具

檔案裡的字或片語

我在知道 grepWin 這個軟體之前,通常我會使用 UltraEdit, Notepad++ 或是 Visual Studio 等軟體,幫助我做搜尋與取代的動作,但怎麼用都沒有比用 grepWin 還來的方便、親切又有效率,因為 grepWin 直接跟檔案總管結合,只要在目錄上按滑鼠右鍵,就可以開始進行搜尋或取代的動作,且搜尋與取代都可以用 Regular Expression 語法,程式本身又很小 ( 執行檔只有 492KB ),搜尋起來真的很快,且搜尋的結果是窗還可以在檔案清單中按下滑鼠右鍵,所出現的 context menu 會出現跟檔案總管一樣的選單,也可以直接開啟檔案。但使用取代(Replace)功能時還是要小心,因為功能實在太強了,所以在執行前最好能先備份過,以免檔案救不回來。

唯一個缺點就是無法搜尋「目錄名稱」,但如果要搜尋目錄的話可以直接使用 Windows 內建的搜尋工具。

grepWin 的官方網站在此: http://tools.tortoisesvn.net/grepWin

以下是簡單的操作圖示:

圖一:按下滑鼠右鍵選 context menu 的 grepWin...
圖一:按下滑鼠右鍵選 context menu 的 grepWin...


圖二:操作畫面摘要

1. 要搜尋的檔案內容片段,上面的 Regex Search 與 Text Search 讓你選擇是否使用 RegEx 語法 ( .NET style )

2. 要將搜尋到的字取代成什麼字元,如果選 RegEx 語法的話,還可以用 $1, $2 這種語法

3. 可以限制搜尋檔案的大小,以縮小搜尋範圍,加快搜尋速度

4. 打勾之後就可以搜尋被設定隱藏屬性的檔案

5. 可以輸入要搜尋的檔案名稱

6. 要搜尋的檔案名稱也可以用 RegEx 語法,真的很好用!

  

此文章由 will 發表於 2008/1/30 上午 01:33:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: 介紹好用工具

標籤:

收藏:

如何用 TortoiseSVN 復原錯誤的簽入動作

在一個開發團隊裡,當有人將錯誤的程式碼簽入(Commit)到 Subversion 儲存庫(Repository)去,的確會造成許多人的麻煩,這時程式開發經理應該就要立即出面,將這類的問題排除。

如果目前最新的版本(Revision)是 9 的話,你可能想要將版本復原到 Revision 8,這時候有兩種方法可以做:

1. 透過 Update to revision.. 將目前的程式碼更新至第 8 版

透過 Update to revision.. 將目前的程式碼更新至第 8 版

但這種作法是錯的!

因為這方法只是將你的工作目錄更新到舊的版本(第 8 版),這時重新所做的修改其實都會失敗,因為當你要 commit 的時候,Subversion 就會告訴你必須先更新(SVN Update)過才能 commit,到時就會發生衝突!

2. 透過 Merge (合併) 將目前的程式碼合併到第 8 版

透過 Merge (合併) 將目前的程式碼合併到第 8 版

這才是正確的作法!

因為這等於是將目前的版本 ( 第 9 版 ) 直接合併到第 8 版去,現有的工作目錄還是處於第 9 版的狀態,只是所有程式碼因為執行合併的關係而變成第 8 版的內容而已,當你 Merge 成功以後,還必須 commit 一次,讓第9版修改後的程式簽入到儲存庫 ( 成為第 10 版 ),這時的第 10 版就會跟原本的第 8 版一模一樣了!此時,再請專案成員做一次 SVN Update 就可以讓大家回復到正確程式碼的狀態了!

而將目前的 Revision 合併回上一個 Revision 的方式如下,以下將以 TortoiseSVN 工具做說明:

  1. 先在工作目錄的根目錄顯選取 SVN Merge 功能

    透過 Merge (合併) 將目前的程式碼合併到第 8 版

    開啟 SVN Merge 對話方塊

  2. 在 From: 的地方選取 "HEAD Revision" ,在 To: 的地方選取 Revision 並設定到你想要還原到的版本編號 ( 此範例是 8 ),最後按下 Merge 按鈕

    在 From: 的地方選取 "HEAD Revision" ,在 To: 的地方選取 Revision 並設定到你想要還原到的版本編號 ( 此範例是 8 ),最後按下 Merge 按鈕

  3. 此時你將會看到在工作目錄下的檔案已經被異動了,最後再執行 SVN Commit 就可以復原成功了!

 

  

此文章由 will 發表於 2008/1/29 上午 12:04:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Subversion

標籤: ,

收藏:

如何讓 UserControl 與 RequireFieldValidator 搭配使用

基本上只要是繼承於 Control 型別的控制項都可以跟 *Validator 控制項搭配使用!只是你必須在 UserControl 的類別特別定義 2 個 Class Attribute 才能正確使用。

一個是 [ValidationProperty("Text")] ,而另一個是[ControlValueProperty("Text")] ,分別用來宣告此類別的驗證用屬性要取得此類別的哪一個屬性,與此控制項的 Value 是屬於哪一個屬性。

但其中有個很重要的觀念,就是如果 UserControl 要搭配使用 RequiredFieldValidator 時,若要讓啟用 EnableClientScript 時可以正常運作 ( 也就是直接在 Browser 端直接用 JavaScript 先驗證其值 ),必須在該 UserControl 加上一個隱藏欄位,且以該隱藏欄位的 id 必須以這個 UserControl 的 this.ClientID 為名,才能讓 RequiredFieldValidator 控制項透過 JavaScript 取得要驗證的值,且當 UserControl 當中的欄位資料更新的時候,也要立即透過 JavaScript 一併更新該隱藏欄位的值才行!如果不加上這個隱藏欄位並不會出錯,只是做驗證的時候必須要等表單 PostBack 回伺服器端才能驗證而已,但這樣就顯的不有點美中不足了。

以下是個簡單的範例,各位看程式碼就知道我在寫什麼了,注意【粗體字】的部分。

[code:xml]

<%@ Control Language="C#" ClassName="City" CodeFile="City.ascx.cs" Inherits="UserControls_DataType_City" %>
<asp:DropDownList 
   ID="ddlCity" 
   runat="server" 
   EnableViewState="true"
   AutoPostBack="false">
</asp:DropDownList>

[/code]

Code Behind 的程式碼如下:

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.ComponentModel;

[ValidationProperty("Text"), ControlValueProperty("Text")]
public partial class UserControls_DataType_City : System.Web.UI.UserControl
{
    [Bindable(true)]
    [Description("台灣縣市")]
    [Category("Appearance")]
    public string Text
    {
        get
        {
            return ddlCity.SelectedValue;
        }
        set
        {
            ddlCity.SelectedValue = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            ddlCity.Items.Add(new ListItem("-- 請選擇 --", ""));

            ddlCity.Items.Add(new ListItem("基隆市", "基隆市"));
            ddlCity.Items.Add(new ListItem("台北市", "台北市"));
            ddlCity.Items.Add(new ListItem("台北縣", "台北縣"));
            ddlCity.Items.Add(new ListItem("桃園縣", "桃園縣"));
            ddlCity.Items.Add(new ListItem("新竹市", "新竹市"));
            ddlCity.Items.Add(new ListItem("新竹縣", "新竹縣"));
            ddlCity.Items.Add(new ListItem("苗栗縣", "苗栗縣"));
            ddlCity.Items.Add(new ListItem("台中市", "台中市"));
            ddlCity.Items.Add(new ListItem("台中縣", "台中縣"));
            ddlCity.Items.Add(new ListItem("彰化縣", "彰化縣"));
            ddlCity.Items.Add(new ListItem("南投縣", "南投縣"));
            ddlCity.Items.Add(new ListItem("雲林縣", "雲林縣"));
            ddlCity.Items.Add(new ListItem("嘉義市", "嘉義市"));
            ddlCity.Items.Add(new ListItem("嘉義縣", "嘉義縣"));
            ddlCity.Items.Add(new ListItem("台南市", "台南市"));
            ddlCity.Items.Add(new ListItem("台南縣", "台南縣"));
            ddlCity.Items.Add(new ListItem("高雄市", "高雄市"));
            ddlCity.Items.Add(new ListItem("高雄縣", "高雄縣"));
            ddlCity.Items.Add(new ListItem("屏東縣", "屏東縣"));
            ddlCity.Items.Add(new ListItem("台東縣", "台東縣"));
            ddlCity.Items.Add(new ListItem("花蓮縣", "花蓮縣"));
            ddlCity.Items.Add(new ListItem("宜蘭縣", "宜蘭縣"));
            ddlCity.Items.Add(new ListItem("澎湖縣", "澎湖縣"));
            ddlCity.Items.Add(new ListItem("金門縣", "金門縣"));
            ddlCity.Items.Add(new ListItem("連江縣", "連江縣"));
        }

        // 為了要讓 RequireFieldValidator 的 EnableClientScript 屬性
        // 可以正常運作,需要定義一個以 this.ClientID 為名的欄位,才
        // 可以供 Validator 控制項的 JavaScript 做判斷!

        Page.ClientScript.RegisterHiddenField(this.ClientID, Text);

        ddlCity.Attributes["onchange"] = 
            "document.getElementById('" + this.ClientID + "').value = this.value;";
    }
}

 

  

此文章由 will 發表於 2008/1/28 上午 12:01:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: ASP.NET | C# | JavaScript

標籤: , , ,

收藏:

ASP.NET 當上傳檔案過大時任何回應瀏覽器的動作都無效

基本的 HTTP 通訊協定就是 Browser 對 Server 發出 HTTP Request 指令,Server 收到 HTTP Request 指令後開始進行資料的運算與處理,然後從 Server 回應 HTTP Response 給 Browser,Browser 收到 HTTP Response 指令後負責處理網頁的顯示或網頁轉向等動作。

所以當你透過 HTTP 上傳過大的檔案時,雖然 ASP.NET 程式有開始執行,但是只要執行到 ASP.NET 設定的 maxRequestLength 上限時,就會將此次的 HTTP 對話直接關閉 ( 斷線 ),導致 Browser 無法完成 HTTP Request 這個動作,所以連 HTTP Request 都沒有完成的情況下,怎麼可能還從 Server 那邊得到 HTTP Response 指令!所以 Browser 根本不知道如何處理接下來的動作,這時如果你是使用 Internet Explorer 瀏覽器的話,就會出現 IE 預設的錯誤訊息 ( 請檢查您的網際網路連線。嘗試瀏覽其他網站,確定您已連線至網際網路。 ),使用者會感覺上好像 Server 端的程式出錯了,但是其實是 Browser 無法處理 HTTP 指令才導致這個畫面的出現。

所以你寫的任何要回應給 Browser 的程式都是沒有用的 ( 例如:  Response.Redirect("Error.htm"); ),Browser 完全接收不到喔!! 也因此這問題不只在 ASP.NET 會發生,在其他的 Web 應用平台都會有類似的問題,但這說穿了也不應該是個問題,你只要了解 HTTP 的運作機制,就不難了解為什麼會這樣!

寫程式最重要的就是基礎觀念有沒有紮實學好! 沒有好的觀念無法真正寫好程式,但問題遇到了解決不了或無法理解大部分的時候是正常的,反正多看書、多寫程式就會多學到一點經驗。

預設來說 ASP.NET 的最大的檔案上傳限制為 4096 (4 MB),如果要調大檔案上傳的限制必須要調整 web.config 中在 <system.web> 區段下新增一個 <httpRuntime> 的設定,如下:

<configuration>
  <system.web>
    <httpRuntime maxRequestLength="40000" executionTimeout="300"/>
  </system.web>
</configuration>

相關網址

  

此文章由 will 發表於 2008/1/27 上午 01:22:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: ASP.NET | Web

標籤: , , , ,

收藏:

SQL Server Management Studio 表格設計技巧

我們將資料庫分析與設計完成之後,會開始大量建立表格到 SQL Server 資料庫中,但是 Management Studio 在操作的時候,就會覺得使用者介面十分難用,會覺得一直在重複做一些多餘的滑鼠 Click 的動作,例如說我們在建立表格的時候,通常在設計 Primary Key 欄位時就會有幾個步驟要做:

  1. 第一個欄位通常會命名叫 ID
  2. 資料型別會用 int
  3. 允許 Null 要取消勾選

    ID欄位設定 Step 1 ~ 3

  4. 然後要到下方 "資料行屬性" 點開 "識別規格"

    點開識別規格


  5. 在 "識別規格" 下的 "(Is Identity)" 做一次 Double Click 讓設定值變成 "是"


  6. 在回到上面 "ID" 欄位按下右鍵 "設定主索引鍵(Y)"

    設定主索引鍵(Y)

除了設定 ID 欄位之外,還有可能直接將「描述」欄位填上欄位的說明或填上「預設值」等欄位,上下上下的這樣切換真的很麻煩!天阿,真是太不方便了!

但我之前因為經常使用「資料庫圖表」來幫助我設計表格間的關連,而無意中發現一個好用的表格設計方式,可以用更方便的方式來建立或修改表格的結構!

請看以下示範:

  1. 新增一個資料庫圖表

    新增資料庫圖表

  2. 在畫面空白處按下右鍵,選 "新增資料表(T)"

    新增資料表

  3. 輸入資料表表格名稱



  4. 預設的資料表檢視是「標準」,我們將先修改自訂的資料表檢視

    修改自訂的資料表檢視



  5. 預設來說,自訂檢視會有 5 個欄位(如上圖),你可以多加入「預設值」與「識別」欄位進去



  6. 接下來在表格上按下右鍵,選取「自訂檢視」

    在表格上按下右鍵,選取「自訂檢視」

  7. 大功告成,這樣子的介面就好用多啦!


底下有幾個「快速建立表格」的小技巧,可以給大家做參考:

  1. 先將所有欄位名稱先打好



  2. 再修改 "資料型別扼要" ( 就是資料型別啦 )

    - 相同型別的一次輸入完畢,第一個型別用 Key in 的,其他相同的型別用複製/貼上的即可,這樣子真的很快!
    - 例如說 Name 的型別是 nvarchar(max) 的話,其他 Tel, Address 都一樣要設定為 nvarchar(max) 的話直接用鍵盤在 Name 的型別按下 Ctrl + C 再到 Tel, Address 的欄位型別的地方按下 Ctrl + V 貼上即可。



  3. 在統一設定長度、可為 Null、預設值

    - 幾乎都可以用複製貼上的方式操作!

    - 記住:同類型的請一口氣貼上完畢!

  4. 再將 ID 欄位的「識別」勾選 ( 會自動啟用自動編號功能 )


  5. 最後,再統一打上「描述」欄位,說明這個欄位的一些特性與注意事項!

你如果一次只新增一個表格,當然可以不用這麼麻煩!但一次建立 20 個表格,在時間上就有差別摟,工作效率其實就是在這些點點滴滴的技巧中累積起來的!

  

此文章由 will 發表於 2008/1/26 下午 03:50:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: SQL Server | Tips

標籤: , ,

收藏:

今天加入了 CodePlex 的 ExtensionToolkit 專案

好像有點把 Extension Method 寫上癮了,覺得真的很方便,有點在寫 PHP 的感覺,有寫過 PHP Smarty : Template Engine 的人應該會覺得很熟悉。

今天我加入了 CodePlexExtensionToolkit 專案,把我昨天的 Code 新增上去了,之後應該會新增不少好用的 Extension Method,有興趣的人也可以跟我一起加入開發吧!

目前有的程式碼還不多,但是看這個專案的 Coordinators Jürgen Bäurle 好像蠻積極的,應該不久的將來有很多不錯的東西吧!

  

此文章由 will 發表於 2008/1/25 下午 08:44:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: .Net | C#

標籤: , , ,

收藏:

C# 3.0 初體驗:Extension Method

昨天寫了一篇如何取得兩個 DateTime 之間的方法,今天將昨天的東西寫成一組 Extension Method,感覺十分的好用,分享出來給大家參考!

我基本上是參照在 SQL Server 中的 DATEDIFF 函數的用法,讓熟悉 SQL 的人很容易的就能夠上手使用。

using System;

namespace ExtensionMethods
{
    static class DateTimeExtensionMethod
    {
        public static double DateDiff(this DateTime startdate, string datepart, DateTime enddate)
        {
            // 參考 SQL Server 2005 線上叢書:http://technet.microsoft.com/zh-tw/library/ms189794.aspx

            double result = 0;

            TimeSpan tsDiff = new TimeSpan(enddate.Ticks - startdate.Ticks);

            switch (datepart.ToLower())
            {
                case "year":
                case "yyyy":
                case "yy":
                    result = enddate.Year - startdate.Year;
                    break;

                case "quarter":
                case "qq":
                case "q":
                    // 每一季的平均天數
                    const double AvgQuarterDays = 365 / 4;
                    result = Math.Floor(tsDiff.TotalDays / AvgQuarterDays);
                    break;

                case "month":
                case "mm":
                case "m":
                    // 每一個月的平均天數
                    const double AvgMonthDays = 365 / 12;
                    result = Math.Floor(tsDiff.TotalDays / AvgMonthDays);
                    break;

                case "day":
                case "dd":
                case "d":
                    result = tsDiff.TotalDays;
                    break;

                case "week":
                case "wk":
                case "ww":
                    result = Math.Floor(tsDiff.TotalDays / 7);
                    break;

                case "hour":
                case "hh":
                    result = tsDiff.TotalHours;
                    break;

                case "minute":
                case "mi":
                case "n":
                    result = tsDiff.TotalMinutes;
                    break;

                case "second":
                case "ss":
                case "s":
                    result = tsDiff.TotalSeconds;
                    break;

                case "millisecond":
                case "ms":
                    result = tsDiff.TotalMilliseconds;
                    break;

                default:
                    throw new ArgumentException("You input a invalid datepart parameter.");
            }

            return result;
        }
    }
}
[/code]

至於使用上有 2 點要注意:

  1. 必須在 .NET Framework 3.5 的環境下才能執行
  2. 必須先引用 ExtensionMethods 命名空間
範例如下:

using System;

using ExtensionMethods;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            DateTime date1 = DateTime.Now.AddHours(0);

            DateTime date2 = DateTime.Now.AddHours(24).AddMonths(3);

            double DiffDays = date1.DateDiff("day", date2);

            Console.Write(DiffDays);

            Console.ReadKey();
        }
    }
}
[/code]

  

此文章由 will 發表於 2008/1/24 上午 12:11:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: .Net | C#

標籤: , ,

收藏:

C# 如何取得兩個 DateTime 日期之間的天數

在 .NET 中並沒有「直覺」的方法取得兩個 DateTime 物件之間的差異天數、月數,以致於不熟的人卻會花不少時間在找這些方法。

取得兩個日期之間的「天數」(不足一天者採「無條件刪去法」) 

[code:c#] 

new TimeSpan(date1.Ticks - date2.Ticks).TotalDays

[/code]

取得兩個日期之間的「小時數」(不足一小時者採「無條件刪去法」) 

[code:c#] 

new TimeSpan(date1.Ticks - date2.Ticks).TotalHours

[/code]

取得兩個日期之間的「分鐘數」(不足一分鐘者採「無條件刪去法」) 

[code:c#] 

new TimeSpan(date1.Ticks - date2.Ticks).TotalMinutes

[/code]

參考資料:

  

此文章由 will 發表於 2008/1/23 上午 12:03:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: .Net | C#

標籤: , , ,

收藏:

何謂「強型別」(Strong Type)

強型別 ( Strong Type ) 其實是一種觀念,是指「盡量使用具有型別的方式開發」,這樣的開發方式可以讓開發人員在「編譯時期(Compile-Time)」就能夠發現錯誤,減少「執行時期(Runtime)」發生錯誤的機會,因為「編譯時期」的錯誤可以透過「編譯器(Compiler)」在編譯的時候就幫你發現問題,找錯誤容易很多,而在「執行時期」的錯誤就比較難追蹤了,通常要有開發工具、還要下中斷點、... etc. 十分麻煩! 

我摘錄 MSDN 上的 有效率地使用資料型別 文件說明:

指定所有變數的資料型別稱為「強型別」。使用強型別有以下幾點好處:

  • 讓 IntelliSense® 能夠支援變數。這能讓您在輸入程式碼時看到變數的屬性及其他成員。
  • 可以利用編譯器型別檢查,這能找出可能因錯誤 (例如溢位) 而在 Run Time 失敗的陳述式。這也能夠偵測在不支援變數的物件上所進行的方法呼叫。
  • 執行程式碼的速度較快。

另外我也找了 Wikipedia 上的說明:

Strongly-typed programming language
http://en.wikipedia.org/wiki/Strong_typing

強類型 ( 強類型 == 強型別 )
http://zh.wikipedia.org/wiki/%E5%BC%B7%E9%A1%9E%E5%9E%8B

我舉一個最常見的例子:

相信大家很常用 ASP.NET 的 Databinding 時所用的 Eval 語法:

<%# Eval("Email") %>

這就是一個「非強型別」的例子,如果要將這行轉換成「強型別」的語法,可以改成:

<%# ((Member)Container.DataItem).Email %>

如果你哪天真的把 Email 欄位改成 EmailAddress 後,重新 compile 專案時就會發現錯誤!

「強型別」的相反就是「弱型別」,一個簡單的判斷方法就是:

  • 以 object 型別當變數型別的變數,或無法明確表達執行時期變數的型別,都屬於「弱型別變數」

    例如:Eval("Email") 回傳的型別就是 object

  • 程式所定義的變數型別等同於變數在執行時期的型別,都通稱為「強型別變數」
    - or -
    任何其他以明確的型別來宣告的變數,且在執行時期不會發生額外轉型的型別,都通稱為「強型別變數」(Strong-typed variables)

 

  

此文章由 will 發表於 2008/1/22 上午 12:06:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: .Net | ASP.NET | C#

標籤: ,

收藏: