網頁

Visual Basic -- 自動實作屬性

自動實作屬性(Auto-Implemented Property)


當我們在設計Class時,常常會需要使用"屬性(Property)"來存取Private變數,有時只是簡單的存取,但你還是必須撰寫必要的程式碼。

程式一:傳統屬性寫法
Private _name As String
'存取_name的屬性
Public Property Name As String
    Get
        Return _name
    End Get
    Set(ByVal value As String)
        _name = value
    End Set
End Property

但在Visual Basic 2010中,我們可以直接使用"自動實作屬性"功能,來快速指定Class的屬性,而不必撰寫Get與Set相關程式碼。

程式二:自動實作屬性寫法
Public Property Name As String
'可以直接設定預設值
'會自動把值給Set
'Public Property Name As String = "KKBruce"

經由程式二的自動實作屬性,Visual Basic的Compliler會自動實作相關的Get和Set程式碼,還會自動建立Private的變數(使用底線(_)加屬性名稱),簡單想,當你使用程式二的自動實作屬性寫法,那Visual Basic會自動實作程式一所有程式碼。

使用自動實作屬性有幾點要小心:
  1. 請注意Private變數名稱
    自動實作屬性會自動建立Private變數,如果自動建立的變數名稱已存在,那產生命名衝突。
  2. 陣列屬性
    自動實作屬性宣告為陣列時,無法指陣列大小,但可以提供初始值。

程式三:自動實作屬性宣告為陣列
Property Scores() As Integer
'提供初始值
'Property scores As Integer() = New Integer() {10, 20, 30}

Visual Studio - Visual Basic & LINQ Samples

Visual Studio with Visual Basic Samples



如果你有安裝
  • Visual Studio 2008:
    "C:\Program Files\Microsoft Visual Studio 9.0\Samples"之下有三個zip檔,一個是VBSamples.zip、CSharpSamples.zip、AllVCLanguageSamples.zip,裡面有許多範例,是學習不可錯過的好教材。或是可以從:Visual Basic 2008 Samples下載。
  • Visual Studio 2010:
    "C:\Program Files\Microsoft Visual Studio 10.0\Samples"一樣可以找到相關範例檔,或是可以從:Visual Basic 2010 Samples下載。

Visual Basic with LINQ



  • 如果你是學Visual Basic的人,一定會發現,市面上用Visual Basic在寫LINQ方面書或資料很少,只能說整個市場的大方向為"C#",如果你要用Visual Basic寫LINQ,那最好的資源來源還是msdn,msdn不會有大小眼,有C#就有Visual Basic版本。:Visual Basic 中的 LINQ
  • 多看多參考別人的Code也是不錯的學習方向: LINQ範例
  • 101 Visual Basic LINQ範例
  • 如果你英文及英文聽力不錯,那可以參考:Visual Basic Videos(linq)

一起加油!

Visual Studio 2010 新功能

寫MS程式不看msdn根本不可能,但想在msdn找到一篇"正確"的資料,可不簡易,在msdn裡找資料常常是:「網網相連到天邊,天外有天浩無邊。」msdn文章與wiki一樣,都是一大堆連結,常常想要有順序的看完一系列或一個主題的文章,但都會被這些連結干擾。

這一篇是「Visual Studio 2010 新功能」是入口,所有Visual Studio 2010新功能,含Visual Basic 2010、C# 2010…等程式語言,所有新功能都整理在這裡,由Visual Studio 2005/2008升級到Visual Studio 2010,由此入口進入Visual Studio 2010新環境是不錯的選擇,可以快速了解整個Visual Studio的更新與進步,也能了解各個程式語言的更新與進步。

了解Visual Studio這個IDE工具,能讓你在開發時更有效率。了解開發的程式語言,讓你開發時得心應手。

投資大師羅傑斯給寶貝女兒的12封信

對於這本《 投資大師羅傑斯給寶貝女兒的12封信》我沒有給很高的分數,整體內容而言,都是在談設資(股票)、談錢、談女兒不要接近男人,但他這12封信的標題是引起我興趣所在,單談這12標題的內容,我是很認同,但也必須考慮到一些人生背景的差異,例如:學中文這件事。我們身在台灣,實在要擔心的不是中文,而是英文。在現在9年國民教育之下,要成為一個中文文盲是一件不容易的事,但要成為一位英文文盲確是很簡單的一件事。而且這位羅傑斯大師在這裡少加了兩個很重要的字:去學「繁體」中文

我們從書中、網路影片中,他是非常「親近」中國大陸,所以他也是讓他女兒學習簡體中文,但如果要學習中文之美:形、意、象…寫個書法好了,同樣的句子你使用繁體中文與簡體中文寫出來,落差馬上就會出現,不管是草書、楷書、隸書…繁體中文才是正統的根源。

我們很幸福、也很幸運,生長在使用繁體中文的台灣,除了寫字筆畫多一點,實在看不出來有那一點簡體中文比的上。這是我們贏在起跑點上,但我們必須很努力,因為未來是個高度全球化的世界。

大陸13億人口*1%:13,000,000(一千三百萬人),對岸精鷹中的精鷹,這百分之一就已經是台灣人口的一半,也是我們必須競爭的直接對象,這也是為什麼大前研一會提出M型社會理論,未來你不是上就是下,就那選簡單。

或許,因為我沒玩股票,所以感受沒怎麼深,但單就人生智慧部份,還是有可看之處。

  1. 不要讓別人影響你──假如每個人都嘲笑你的想法,這就是可能成功的指標!
    與眾人反向而行需要勇氣。
  2. 專注於你所愛──在真正熱愛的工作上努力,就會找到你的夢想
  3. 普通常識並不是那麼普通──大眾社會相信的常常是錯的,不要盲目聽信別人的話
  4. 將世界納入你的眼界──保持開放的心,做個世界公民!
  5. 研讀哲學,學會思考──訓練自己去檢驗每一種概念、每一個事實
  6. 學習歷史──因為以前發生過的事,以後也還會再發生
  7. 這是中國的世紀,去學中文!──參與一個偉大國家的再現,購買這個國家的未來!
  8. 真正認識自己──了解你的弱點和覺察你的錯誤,才能找到對的路
  9. 認出改變,擁抱改變──改變的功能就像催化劑,保持覺知是重要的功課
  10. 面對未來──看得見未來的人可以累積財富
  11. 反眾道而行──檢視事實和機會,不隨烏合之眾心理起舞
  12. 幸運女神只眷顧持續努力的人──用功讀書,學得越多你才知道你懂得越少

升級舊版SQL Server到SQL Server 2008 R2

這先參考:SQL Server 2008 R2升級狀況。先了解一下,你目前安裝的版本與R2這一版的對應關係。

升級舊版SQL Server到SQL Server 2008 R2非常簡單,看圖說故事。

Upgrade SQL Server 2008 R2

選擇第二個「升級」,基本上都是「下一步」,然後就完成了。

ps:請注意你舊SQL Server的語言版本,如果你原始是英文版,那升級SQL Server 2008 R2也要下載英文版,繁體中文版,那升級SQL Server 2008 R2也要下載繁體中文版。而且最好安裝版本一樣,例如原始舊SQL Server是使用SQL Server 2008 Express with Tools,那升級R2最好也使用SQL Server 2008 R2 Express with Tools來安裝。

Microsoft SQL Server 2008 R2繁體中文版

很多事情跟自己想的不一樣。

我一直以為如果有更新資料,MS會同步到Express網頁,因為VS 2010的繁體中文版,就是先同步到Express網頁,所以就很"自我"的認為SQL Server 2008 R2也會如此。

凡事還是不要太自我。Microsoft SQL Server 2008 R2繁體中文版早在2010/4/20就已經上線。

因為我在使用SQL Server 2008管理工具管理SQL Server 2008 R2時一直有點問題,我一直無法使用SQL Server驗證來登入SQL Server 2008 R2,使用Windows驗證是登入、管理、使用,其本上是沒有碰到什麼問題,所以就想說等等,Visual Studio 2010繁體中文都已經更新了,SQL Server 2008 R2繁體中文應該也快了。

結果,是我自己想太多,人家早就放到Microsoft Downloads,所有工具全部齊了:

Microsoft® SQL Server® 2008 R2 PowerPivot for Microsoft® Excel - RTM 
Microsoft SQL Server 2008 R2 - Express
Microsoft SQL Server 2008 R2 - Express with Tool
Microsoft SQL Server 2008 R2 - 管理工具
Microsoft SQL Server2008 R2 RTM - Express with Advanced Services
Microsoft SQL Server 2008 R2 報表產生器 3.0
SQL Server 2008 R2 線上叢書
Microsoft® SQL Server® 2008 R2 功能套件
適 用於 Microsoft SharePoint® 技術 2010 的 SQL Server® 2008 R2 Reporting Services 增益集

學習不停下腳步。

兩副眼鏡

近視,是一件不好的事。

生長在青山綠水的宜蘭,不管怎麼看,都能看到高山白雲和一大片的綠地田野,想近視實在不容易。但上了大學,每天"住"在實驗室中,白天上課,晚上就看書、玩電腦…不睡覺,終於得了…近視嗎?不是,是得了胃潰瘍,吃了半年的藥才全癒。這樣不正常的生活,最後終於得了近視。


頭痛


近來常常頭痛,第二次去看醫生,醫生看著病歷然後抬頭看看我說:「又是頭痛嗎?」我說:「嗯。」然後他站起來,抓抓我的脖子說:「脖子肌肉整個都硬的,發炎,跟前一次一樣。」醫生說,要我多多休息,不要打電腦。

不要打電腦,我終於有理由回家鄉種田了。

隔天上班,寫請假單給我們家小姐(Joe),順便跟她小聊一下,Joe說,她之前也是一直頭痛,也看了幾個"兩光"的醫生,結果也都只是吃吃藥,但過一陣子就又發作,最後有一位醫生問題,是不是要"長時間"看著電腦螢幕,醫生建議她,可以去配兩副眼鏡,一付平常看"遠"時戴,一副看書、 看螢幕看"近"時戴。Joe說,她已經很久沒有頭痛了。

Joe的病症和我差不多,心想我一直都是一副眼鏡從早戴到晚,而且剛好我的眼鏡都被大寶貝破壞的差不多了,所以就決定去配兩副眼鏡。

婆婆真的對「Shopping、購物」很有興趣,我跟她說Joe的事,婆婆又幫我花了時間上網去找資料,然後說,網友推薦一家新竹新視界眼鏡行,價格便宜品質也不錯。

我們利用端午節假期去這家新視界眼鏡行,老闆應該是第二代,和他老婆一起顧店,整個配眼鏡過程還不錯,鏡框、鏡片的價錢真的便宜很多,我想可能是店面是自己的,又是自己顧店,所以成本比其他商店低許多,所以他們可以壓低價錢。而且我們帶小朋友去,老闆也送一付小朋友的太陽眼鏡給大寶貝,現在大寶貝每天上車都會跟我們玩cool遊戲(就是帶著太陽眼鏡在"現")。



頭痛藥也吃了,眼鏡也配了。目前為止,頭是沒有在痛,希望這兩副眼鏡讓解決我頭痛的問題。戴這副"近"的眼鏡看螢幕,個人感覺真的比較不會累。

拉拉手,來-坐

拉拉手,來…坐

最近大寶貝,實在可愛,她喜歡人陪,所以當她想做什麼事,你又不在身邊時,她就會衝過來,拉著你的手說「來…來…來」,然後拉你過去目的地,然後說「坐」,要你陪她。都覺得我快變成「小弟」了,「來→坐」。

抱緊緊

寶貝長大了。之前我都是騎機車去保母那載她回家,機車前放張小椅子,小椅子是去新竹藍印子買的,是小推車及機車坐椅兩用,不過大寶貝長大了,所以這張小坐椅已經有點小擠,如果天氣好,我會讓寶貝用站的,可能是較少用站的,所以每次用站的她都比較高興。有一次,我讓大寶貝用站得回家,給果她上車不久突然大力抱著我說:「OXO」,起初實在聽不懂,又因為其他的車聲、風聲,我又低頭問了幾次,你說什麼?大寶貝又回答了幾次,最後我終於聽出來,她說:「抱緊緊」!我們就一路上玩抱緊緊的遊戲回家。

多年以後

看著自己的孩子成長就是不一樣的感覺,我和婆婆盡量不去破壞孩子的天真(破壞性…No...@.@),而且當這些行為是發生、是針對你時,你的感受會越深,孩子本身就有無限可能,我想著,我們已經多久沒去「牽」爸媽的手了?我真希望我的孩子一輩子都能這樣對我和婆婆,等她們20歲、30歲、40歲…還能這樣拉著我們的手,說來…坐,要我們陪她,那就值得了

物件導向入門篇

在.NET Framework中,談物件導向的資料不多,但物件導向又很重要,在寫或設計物件導向,本身需要有高度「抽象化」的能力,而且絕大部份都是使用C#在談。可能是C#主要是吸引C、C++、Java方面的人來使用,所以這方面的資料很充足。但寫VB的人就比較幸苦點,除非你是雙語(C#、VB)人材,可以看C#轉VB,不然就…多用功…還是要自己加油!

  1. 物件導向(OOP)概念複習
    介紹VB中各種OOP的語法,當成複習用。
  2. 物件導向程式(OOP)設計入門(一)--物件設計
    介紹VB中Class、 Object及相關成員。
  3. 物件導向程式(OOP)設計入門(二)--物件建立
    介紹VB中Instance的建立,建構式、屬性、Me、多載、共用成員。
  4. 物件導向程式(OOP)設計入門(三)--物件導向
    介紹VB中物件導向及初始化、多重建構式。
  5. 物件導向程式(OOP)設計入門(四)--繼承Inheritance
    介紹VB中繼承。
  6. 物件導向程式(OOP)設計入門(五)--覆寫Overrides
    介紹VB中覆寫。
  7. 物件導向程式(OOP)設計入門(六)--抽象(Abstract)Class
    介紹VB中Abstract Class,在C#中直接使用Abstract關鍵字,我覺得很好,Abstract本身就是抽象的意思,不知道為什麼VB還要另外用一個MustInherit、MustOverride來當關鍵字,與「抽象」一點邊都沾不上,在記憶與聯想上就要小心一點。
  8. 物件導向程式(OOP)設計入門(七)--介面Interface
    介紹VB中Interface。

看完最後兩篇,你或許會覺得「Abstract」與「Interface」很像,但本質上兩者是不同的,你必須就使用的時機點與功能上的差異來比較,就能清楚了解什麼時候使用Abstract,什麼時間點使用Interface。

Abstract:

  • Abstract Class不能Instance。即不能使用New關鍵字初始化。
  • Abstract Class是必須被衍生Class覆寫方法。
  • 衍生Class可以部份實作。
  • 如果Class中包含Abstract Method(抽象方法),那麼此Class就必須定義為Abstract Class。
  • 一個Class只能繼承一個Abstract Class。
Interface:
  • Interface不能Instance,不能有建構式、成員。
  • 不能有修飾詞,Public、Private…等。
  • 不能宣告為共用成員。
  • 實作Interface必須實作Interface所有方法及屬性。
  • 一個Class可實作多個Interface。
除了實際功能面的差異外,另外Abstract Class一般都是在Class程式碼撰寫過程慢慢被發現,進而從Class提升為Abstract Class,我們應盡量讓Abstract Class擁有最多的共用程式碼,盡量減少資料。而Interface比較像定規格,一般而言都是一開始就設計、定義,也是另一種的「藍圖」,一開始在什麼都不知道的情況下,預先設計好相關架構。

如果從上述角度來看,除非你是「架構師」等級的人材,不然應該不太常使用Interface,而會常使用到Class與Abstract Class。等到你在整個Class與Abstract Class有一個層度後,那你可以更進一步向「Design Patterns(設計樣式)」來學習。

物件導向程式設計入門(Object-Oriented Programming,OOP) for Visual Basic(七)--介面Interface

介面Interface

Interface只定義Interface規格,方法成員內容則由繼承介面的衍生Class依需求提供實作,而介面最大好處是將方法成員的規格實作分開


介面範例

以學校為例,學校會有加退選課系統,那讓我們就可以使用Interface來定相關加選課與退選課的規格,我們新增一個介面IElective.vb檔:

Public Interface IElective
    '加選
    Function enrollment(ByVal name As String, ByVal id As String) As Boolean
    '退選
    Function withdrawal(ByVal name As String, ByVal id As String) As Boolean

End Interface

介面實作

由於Interface必須由繼承的衍生Class實作所有方法,因此Interface一律為Public修飾詞,所以不需要修飾詞,而Interface命名習慣以大寫"I"為開頭。函式(Sub或Function)只需定義名稱及參數即可,實作的衍生Class必須實作所有方法成員,即使沒有實作相關內容,還是必須在實作的衍生Class裡保留定義Interface方法

Interface IElective → 由StudentClass.vb類別檔及AcademicAffairs.vb類別檔繼承,學生需要加退選課的功能,但學務處只需要學生加選課相關功能。此時AcademicAffairs.vb未實作退選課功能,但還是必須保留相關定義。實作Interface必須使用Implements關鍵字,當你輸入完Implements IElective後,Visual Studio會自動帶出所有Interface方法成員。注意方法的最後面會自加上Implements IElective.enrollment等關鍵字,代表此方法為實作Interface。

StudentClass.vb
Public Class StudentClass
    Implements IElective

    Public Function enrollment(ByVal name As String, ByVal id As String) As Boolean Implements IElective.enrollment
        '實作內容
    End Function

    Public Function withdrawal(ByVal name As String, ByVal id As String) As Boolean Implements IElective.withdrawal
        '實作內容
    End Function
End Class

AcademicAffairs.vb
退選課功能未實作之功能,但必頁保留Interface定義。
Public Class AcademicAffairs
    Implements IElective

    Public Function enrollment(ByVal name As String, ByVal id As String) As Boolean Implements IElective.enrollment
        '實作
    End Function

    Public Function withdrawal(ByVal name As String, ByVal id As String) As Boolean Implements IElective.withdrawal
        '未實作之功能,但必頁保留定義
    End Function
End Class

介面繼承

假設我們還有一個成績Interface:IStudentResults.vb介面檔,成績的計算必須依賴選課,所以Interface IElective被Interface IStudentResultsb繼承,Interface IStudentResults被Class AcademicAffairs繼承,而AcademicAffairs.vb類別檔必須實作所有Interface的方法成員(IElective及IStudentResults)。

IStudentResults.vb:
Public Interface IStudentResults
    Inherits IElective

    Function Results(ByVal name As String, ByVal numeric As Double) As Double

End Interface

AcademicAffairs.vb(須實作IStudentResults)。注意函數最後面會有Implements IElective.enrollment及Implements IStudentResults.Results等字,讓我們可以清楚看出來是實作那一個Interface的方法成員。

AcademicAffairs.vb
Public Class AcademicAffairs
    Implements IStudentResults

    Public Function enrollment(ByVal name As String, ByVal id As String) As Boolean Implements IElective.enrollment
    '實作
    End Function

    Public Function withdrawal(ByVal name As String, ByVal id As String) As Boolean Implements IElective.withdrawal
    '實作
    End Function

    Public Function Results(ByVal name As String, ByVal numeric As Double) As Double Implements IStudentResults.Results
    '實作
    End Function
End Class

多重介面

在.Net Framework不充許多重Class繼承,但卻可以多重Interface繼承來同時實作多個介面。實作多重Interface繼承只在逐一加入Implements InterfaceName即可。

Public Class OOP
    Implements IAnimals
    Implements IBehavior

    '實作IAnimals及IBehavior所有方法成員
End Class

物件導向程式設計入門(Object-Oriented Programming,OOP) for Visual Basic(六)--抽象(Abstract)Class

抽象Class

抽象Class包含了一個以上的抽象方法,這些方法只提供「函數名稱參數設定」,並且由繼承的衍生Class實作。衍生Class必須實作所有抽象Class的抽象方法,否則本身將成為另一個抽象Class。抽象Class本身無法產生Object。

前面我們提到Class本身像藍圖,但這裡的抽象Class是藍圖中的藍圖,以房子為例,抽象Class只定義房子必須要有窗戶、門、樓層…此類大項目,,但細節類的實作,例如窗戶的大小、樣式、顏色…由衍生Class來實作即可。如果基礎Class又稱父Class,那我們把抽象Class稱為祖Class好了。

抽象Class範例

我們新增一個抽象Class檔案House.vb,然後定義最上層必須的架構。注意第一行必須是MustInherit Class House,而不是Public Class House,而其中抽象方法必須使用MustOverride關鍵字修飾:
House.vb
MustInherit Class House

    MustOverride Function Window(ByVal name As String, ByVal size As String, ByVal color As String, ByVal style As String) As String
    MustOverride Function Door(ByVal name As String, ByVal size As String, ByVal color As String, ByVal style As String) As String
    MustOverride Sub Floor(ByVal floors As Integer)

End Class
定義房子必須要有窗戶、門、樓層。,窗戶有商品名稱(name)、大小(size)、顏色(color)、樣式(style)等屬性。門及樓層類推。

然後我們新增一個建案要使用的Class檔案Diamond.vb,然後繼承House Class,當你打上關鍵字Inherits House後,Visual Studio會自動帶出抽象Class中所有的抽象方法,。
Diamond.vb
Public Class Diamond
    Inherits House

    Public Overrides Function Door(ByVal name As String, ByVal size As String, ByVal color As String, ByVal style As String) As String

    End Function

    Public Overrides Sub Floor(ByVal floors As Integer)

    End Sub

    Public Overrides Function Window(ByVal name As String, ByVal size As String, ByVal color As String, ByVal style As String) As String

    End Function
End Class

注意,我們必須實作所有抽象方法,如本身又包含其他抽象方法,或沒有實作所有繼承來的抽象方法,則此Class還是必須以MustInherit關鍵字修飾,因為它本身還是抽象Class,因此無法被用來建立Object。抽象Class在你需要建立Class樣版時會很有用。

物件導向程式設計入門(Object-Oriented Programming,OOP) for Visual Basic(五)--覆寫Overrides

覆寫(Overrides)

我們從基礎Class繼承之後,我們還可以依照需求對從基礎Class繼承的方法進行擴充或改寫,此機制稱覆寫

方法覆寫

於基礎Class宣告Overridable方法(可覆寫方法),使方法能被覆寫。依前一篇範例,我們在Animals.vb裡新增可被覆寫的方法。

Public Class Animals

    Public Overridable Function Style() As String
        'Do Something ...
    End Function

    Public Overridable Sub Sound()
        'Do Something ...
    End Sub
End Class

然後於衍生Class宣告Overrides方法,來覆寫基礎Class的方法。我們在Cat.vb中覆寫Animals.vb的方法。

Public Class Cat
    Inherits Animals

    Public Overrides Function Style() As String
        Return MyBase.Style()
    End Function

    Public Overrides Sub Sound()
        MyBase.Sound()
    End Sub
End Class

一但衍生Class覆寫了基礎Class的方法,在衍生Class中所引用的將一律是覆寫的方法

MyBase呼叫基礎Class的方法

在衍生Class覆寫基礎Class的方法後,呼叫一律是覆寫的方法,但如果有需要呼叫基礎Class的方法,則需要使用MyBase關鍵字來進行基礎Class的方法引用

在衍生Class建立新方法

在衍生Class定義的成員與基礎Class定義的成員有相同的名稱,此時Complier必須界定此成員是由衍生Class定義實作,而非繼承自基礎Class。當你要在衍生Class提供一個同名方法,而非基礎Class的覆寫方法,必須使用Shadows關鍵字。

衍生Class建立新方法

依前一篇的範例,我們在Dog.vb類別檔中建立兩個新函數。

Public Class Dog
    Inherits Animals

    Public Shadows Function Style() As String
        'Class Dog自有方法
    End Function

    Public Shadows Sub Sound()
        'Class Dog自有方法
    End Sub

End Class

建構式繼承

在繼承關係中,基礎Class與衍生Class的建構式是各自獨立。

Animals.vb建構式:
Public Class Animals

    Sub New()
        'Animals建構式
    End Sub
End Class

Pig.vb建構式:
NotInheritable Class Pig
    Inherits Animals

    Sub New()
        'Pig建構式
    End Sub
End Class

當我們進行物件的建立時(Dim pig3 As New Pig),程式執行流程:呼叫基礎Class建構式(Animals)→呼叫衍生Class建構式(Pig)→建立Object(pig3)

  • 在Class中若沒有設定任何建構式,預設會呼叫"無參數"的建構式
  • 若在衍生Class中使用MyBase.New()呼叫基礎Class的建構式後,則衍生Class的預設建構式不會被執行。
  • 若基礎Class中任何"無參數"建構式,則衍生Class必須明確引用基礎Class的建構式。
    例如:Animals.vb中只有Sub New(ByVal name As String),但無Sub New(),則所有衍生Class(Cat.vb, Dog.vb, Pig.vb)都必須明確引用Animals.vb裡的建構式,MyBase.New("小花")。

物件導向程式設計入門(Object-Oriented Programming,OOP) for Visual Basic(四)--繼承Inheritance

繼承Inheritance

  • 繼承的原始類別稱「基礎Class」或「父Class」,繼承基礎Class的新Class稱「衍生Class」或「子Class」。
  • 衍生Class會繼承基礎Class的「Public成員」,然後依需求直接使用或是改寫與擴充基礎Class的功能。
  • 在.NET Framework繼承關係只會向下傳遞,而且.NET Framework不支援多重繼承,每一個Class只能繼承一個Class

繼承範例

我先新增一個Animals.vb類別檔,此Class為基礎Class:
Animals.vb
Public Class Animals

  '定義動物相關特性
End Class

再新增兩個Cat.vb類別檔及Dog.vb類別檔,然後「繼承Animals.vb類別」:
Cat.vb
Public Class Cat
    Inherits Animals

    'Do Something
End Class

Dog.vb
Public Class Dog
    Inherits Animals

    'Do Something
End Class

在Class設計過程,你如果程式有著上下關係,而且上(基礎Class)可以不斷給下(衍生Class)重覆利用,這樣的模式就非常適合使用繼承的方式來設計Class。

限制繼承

在Class繼承關係中,雖然只能衍生一代的繼承關係,但對「深度」並沒有限制,即繼承關係下的「衍生Class」也可以當其他Class的基礎Class,進而形成一個Tree架構。如果想限制此Class不可繼承,必須使用NotInheritable關鍵字宣告

限制繼承範例

新增一個Pig.vb類別檔,宣告為不可繼承。注意第一行,不是使用Public Class Pig,而是NotInheritable Class Pig。
Pig.vb
NotInheritable Class Pig
    Inherits Animals

    'Do Something ...
End Class 

這樣,你在其他一個Class,例如Pig3(三隻小豬)下Inherits關鍵字時,清單中就不會出現Pig Class,就算是手動打上去,也是會產生錯誤。

物件導向程式設計入門(Object-Oriented Programming,OOP) for Visual Basic(三)--物件導向

物件導向

Object-Oriented Programming, OOP,物件導向程式設計。
  • Object是Class的Instance。
  • Class是Object的定義。描述Object的組成與功能。
  • Object使用前必須建立Class的Object(Instance)(使用New)。
    真正被用來處理問題的是Object,而Class決定了Object的行為。

物件導向範例

Public Class Student

    Private _name As String
    Private _id As String

    Sub New()
        _name = "無名"
    End Sub

    Sub New(ByVal name As String)
        _name = name
    End Sub

    Sub New(ByVal name As String, ByVal id As String)
        _name = name
        _id = id
    End Sub

    Public Property Name As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            If value.Length > 0 Then
                _name = value
            End If
        End Set
    End Property

    Public Property id As String
        Get
            Return _id
        End Get
        Set(ByVal value As String)
            If value.Length > 0 Then
                _id = value
            End If
        End Set
    End Property
End Class

在程式碼中必須先初始化(New),然後才能存取。
Public Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim s001 As New Student
        Dim s002 As New Student("Bruce")
        Dim s003 As New Student("Sherry", "S201010003")

        '無名
        Response.Write(s001.Name.ToString())
        'Bruce
        Response.Write(s002.Name.ToString())
        'S201010003
        Response.Write(s003.id.ToString())
    End Sub
End Class

物件導向的三大特性

  1. 封裝
    將程式碼包裝成為Class以提供特定功能的一種過程。好處:程式碼共用
  2. 繼承
    Class可透過Inheritance(繼承)來擴充(或修改)內容。
  3. 多型
    在執行階段,定義可供用戶端程式碼交換使用,具有不同功能名稱完全相同之方法或屬性的Class。

這問題的答案,您知道嗎?

答不對,別挫折喔!我一題都沒答對,原來「常識是最不簡單的」。

http://www.crown.com.tw/crown98/10Oct/exQI.html

[轉貼]各國家的文化

笑笑就好。^_^

日本文化

日本 的一家公司要招聘10名員工,經過一段嚴格的面試~ 公司從三百多應徵者中選出了10位佼佼者。
放榜這天,一個叫水原的青年看見榜上沒有自己的名字, 悲痛欲死,回到家中便要切腹自殺 !
幸好親人及時搶救,水原沒有死成。
正當水原悲傷之時,從公司卻傳來好消息:水原的成績原是名列前矛的,只是由於電腦的錯誤 導致了水原的落選。
正當水原一家人欣喜若狂之時,從公司又傳來消息:水原被公司除了名。
原因很簡單,公司老闆說: 如此小的挫折都受不了, 這樣的人在公司是不成什麼大事的。

美國文化

美國的一家公司要招聘10名員工,經過一段嚴格的面試~ 公司從三百多應徵者中選出了10位佼佼者。
放榜這天,一個叫 湯姆的青年看見榜上沒有自己的名字, 悲痛欲死,回到家中便要舉槍自盡 !
幸好親人及時搶救,湯姆沒有死成。
正當湯姆悲傷之時,從公司卻傳來好消息:湯姆的成績原是名列前矛的,只是由於電腦的錯誤 導致了湯姆的落選。
正當湯姆一家人欣喜若狂之時,美國各大州的之知名律師都來到湯姆的家中,他們千方百計的 鼓動湯姆到法院告這家公司,聲稱需 支付巨額的精神賠償 ,並 自告奮勇的充當湯姆的律師。

德國文化

德國的一家公司要招聘10名員工,經過一段嚴格的面試~ 公司從三百多應徵者中選出了10位佼佼者。
放榜這天,一個叫蕭恩的青年看見榜上沒有自己的名字, 悲痛欲死,回到家中便要跳河自殺 ,幸好親人及時搶救,蕭恩沒有死成。
正當蕭恩悲傷之時,從公司卻傳來好消息:蕭恩的成績原是名列前矛的,只是由於電腦的錯誤導致了蕭恩的落選。
正當蕭恩欣喜若狂之時,蕭恩的父母卻堅決反對自己的兒子進入這家公司。
他們的理由不容置疑:這家公司作業效率如此差勁 ,進入這家公司對兒子的成績毫無益處。

大陸文化

大陸的一家公司要招聘10名員工,經過一段嚴格的面試,公司從三百多應徵者中選出了10位佼佼者。
放榜這天,一個叫志強的青年看見榜上沒有自己的名字, 悲痛欲死,回到家中便要 懸樑自盡 , 幸好親人及時搶救,志強沒有死成。
正當志強悲傷之時,從公司卻傳來好消息:志強的成績原是名列前矛的,只是由於電腦的錯誤導致了志強的落選。
正當志強欣喜若狂之時,志強的父母來到公司,一看到公司老闆便跪了下來 , 他們含淚的說真多虧你救了我兒子。代感謝你的大恩大德 !

台灣文化

台灣的一家公司要招聘10名員工,經過一段嚴格的面試,公司從三百多應徵者中選出了 10位佼佼者。
放榜這天,一個叫俊傑的青年看見榜上沒有自己的名字,悲痛欲死,回到家中便要磕藥自殺,幸好親人及時搶救,俊傑沒有死成。
正當俊傑悲傷之時,從公司卻傳來好消息:俊傑的成績原是名列前矛的,只是由於電腦的錯誤導致了俊傑的落選。
正當傑欣喜若狂之時,媒體大幅報導此事,並邀請俊傑參加各種CALL IN評論及綜藝節目,全國輿論熱烈討論電腦為何會出錯,是否有黑道介入或官商勾結,反對黨更進一步提出「總統下臺、以示負責」的要求..... -至於俊傑到底有沒有去該公司上班,根本沒有人關心...

物件導向程式設計入門(Object-Oriented Programming,OOP) for Visual Basic(二)--物件建立

  1. Class
    Class是用來封裝功能程式碼的邏輯單位。
  2. 建立Class的Instance
    dim MyObject as New OOP

    • MyObject是你所要建立的Instance
    • New關鍵字,指定要建立的Class名稱
    流程:

    1. 配置RAM空間給MyObject
    2. 建立一個OOP的Object(物件的實體)
    3. 將MyObject參考物件實體所在位置的RAM Address
    在我學習物件導向的過程裡,Class→Object(Instance)想了很久才想通,一般都是用車子之類當例子,但我想用自身實例最有感覺,我的第二個小孩快到出了,你這樣想,人類男性的精子與女性的卵子就是Class,Class就是基因,基因裡有許許多多密碼(資料成員、方法、屬性、建構子),而精子與卵子結合後就會產生Instance(New),Instance就是實體,是一個活泩生的實體,基因你看不到、摸不到,未結合前我們無法使用它,一但結合後才能產生一個有血有肉的實體,我們才能教育他,在基因裡封裝了許多密碼,也就是會讓你小孩出生後會產生「眼睛像爸爸」「臉像媽媽」…這叫做繼承,這些密碼除了繼承了父母親的基因之外,到了小孩的身上,小孩本身還會自己覆寫這些基因,所以才會有青出於藍勝於藍。
  3. 建構式"參數"與"多重"建構式

    • 無參數(參考範例1)
    • 參數(參考範例2)
    • 多重建構式(參考範例3)
      在同一Class可新增多個建構式來處理不同Data Type(資料型別)的問題,例如一個處理Integer,一個處理Double,在你初始化時,依你傳入的參數型別來呼叫對應的建構式。
  4. 屬性(Property)
    屬性讓引用Class的程式碼於存取Class內部資料成員時,受到進一步的控管。一個設計良好的Class,變數通常被宣告為Private,被限定為只能在定義它的Class內部作存取,然後藉由使用屬性成員公開資料成員值。
  5. Me關鍵字(參考範例4)
    Me讓我們用來區別是Class變數或區域變數,Me能讓你取得Class變數。
  6. 方法多載(參考範例5)
    在同一Class中,你可以使用同一名稱為一個以上的方法命名,只要方法成員所接受的參數不同即可。
  7. 共用(靜態)成員(參考範例6)
    共用成員以物件導向實作"全域變數",不需要產生Class Instance,即不需要透過New的程式(dim MyObject as New OOP),即可直接引用。共用成員須使用Shared關鍵字宣告,一但宣告為共用成員,可直接透過點(.)運算子直接取用。共用成員並不會隨Object建立有不同的值,固因只有固定不隨物件Instance改變的資料成員,才考慮建立為共同成員。

範例1:無參數建構式

Public Class OOP

  Sub New()
  'Do Something ...
  End Sub

End Class

範例2:參數建構式

Public Class OOP

  Sub New()
  'Do Something ...
  End Sub

  '參數建構式
  Sub New(ByVal name As String)
  'Do Something ...
  End Sub

End Class

範例3:多重參數建構式

Public Class OOP

  Sub New()
  'Do Something ...
  End Sub

  '處理整理的建構式
  Sub New(ByVal a As Integer, ByVal b As Integer)
  
  End Sub
  '處理浮點數的建構式
  Sub New(ByVal a As Double, ByVal b As Double)
  
  End Sub

End Class

範例4:Me關鍵字

Public Class OOP

Public Hour As Integer

  ''' <summary>
  ''' 在函式中會使用到Class變數Hour,但Class的Hour數變與函式參數Hour同名,所以必須使用Me關鍵字來需得Class變數Hour的值。
  ''' </summary>
  ''' <param name="Hour">函式區域變數</param>
  ''' <remarks></remarks>
  Public Sub HourTrans(ByVal Hour As Integer)
    Me.Hour = Hour
    'Do Something ...
  End Sub

End Class

範例5:方法多載

Public Class OOP

  '處理整數加法
  Public Function Add(ByVal a As Integer, ByVal b As Integer) As String
  'Do Integer Add
  End Function

  '處理浮點數加法
  Public Function Add(ByVal a As Double, ByVal b As Double) As String
  'Do Double Add
  End Function

End Class

範例6:共用成員

Public Class OOP

  Public Shared dayhour As Integer = 24
  Public Shared Function HourTrans(ByVal hour As Integer) As String
  'Do Something ...
  End Function

End Class
在程式碼中:
Public Class _Default
  Inherits System.Web.UI.Page

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim resultHour As String
    '直接使用Class名稱(OOP)來引用方法
    resultHour = OOP.HourTrans(16)
  End Sub
End Class

物件導向程式設計入門(Object-Oriented Programming,OOP) for Visual Basic(一)--物件設計

物件導向程式設計是一門很好玩的"方法論",當你在基本的程式設計上已經駕輕就熟,想要更上一層樓時,就可以往物件導向程式設計的方向來前進。物件導向本身使用很多方法理論的知識,而不是程式設計的內容,所以讀起很苦澀,我想用比較簡易的方法帶大家入門


接下來的幾篇都不會太大,因為物件導向本身是個思考的過程,所以小小一篇有利吸收,一次吸收一點點,慢慢了解物件導向的思考過程,進而加強整體程式設計的實力。

  1. 類別(Class)
    Class有同類的意思。
  2. 物件(Object)
    Object都是參考某個Class類別產生Instance(實例、實體),所以Class可視為Object的"樣板"或"藍圖"。
  3. 設計類別
    一個類別裡包含四大元素:




    • 資料成員、資料變數、欄位(Field)成員;
      為Class中所定義各種Data Type變數。名稱很多種,簡單記成Class裡的"變數"就好了。
    • 方法(函式、副程式);
      資料成員用來記錄資料,但如果要行進資料處理資料邏輯判斷,則要用方法。




      • 副程式(Sub),執行後無回傳值
      • 函式(Function),執行後可將結果傳回(return)
    • 屬性
      用來存取Class資料成員的值。它提供外部程式存取Class內部資料成員的彈性,又可以在存取同時加入邏輯判斷
    • 建構子
      在Object建立時(初始化)執行一段程式。
  4. 修飾元




    • Public
      共用成員,Class內外程式碼都可以存取。
    • Private
      私有成員,只有成員宣告範圍的程式碼才能存取(預設)。
      即這個Class.vb程式碼(此物件本身)內部才能存取。
    • Protected
      介於Public與Private之間,只有宣告範圍及繼承架構下的Class才能引用。
      即這個Class.vb程式碼(此物件本身)內部及繼承此Class.vb物件的物件才能存取。

屬性範例

我們Class中放一個Private _birthday As Date,基本上是可以存放"任何時間",但Birthday是不可能發生在未來。
Public Class OOP

    Private _birthday As Date
    ''' <summary>
    ''' 生日,但生日無法設定在未來。
    ''' </summary>
    ''' <value></value>
    ''' <returns>日期(生日)</returns>
    ''' <remarks>設定(Set)時必須判斷是否小於現在(Now)</remarks>
    Public Property Birthday() As Date
        Get
            Return _birthday
        End Get
        Set(ByVal value As Date)
            If value <= Now Then
                _birthday = value
            Else
                _birthday = Now.Date
            End If
        End Set
    End Property

End Class
如果我們想在加一個年紀屬性呢?分析一下,你會發現年記會隨時間遞增不固定,而且無法設定,必須從生日計算。
Public Class OOP

    Private _birthday As Date
    ''' <summary>
    ''' 生日,但生日無法設定在未來。
    ''' </summary>
    ''' <value></value>
    ''' <returns>日期(生日)</returns>
    ''' <remarks>設定(Set)時必須判斷是否小於現在(Now)</remarks>
    Public Property Birthday() As Date
        Get
            Return _birthday
        End Get
        Set(ByVal value As Date)
            If value <= Now Then
                _birthday = value
            Else
                _birthday = Now.Date
            End If
        End Set
    End Property

    ''' <summary>
    ''' 年紀會隨時間遞增,不固定,可從Birthday推得。
    ''' </summary>
    ''' <value></value>
    ''' <returns>String(年紀)</returns>
    ''' <remarks></remarks>
    Public ReadOnly Property Age() As String
        Get
            Return (Now.Year - _birthday.Year + 1).ToString()
        End Get
    End Property

End Class

取得ASP.NET控制項所產生的HTML

這是網友在藍色小鋪發問的內容,版主hunterpo給了一段很棒的範例程式碼,但C#的語法,我實在「沒法Do(台)」,所以就自己動手轉Code一下,貼在這裡留個記錄。

Default.aspx

>form id="form1" runat="server">
  <div>
  <asp:panel id="Panel1" runat="server">
    PANEL 測試內容。
    <asp:button id="Button1" runat="server" text="Button" />
  </asp:panel>
  <div id="div1" runat="server">
    DIV 測試內容。
    <asp:button id="Button2" runat="server" text="Button" />
  </div>
  <asp:literal id="Literal1" runat="server">>/asp:literal>
</form>

Default.aspx.vb


需要先「Imports System.IO」命名;
''' <summary>
    ''' 取得控制項輸出的 HTML
    ''' </summary>
    ''' <param name="control">目標控制項</param>
    Private Function GetHtmlText(ByVal control As Control) As String
        Dim sw As New StringWriter
        Dim hw As New HtmlTextWriter(sw)

        control.RenderControl(hw)
        hw.Flush()

        Return sw.ToString()
    End Function

    Public Overrides Sub VerifyRenderingInServerForm(ByVal control As System.Web.UI.Control)
        '覆寫以取消驗證控制項必須出現在 form 的開頭和結尾標記之間。
        'MyBase.VerifyRenderingInServerForm(control)
    End Sub

    Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
        EnableEventValidation = False
    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim p As String = GetHtmlText(Panel1)
        Dim d = GetHtmlText(div1)

        Literal1.Text = "Panel:" & Server.HtmlEncode(p) & "
" & "div:" & Server.HtmlEncode(d)
    End Sub

重點在GetHtmlText方法上,System.IO是我比較少用的類別,順便學習一下。

Visual Studio 2010 新發現(5)--程式曲線(squigglies)

程式寫久了,難免會「凸切」(台),各位在Visual Studio畫面上一定發現,常常我們的程式碼下面跑條線出來,有時程式沒出錯也會有那條線,出錯更是不用說,那這條線到底是什麼意思呢?


  • 紅色曲線標記的是語法錯誤。如果畫面上有紅線, 那一定有錯,執行一定出錯。如果Visual Studio 2010可以修正的問題,那線的右下方會有一個小小小的紅色長方型可選擇,裡面會提供Visual Studio 2010的建議。
  • 藍色曲線標記的是編譯器所偵測到的語意錯誤,例如在目前的內容中找不到輸入錯誤的類別名稱。一樣,如果Visual Studio 2010可以修正問題,也會有紅色小長方型可選擇。
  • 紫色曲線標記的是其他錯誤。(我沒看過)
  • 綠色曲線標記的是警告。例如宣告變數沒給初始值,或宣告變數未使用。
我聽某位MVP說,綠色曲線可能是未來不支援的寫法。我的經驗是語法不夠嚴謹(尤其是寫VB),通常就會出現這種綠色曲線,綠色曲線無傷大雅,但能修正是最好。紅色與藍色通常是一定出錯。

Visual Studio 2010 新發現(4)--增強式複製、貼上(Clipboard ring)

「複製、貼上」雖然是程式架構的大忌,但我想在過十年、百年「複製、貼上」還是會活的好好的。

Visual Studio 2010中,增強了「複製、貼上」的功能,英文稱「Clipboard ring」功能,Visual Studio 2010會記住最後複製的 20 個項目。若要循環使用這些複製的項目,並選擇其中一項貼到目前的檔案中,請按 CRTL + SHIFT + V
  
簡單來說,就是你每一次按下Ctrl + C,Visual Studio 2010會幫你記下最後的20次,當你要使用非最近一次,例如前面第五次Ctrl + C的內容時,你就連續按下CRTL + SHIFT + V五次,你每一次按下CRTL + SHIFT + V,就能看到你Ctrl + C內容不斷切換。

在web.config中引用外部組態檔

如果網站上線時間越久,然後,網站不斷更新、維護,你有可能會發現,我們慢慢在web.config組態檔裡加東加西,web.config慢慢的就會越來越「肥大」,肥大不是一件好事,所以就管理方面,我們也希望可以進行切割,就像Web一切割分成HTML、CSS、JavaScript一樣,尤其是在Visual Studio 2008 + .NET Framework 3.5之前,web.config可是一點都不小。

所謂的切割,就是把web.config裡的標籤分類後放到不同的檔案裡,檔案命名上也是以*.config來結尾,以方便管理,最後在web.config中進行引用,專業一點會把切割出來的組態檔稱:「外部組態檔」。

切割的方式非常的簡單,你可以在網站專案一開始就切割,或是網站專案完成,上線之前來進行切割,或上線之後再切割也行,反正就是當你感覺web.config的內容已經太多太大,每次找個東西都要上拉下拉,浪費不少時間時就適合切割。


一、建立外部組態檔

檔案命名上,我會依內容在web.config內的名稱來命名檔案名稱。例如:appSettings.config、connectionStrings.config,這樣一眼就可以看出來這個外部組態檔是放那個組態設定。

<?xml version="1.0"?>
<appSettings>
   <add key="CopyRight" value ="(c) Copyright 2010 KingKong Bruce Technology Inc."/>
</appSettings>

第一行一定要設定XML宣告,後面將原web.config的內容複製過來。

二、在web.config引用外部組態檔

外部組態檔的引用可以透過configSource屬性值定所要引用的組態檔是哪一個外部檔案。使用外部組態檔有以下幾個優點:

  1. 針對不同的項目設定,模組化的結構,方便管理
  2. 隨時改變外部組態檔,並不會重新啟動應用程式

第2點解釋一下,實際網站上線後,在以下幾種情況之下都會重新啟動網站應用程式,進而造成使用者的狀態維護失效:

  • 增、刪、修Bin目錄下的組件。
  • 增、刪、修App_GlobalResources或App_LocalResources目錄下的資源檔。
  • 增、刪、修Global.asax。
  • 增、刪、修App_Code目錄下的原始程式碼檔。
  • 增、刪、修Profile設定。
  • 增、刪、修App_WebReferences目錄下的Web參考。
  • 增、刪、修web.config。

也就是說,只要我們動到web.config任何設定,效果是立即馬上反應,但透過外部組態檔的方式,因為不是直接動到web.config檔案,所以不會立即生效,這點差異各位要了解,要讓外部組態檔中的設定生效,也簡單,就是不去理它,設定完成後的下一位Client User會自動使用新的設定來運作,而舊Client User不受影響。

在web.config中引用外部組態檔很簡單,在要設定的標籤加上configSource屬性即可,範例如下:

<appSettings configSource="appSettings.config" />
<connectionStrings configSource="connectionStrings.config" />

這樣就完成外部組態檔的設定。

鄒奇奇 : 大人能向小孩學到什麼


畫面上能選「字幕」。

很棒的演講,看來我應該買本「亞理思多德」來看看,然後講給寶貝們聽(~笑~)!

Visual Studio 2010 新發現(3)--快速放大縮小Code文字

使用Visual Studio 2010是快樂的。

我們在Visual Studio 2008要調整字型大小,可不一件簡單的事,先到Option→然後…→然後…,調整完再回*.aspx.vb / *.aspx.cs看一下是不是想要的大小,不是再到Option調一次。反正調個大小在Visual Studio 2008都能是件不簡單的事。

但在Visual Studio 2010是調整大小是一件快樂的事,各位也知道,當我們的Monitor上滿滿都是小字時,那種工作的感覺總是差點了,對眼睛又傷,我猜寫Visual Studio的工程師可能是自己都眼睛脫窗了,所以終於改進了Visual Studio 2010在文字大小方面的可用性。

在Visual Studio 2010視窗最下方,多了一個百分比的選擇項:


只要一個簡單的選擇動作,你看看:


放大、縮小終於只在一瞬間,重要的是,在(大)(寬)Monitor上將字放大來撰寫Code真的很舒服。


放大縮小加強版

不管在*.aspx原始檔或是*.aspx.vb/*.aspx.cs後置程式碼裡,只在使用「Ctrl + 滑鼠滾輪」既可快速放大縮小文字。超棒的。

程式存取web.config注意事項

在學習或使用ADO.NET的過程裡,常常會需使用程式來讀取web.config裡的資料庫連線字串,原因無他,因為連線字串"LoLo長",沒有人背得起來,背的起來的人也太…不長進,寫在web.config的美意不只要心領,像我們走過ASP到ASP.NET的路,所以能了解光一個web.config就讓我高興不知道多久!

程式碼裡的連線字串

Dim conn As New System.Data.SqlClient.SqlConnection("Data Source=192.168.1.10\SQLEXPRESS;Initial Catalog=Northwind;Persist Security Info=True;User ID=bruce;Password=1234567890")

這種寫在程式碼的缺點是,萬一連線字串有任何修改,例如:資料庫伺服器修改IP,你必須找出"所有"有寫連線字串的程式,然後一行一行修改。這無疑是走回頭路,不可取也。

web.config裡的連線字串(for .NET Framework 4.0)

<?xml version="1.0"?>

<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->

<configuration>
    <appSettings >
        <key="CopyRight" value ="(c) Copyright 2008 KingKong Bruce Technology Inc."/>
    </appSettings>
    <connectionStrings>
        <add name="NorthwindConnectionString" connectionString="Data Source=192.168.1.10\SQLEXPRESS;Initial Catalog=Northwind;Persist Security Info=True;User ID=bruce;Password=1234567890"
            providerName="System.Data.SqlClient" />
    </connectionStrings>
    <system.web>
        <compilation debug="true" strict="false" explicit="true" targetFramework="4.0" />
    </system.web>

</configuration>

透過web.config集中統一的管理,而且我們可以新增多組連線字串,我們只需要在程式端使用程式碼取得web.config裡連線字串(<connectionStrings>)中的name屬性值(<add name="..." ...>),程式會自動幫我們對應相對的連線字串。想想,今天不管我們要進行任何連線字串的修改,只要修改web.config中的連線字串,*.aspx中的程式碼"立即"跟著變動,也就是說:「牽一髮而動全身」,這種設計及使用,才是正確的方向。

程式存取web.config

能work,但錯誤的方式

我不只一次,而且還很常在各大作者的書,各大討論區、論壇中看到以下此種寫法,這種做法我不說你一定不知道是錯誤的,因為「它」能非常非常正常的work,這也是標準的「能動就好」,管它對不對!

錯誤但能正確運作的程式:
Imports System.Configuration
Imports System.Data.SqlClient

Public Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim conn As New SqlConnection(ConfigurationManager.ConnectionStrings("NorthwindConnectionString").ConnectionString.ToString())
        'Do Something
    End Sub

End Class


正確版程式碼--使用System.Web.Configuration

Imports System.Web.Configuration
Imports System.Data.SqlClient

Public Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim conn As New SqlConnection(WebConfigurationManager.ConnectionStrings("NorthwindConnectionString").ConnectionString.ToString())
        'Do Something
    End Sub

End Class

有沒有看出來差異點?
錯誤確能運作是「Imports System.Configuration」,而正確版是「Imports System.Web.Configuration」,而程式碼也只有一點點差異,錯誤確能運作的程式碼是使用「ConfigurationManager」來取得連線字串,而正確版本是使用「WebConfigurationManager」來取得連線字串。

那這兩個命名空間有什麼差,反正都能動。我想,許多書的作者都是從寫WinForm來改寫WebForm,而他們在改寫的過程裡,因為沒有發生任何錯誤訊息,而且程式都能正常運作,所以也就沒發現這一點點的差異。第一個System.Configuration命名空間是WinForm來存取app.config使用,第二個System.Web.Configuration命名空間是WebForm來存取web.config使用。而讀者也就進行了無差別式的吸收與應用。

說真的,要不是我看到有人使用了正確的方式,我也還在使用錯誤但能運作的方式在寫這方面的ASP.NET程式,早期的文章都是使用錯誤的方式。只是很難說,那天.NET Framework改版後,如果System.Configuration命名空間的方法與System.Web.Configuration命名空間的方法不能共用時,那不就是又是一陣「大改」,把所有使用錯誤命名空間的網頁一頁一頁找出來改,結果還是要走回頭路。

所以最好的方法就是,一開始就使用正確的命名空間,使用正確的方法,最保險,最沒有問題。各位也可以Check ASP.NET Book內容,如果有以上的問題,寫封信提醒一下作者這個問題。

Shopping Lists

最近網路購物次數大增,不過會透過網路購物最大的吸引力是「比價」容易,沒什麼皮鞋成本,但壞處是還是會有不放心的感覺,因為怎麼看都是圖,沒有實體,touch更是不可能,人買東西就是這樣,沒有摸摸總是會有不安全感。

我說過很多次,老天很幫我的忙,前陣子想 買台淨水器(整水器),結果就是在網路上發現一個「大特價」的淨水器,而且過程還很好玩。
 

淨水器

話說,從大學時期就開始過著買水的生活,水龍頭的水根本就不敢喝,所以就會去買那種10公升或20公升的大水桶去買水。算一算這種買水的生活已經過了十多年。婆婆一直想買台淨水器,因為這一次我們決定在新竹做月子,想到用水量會大增,而且也不可能一次買個十箱、二十箱,也沒時間去天天買水,搬水又是一個問題,更重要的是「這是我們自己的家」,租的房子去裝淨水器,錢太多,所以我也答應要買。

其間也做了很多功課,所以寫下了那句流傳千古的名言:「有錢就買好一點。」

就在5/1x的某一天,收到GoHappy的EDM,抬頭、標頭就是那麼深得我心,「xxx淨水器大特價」,終於知道為什麼這些公司永不放棄,每天不斷的發EDM的效果在那裡,像我就中標了@.@!

二話不說,點進去看再說,看到一台「Panasonic 鹼性離子整水器 TK-7405] 正在特價,查了一下網路價,因為價格太殺,而且一開始用斗大的字寫「專案價 限量三台」,馬上Call電話給婆婆,說我要下手買淨水器了,婆婆一同意,馬上拿出信用卡給它用力刷下去,刷完之後馬上看到那「立刻買」的按鈕變成「補貨中」,前後不起過二十分鐘。自己用力給他偷笑,還好決定的快有「」到手,高興了一整晚。

可能是第一天推出「反應熱烈」, 這些廠商又不是笨蛋,有「$$$$$$$$$」怎麼可能不賺呢!所以第二天我再回同一網頁看時,就出現:



而且限量等字也已經不見了。

淨水器購買心得:

  • 我這個購買心得,應該可以例入網路行銷教材。^_^
  • 從購買到安裝,大約只花了三天的時間,我很滿意。
  • 價差:這台淨水器一般買場不含安裝價為23800(我的皮鞋成本),GoHappy為18800含安裝。

護貝機


想要自己製作一些教材給寶貝們,但單純印出來實在很不耐操,像大寶貝目前正值「破壞王」 時期,破壞力百分百,所以一直想要買台護貝機幫這些教材加上防護罩。一樣,網路比價就是快,雖然也是要花費一些時間成本,但當你看到「價差」很大時,就會很有吸引力,很怕不快點下去買,等一下如果沒買了,或買貴了,那真是會「捶心肝」。


我將需求提報給婆婆,婆婆也非常同意,所以就進行比價的工作,然後和上面一樣的,我們非常出運的找到「大同A3專業護貝機 TBL-23」的特價品,一般價為1200元,特價品649元,買了買了。

跳跳馬

這個玩具,我第一次看到是在保母家,看著小朋友們玩的很開心,就順口問問那裡買的,買多少錢,保母說,買多錢忘了,那裡買忘了,因為已經買很久了,七、八年了。看著小朋友玩的很高興的樣子,我自己對這個玩具很有興趣,如果可以使用到七、八年,,比平常那種算「天」的玩具,覺得投資報酬率應該會不錯,但我很少看到有人買這種玩具就是了。

剛好我在新竹的丁丁藥局看到有在買,我想買給寶貝們,我將需求提報給婆婆,婆婆又非常同意,所以又進行比價的工作,看到也是有很大的價差,義大利進口約17xx元,平價又不知道那裡生產的399~499元(大小隻,應該是China,我還沒收到不知道)。

因為價差很大,而且又摸不到東西,我們保母家那隻跳跳馬很厚實,質感很好,希望這個平價跳跳馬能有這樣的品質,消費者就是這樣,希望用最便宜的價錢買到最好的品質

以上廢言連篇,其實是為了了解Usability(可用性、優使性),這是個很好玩的東西,個人覺得它比ASP.NET好玩多了,但都是純理論,我很好奇,到底有多少中、小網站在設計時會考慮什麼目標、規劃…能動就好。分析一下自己與婆婆的購物行為…嗯…人家有其專業的地方。