2009年3月30日 星期一

.NET 核心程式設計 第一章:使用集合管理物件

◎ HybridDictionary會自行根據資料量,選擇成為要變成Hashtable(>10)或ListDictionary(<10),這些都是採用key/value的方式儲存,而且皆為object。而這些的每一個子項叫做dictionaryentry

◎要實作IEnumerator的class,才可以使用foreach或xxx.ForEach
List a = new List();
a.ForEach( delegate(DateTime day ){/*要做的事情*/} )
◎ 堆疊(後進先出) Stack:Push()是放進去,Pub()是拿出來
佇列(先進先出) Queue:Enqueue()是放進去,Dequeue()是拿出來


SortedDictionarySortedList
一個一個填入時會比較快占用較少空間,維護兩組(Key/Value)陣列,一次填入很多時會比較快

(一次填入的方式為使用建構子)

2009年3月26日 星期四

ASP.NET 3.5 網站開發進階-9

第九章:效能調校與網站監控
1.網頁快取(OutputCache)
OutputCache的VaraByParam屬性當沒有要設定快取條件時,設定為"none",如果要透過QueryString的參數當條件,就設定為參數名稱,如果要依控制項的value當條件,就設定控制項的ID。
多個網頁都要用OutputCache時,可在WebConfig中設定CacheProfiles,並將name指定到page的CacheProfile屬性。
除了指示詞的設定外,OutputCache也可以用HttpCachePolicy類別(Response.Cache)寫Hard Code實作出來,這樣能更精確控制快取。
透過UserControl的加入,可以控制網頁區塊快取。
2.資料快取(Cache)
很類似Application物件,但Cache彈性更大可設定到期時間。

ASP.NET 3.5 網站開發進階-8

第八章:自訂控制項進階設計
CustomControl沒有設計畫面,功能彈性比UserControl好,並且可以繼承既有的控制項,當開發好時,將專案編譯為dll組件,就可以佈署至網站中。
新增CustomControl時,範本選擇ASP.NET Server Control。
狀態維護:
要複寫SaveControlState, LoadControlStage事件,並在OnInit事件時透過Page.RegisterRequiresControlState在頁面中註冊事件程序。實作請參考練習8.3
Custom Composite Control:
自訂控項裡面也可以放既有的控項,首先類別要先繼承CompositeControl,並將子控制項的初始化寫在override CreateChildControls方法中,並給定初始值,將控制項加到this中。
支援樣板的Custom Control:
1.繼承CompositeControl
2.設計一個實作ITemplate介面的屬性並新增該屬性的TemplateContainer, PersistenceMode兩個Attribute
3.override CreateChildControls方法用ItemTemplate介面的InstantiateIn方法建立樣板。
4.自訂的Template樣板smartTag設計模式不支援。

2009年3月25日 星期三

ASP.NET 3.5 網站開發進階-7

第七章:使用者控制項設計
UserControl的缺點是無法跨網站共用,如果想共用就要設計成CustomControl。
UserControl可以透過自行定義屬性與方法來增強他的彈性。
UserControl可以在設計頁面時直接嵌入在網頁中,也可以在執行時用動態載入。
動態載入的指令-Page.LoadControl(string Path)
通常我們會將UserControl放在一個PlaceHolder的容器中-PlaceHolder1.Controls.add(obj)
PlaceHolder很像Panel差別在於一個render出來沒有div tag一個有。
當動態載入UserControl時,保存狀態就很重要,最簡單的方式就是在PageLoad的時候都載入,
也可以用override LoadViewState方法來手動實作狀態的存取。參考練習7.4
補充觀念:當Browser送出一個Page在submit時postback的Request時,會將頁面上的viewstate一同submit,WebServer收到Request就會在LoadViewState事件將控項儲存在ViewState的值載入。

ASP.NET 3.5 網站開發進階-6

第六章:網站會員機制規劃
這一章你要會...
1.用MemberShip API來管理使用者及角色資料,例如,建立使用者時,可以依CreateUser回傳的MembershipCreateStatus來判斷建立狀態是否成功。
2.執行aspnet_reqsql.exe將MemberShip的資料表建立在自訂的資料庫中。
3.MemberShip允許將不同資料表建立在不同資料庫中。
4.在WebConfig設定profile的新屬性,MemberShip會將你設定的屬性儲存在一個欄位中,提供profile的強型別。
最後...
請參考課本練習6.2:Ajax Membership API的整合應用,了解如何用javascript驗證登入。

ASP.NET 3.5 網站開發進階-5

第五章:AJAX進階設計
Microsoft Ajax Library是由JavaScript寫成,封裝在System.Web.Extension.dll中,預設.NET Framework安裝時會將它裝到GAC之中。它提供了JavaScript擴充功能,包含增強型別系統以及物件導向能力。透過此程式庫,document.getElementById("TextBox1").value可改寫為$get("TextBox1").value,這些稱為捷徑語法。
ASP.NET AJAX在瀏覽器執行會觸發生命週期事件,觸發順序請參考課本5-9。Application物件的load、unload事件處理常式不需要透過程式註冊,可以直接撰寫function pageLoad(){}。
熟悉PageRequestManager類別可以控管頁面的部分更新,例如與ScriptManager控項的RegisterDataItem方法,就可以在非同步的postback時,傳送額外的資料,以更新UpdatePanel之外的控項。也可以利用beginRequest、endRequest事件的搭配控制按鈕的狀態,避免使用者重複按按鈕。
如果要除錯AJAX,需要設定三個地方:WebConfig的debug、瀏覽器設定的ScriptDebugging、Display notification.
Sys.Debug.trace可將錯誤訊息輸出至output視窗,Sys.Debug.traceDump方法可以將物件資訊輸出在頁面中名為TraceConsole的textarea控項中。
為了方便管理js檔案,可以用專案部署內嵌在組件中,實作請參考課本練習5.4
在AJAX網頁中,可以再將ScriptManager的EnableGlobalization屬性設為True,啟用指令碼全球化,這時,將Page的Culture設為auto,就可以取得控制台或是瀏覽器設定的文化特性,顯示特定文化的時間、貨幣等相關資料。EnableLocalization屬性可啟用指令碼當地語系化,配合page的宣告UICulture=auto,可讀取各語系專用的resource資源。
當你的網站程式用到多個js檔,可以封裝成一個檔案,將程式碼組合在一起,降低瀏覽器與伺服器溝通的次數,用法是使用ScriptManager的CompositeScript,將ScriptReference寫在一起。

2009年3月18日 星期三

第十天上課(台北恆逸)

 

第三章:網頁多國語言程式設計

建立Local資源檔
選擇aspx的設計畫面,點選工具裡面的產生當地方資源檔,VS開發工具就會產生相關的.resx檔,若多國語系例如default.aspx就會產生default.aspx.resx,若需要加入台灣語系,就必須覆製default.aspx.resx一份將檔名改成default.aspx.zh-TW.resx,而且Local資源檔一定要放在App_LocalResources目錄內。

建立Global資源檔
在App_GlobalResources目錄內加入一個資源檔,這個自訂名稱的資源檔和Local資源檔一樣,例如建立一個MessageText.resx,要支援台灣語系就是覆製一份成MessageText.zh-TW.resx,加入後建置一下,就可以在其他的地方透過強式名稱Resources.MessageText.YourProperty。

第四章:狀態管理機制

狀態分為伺服器端和用戶端,至於使用方法和時機,全憑需求而定沒有一定的方式。
在伺服器端有
Application物件
Session物件
Database資料庫
在用戶端有
Cookie物件
ViewState物件
QueryString

2009年3月13日 星期五

第九天上課(台北恆逸)

 

第一章:運用ADO.NET建置網頁

ADO.NET概觀

ADO.NET下各Data Provider 共同的物件

Connection、Command、DataReader、DataAdapter

各DataSet 共同的物件

DataTable、DataRelation

Web.config大部份的Section都有對應的類別,例如你想要查詢或動態修改Web.config的連線字串,你可以這麼做:

ConnectionStringsSection cnSection=(ConnectionStringsSection)WebConfigurationManager.GetWebApplicationSection(“connectionStrings”);

string cnStr=cnSection.ConnectionStrings[“YourCn”].ConnectionString;

補充一下連線字串大部的人都不會注意的地方,如果你透過IDE幫你建立連線字串時,有沒有注意過Persist Security Info這個屬性,雖然不管你設True或False,對連線資料庫都沒有影響,那到底有什麼作用?這個屬性其實就是問你是否保存安全資訊,簡單的說就是當ADO在連線資料庫成功後是否保留密碼資訊,True表示保留False則不保留,這裡要特別注意的一點是ADO預設是True而ADO.NET預設是False。

那裡會痛?
雖然別人可能拿不到Web.Config檔,或許他有機會丟一個aspx檔到你的主機(例如你提供檔案上傳又沒考慮到安全性時),他寫一個SqlConnection物件,又好死不死知道你的連線字串名稱,嘿嘿這樣一來不就可能看到你的密碼了。

 

使用SqlDataSource存取關聯式資料庫

可以指定資料傳回模式,有二種分別是DataSet及DataReader,當然就是DataSet的功能較多,如GridView及ListView的排序、分頁等功能,而DataReader則是較著重於效能及減少佔用伺服器的記憶體。

自訂資料來源控制項參數

透過DataSource控制項提供許多參數來源,但是如果參數來源不在預設選項中,如何產生新的自訂參數呢

1.建立一個類別繼承Parameter,例如MyParamer,然後指定一個屬性MyString,注意必須引用System.Web.UI及System.Web.UI.WebControls。
public string MyString
{
get{
object obj=base.ViewState[“MyString”];
if(object ==null)
return string.Empty;
return object.ToString();
}
set
{
base.ViewState[“MyString”]=value;
base.OnParameterChanged();
}
}
2.override object Evaluate(HttpContext context,Control control)這個方法,回傳值就是自訂的參數型別。
Protected override object Evaluate(HttpContext context,Control control)
{
string returnStr=”%” + MyString + “%”;
}
3.在使用DataSource的頁面註冊Assembly和Namespace(當然如果你是放在App_Code資料夾的話,只需要指定Namespace),如<%@ Register Assembly=”yourAssembly” TagPrefix=”customMy” namespace=”yourNamespace”%>

如此一來你就可以透過精靈或是自己寫出像是下列的程式
<asp:SqlDataSource Id=”sqlDS” runat=”Server”>
<SelectParameters>
<customMy:MyParamer


第二章:資料存取進階設計

設計資料元件

同一專案建立不同的程式語言必須

1.新增對應的資料夾,也就是在App_Code下建利不同資料夾放不同語言,例如App_Code\VB及APP_CODE\CS。

2.設定web.config
<compilation>
<codeSubDirectories>
<add directoryName=”VB”/>
<add directoryName=”CS”/>
</codeSubDirectories>
</compilation>

建立可供objectDataSource選擇的物件如下:
[System.ComponentModel.DataObject()]
public class CustomerInfo
{
}

DataObjectMethod Attribute
有Fill、Select、Update、Insert、Delete,分別用來對應在設定ObjectDataSource時精靈中的對應頁籤。

LINQ
這裡介紹的是LINQ to SQL Classes,在加入新的項目中,選擇LINQ to Sql Classes,建立一個.dbml的檔案,就可以使用相關的LINQ查詢語法。

老師上課的補充

Web.config Pages下的Namespace是提供給SingleFile的Namespace、Separate是不支援的,而Namespace無論是在page的 @Import 或是CodeFile中的Using,其實就如同像在DOS我們為了方便預設一些路徑,而不用打每一個指令都打長長的路徑,至於效能上是沒有什麼影響,只是如果Using的越多,那麼類別名稱一樣的機率越大,會不會不小心就用錯了類別呢?

ExecuteReader是ReadOnly、ForeOnly,也就是你只能讀取而且只能一筆一筆往下讀,不像ASP的RecordSet可以Update、Move.First等功能,而在記憶體及效率上都有明顯的差別的改善,

DataBase的Loading最大在Select、Where、Sort,其他新增修改刪除都是其次(不絕對啦,如果你修改刪除前要跑一大堆Select就….);對於減輕DataBase的Loading,你可以用DataView來進行RowFilter、Sort,如此一來Loading就降在Client的身上(這裡是指對Databaes而言,像IIS就是他的Client)。

那裡會痛?
Database的效能來自於一台硬體的極限,當需求大於極限,你需知道減低或分擔Loading的方法。
Web.config加解密

在machine.config裡面提供了二種對web.config加解密的方式如下

<configProtectedData defaultProvider="RsaProtectedConfigurationProvider">
    <providers>
        <add name="RsaProtectedConfigurationProvider" type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" description="Uses RsaCryptoServiceProvider to encrypt and decrypt" keyContainerName="NetFrameworkConfigurationKey" cspProviderName="" useMachineContainer="true" useOAEP="false"/>
        <add name="DataProtectionConfigurationProvider" type="System.Configuration.DpapiProtectedConfigurationProvider,System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" description="Uses CryptProtectData and CryptUnProtectData Windows APIs to encrypt and decrypt" useMachineProtection="true" keyEntropy=""/>
    </providers>
</configProtectedData>

2009年3月6日 星期五

第四個禮拜

第七章 佈景主題與樣式表

1. Theme 和 StylesheetTheme的分別,在於如果屬性有重複,前者會以布景主題為主,後這則以網頁設定為主
2. 若要動態設定Page.Theme的屬性,要在Page_PreInit裡面設定(這個事件會在PageLoad前觸發)


第八章 網頁資料存取開發

1. 伺服器總管那邊,如果要設本機,除了localhost外,還可以用(local)和.的方式設定
2. ListView是3.5以後出來新的控制項,可搭配DataPager使用,而DataPager也只支援ListView


第九章 AJAX介紹與運用

UpdatePanel屬性:
UpdateMode - Always:網頁只要postback就會更新,包含非同步postback; Conditional:根據不同的條件(如Trigger)來決定是否更新
ChilderAsTrigger:是否設子控制項為觸發器,也就是說只要UpdatePanel內的控制項postback就觸發部分更新
Trigger:觸發器,分成AsyncPostBackTrigger(非同步)和PostBackTrigger(同步),非同步可設定控制項ID和事件名稱,當某控制項(不再up內)的某事件被設定成Trigger時,他只會觸發非同步的更新;而同步的trigger只需設定控制項ID,當某控制項(不論是否在UP內)被設定為同步的trigger時,所有的postback都會是完整的postback

注意:
1. 而FileUpLoad和TreeView放到UpdatePanel內會失效!!!
2. Response.Write會造成UpdatePanel錯誤

Timer控制項(AJAX):
Interval設定每多少毫秒要做的方法
Tick設定要做的事情

(補充)這裡有介紹client時鐘的方法
http://www.shsh.ylc.edu.tw/~t1056/program/javascript/jscript/time/jsclock.htm

UpdateProgress:當部分更新尚未完成時,此控制項內包含的所有內容將會呈現


第十章 實用控制項運用

MultiView
Button的Command可以搭配View的切換
1. CommandName設NextView、PrevView => 下一個View、上一個View
2. CommandName設SwitchViewByID,CommandArgument設要看的IDView
3. CommandName設SwitchViewByIndex,CommandArgument設索引值

FileUpload:
1. Server.MapPath(string pathName)會將路徑轉換為實體路徑
2. FileUpload.HasFile可檢查是否有該檔案
3. 預設限制上傳是4MB,若要更改要去Web.config
system.web
_ httpRuntime maxRequestLength="4096"/
/system.web>

ImageMap、Wizard練習一下
(Mobile Web Form要看一下,會考)


第十一章 網站錯誤客製化

1. debug = true 可以在Page設也可以在Web.config設
2. 如果有Page_Error(object sender, EventArgs e)事件,在網頁發生錯誤時就會執行
3. 網站錯誤處理要新增一個Global.asax,寫在Application_Error(object sender, EventArgs e)內
4. 可用Server.GetLastError()取得錯誤訊息
5. 網頁發生錯誤後,會先執行網頁錯誤處理,再執行應用程式錯誤處理。因此,若要在網頁錯誤處理完後,就不執行網站錯誤處理,要在網頁錯誤處理加上Server.ClearError()
--以上都是廢話--
6. 可以直接在web.config中設定,system.web下的customErrors。mode有On, Off, RemoteOnly三種,On是本機和遠端都看到自訂錯誤頁面;Off是都看到預設錯誤頁面;而RemoteOnly是只有遠端看到自訂,而本機看到預設。defaultRedirect屬性則是自訂錯誤頁面路徑。另外可在Page設定錯誤重導路徑,在aspx的Page設定ErrorPage屬性。另外,可藉由error的tag來自訂http錯誤


第十二章 網站發行與部署

● 除了設定虛擬目錄這個方法以外,也可以用一個等同於這樣的方法:在你要的目錄上按右鍵 -> 內容 ->Web Sharing這邊做設定

● 如果停止該網站的應用程式集區,會得到http503的錯誤
● 組態檔會找離自己最近的那一個
● Compilation 的 batch 預設為true,意思為批次編譯網頁,究是說如果第一次進A網頁才會編譯A網頁,以此類推;而若設成false,則會在網站第一次執行就把全部網頁編好
● 請練習建立應用程式安裝檔


第十三章 網站安全性規畫

ASP.net會使用下列的機制來達到安全性:
● 驗證(Authentication):使用Credential證明你是誰
● 授權(Authorization):用戶端是否有權限存取要求的資源
● 模擬(Impersonation):使用已通過驗證並已授權的用戶端身分來執行程式 => identity impersonate="true"
● 委派(Delegation):更進階的模擬機制,允許以模擬的用戶端來存取遠端資源

驗證(Authentication):
None:不驗證
Windows
● 由作業系統帳密驗證
● 若要啟用模擬,可在web.config加入 identity impersonate="true"
Forms:由程式設計師自行處理密碼驗證邏輯(紀錄在cookie中)
● 在form的屬性中,可加入loginUrl(登入頁面,預設Login.aspx)、name(Cookie名稱)、timeout(預期時間,以分鐘為單位)、path(Cookie,預設/)
● URL授權:在authorization中設定allow和deny,可針對users和roles
● 學會使用Login控制項
Passport:由Passport Service進行帳密驗證(沒人用)






2009年3月4日 星期三

2009三月底前優惠報名

其實之前就看到這個消息了,只是都是英文的看不懂,今天看到有人介紹,還好時間還來的急,立刻馬上申請,老天保佑我考上,謝謝。

轉載自
限時 MCP 考試優惠~比 Second-shot 更優惠的考試代碼~
試合再開~~~一樣使用 TWF3A803 即可申請,主辦單位說用此代碼申請沒有人數限制,所以請大家告訴大家~最重要的是,申請後記得要考啊~~~
於 2009/3/31 前,在 http://www.learnandcertify.com/Request.aspx 提交 TWF3A803 這組代碼,就可以獲得一份考試報名代碼(有效期限到 2009/5/31 截止),用這組代碼報名考試 (只限 MCTS, MCPD 和 MCITP 考試,不含 MCSE, MCSD, MCDBA 等的考試),就可以享有 10% 的折扣,同時也享有重考免費的權利哦。
.......詳情請到該作者Blog查看

2009年2月28日 星期六

ASP.NET 3.5 網站開發基礎-6

第六章:設計主版頁面與網站導覽系統

MasterPage
1.在Page中可用Master.FindControl找尋其主版頁面中的控制項。
2.在Page中加入前置詞MasterType VirtualPath="~/MasterPage.master",可用強型別方式存取Master中Public的屬性值。
網站導覽
使用SiteMap作為Menu&TreeView的資料來源。
WebConfig中可另行設定SiteMap的Provider,否則皆為預設的Web.sitemap檔。
我也被感染了,發燒中。

ASP.NET 3.5 網站開發基礎-5

第五章:追蹤與除錯

除錯
錯誤類型、設定中斷點、除錯相關視窗,之前的課程已講過。

追蹤
Debug物件可將訊息輸出至Output Window。
System.Diagnostics.Debug.WriteLine(TextBox1.Text);
若要指定Listener為EvenLog等其餘地方,要在WebConfig設定。
若將專案的DebugConfiguration設定為release,建置出來的專案將無視Debug物件的存在。
ASP.NET2.0網站的DebugConfiguration沒有release,取而代之在WebConfig中設定DEBUG。
Trace分為三種:
1.網頁Trace
在Page前置詞設定Trace="True",頁面執行後可以在瀏覽器上看到追蹤報表。
2.網站Trace
在WebConfig設定Trace="Enabled",網頁執行後可以在根目錄下的Trace.axd看到追蹤報表。
請注意Trace的各項屬性設定。
3.自訂Trace
訂閱TraceFinished事件,可取得TraceRecords集合的成員,以及成員的各種屬性值。

追蹤報表中顯示的環境變數,也可以從程式中直接取得
如:Request.ServerVariables["REMOTE_ADDR"];

ASP.NET 3.5 網站開發基礎-4

第四章:驗證使用者輸入

ASP.NET基於安全性考量,頁面本身就有防止用戶端惡意輸入Javascript執行的檢查機制,
若不要使用,可在Page前置詞中設定ValidateRequest="false"

基本的四種驗證
RequiredFieldValidator、RangeValidator、RegularExpressionValidator、CompareValidator只能選擇在client或server二選一進行驗證。選擇方式為設定EnableClientScript屬性,預設為True。
RequiredFieldValidator可設定InitialValue去驗證控制項不可以為初始值。例如DropDownList預設value為"未選擇",可用此方法驗證使用者選取了沒。

RegularExpressionValidator預設的運算式不夠使用,可以參考通用運算式類別庫:http://regexplib.com/

CustomValidator
可以同時在Client & Server端進行驗證,server端驗證事件為ServerValidate。

若使用ValidationSummary的ShowMessageBox,則驗證控制項需選擇Client端驗證,訊息視窗方有效。

ASP.NET 3.5 網站開發基礎-3

第三章:使用網頁控制項

html控制項、html server控制項、伺服器控制項
後兩者runat=server的控制項都會紀錄viewstate

動態註冊用戶端指令碼
ClientScript.RegisterClientScriptBlock:指令碼會被註冊在form標籤內的前端。
ClientScript.RegisterStartupScript:指令碼會被註冊在form標籤內的尾端。
ClientScript.RegisterClientScriptInclude:載入js檔。
因javascript為直譯式語言,在執行期才會編譯執行,因此有時後變數放在上面或下面會有差別。

其餘內容很簡單,自己翻書

ASP.NET 3.5 網站開發基礎-2

第二章:設計ASP.NET網頁

網頁模型(PageModel)
ASP.NET在2.0版本以後,提供了兩種預設的網頁設計模型:InLine & CodeBehind
我們公司開發模式習慣用CodeBehind將aspx與程式碼分離,並將InLine視為較舊的方式,
但事實上InLine提供了較直覺、且單檔易於維護的優點,很多程式設計師仍偏向使用它。
但對我而言,早已習慣程式碼分離模型,並將它視為理所當然。

網頁間的互相導向
1.超連結,不用多說,直接Request NavigateURL,走HPPT GET。
2.瀏覽器重新導向,Response.Redirect,當伺服器執行到此指令碼時,會Response回瀏覽器,由瀏覽器重新送出目的URL的Request,因此會做一次往返,而且網頁的URL會是目標網址。
3.伺服器重新導向,Server.Transfer,與瀏覽器重新導向相似,不同點在於不需做一次往返,由伺服器直接重導,網頁的URL會是原本的網址,而目的網頁限制於相同的Web應用程式中。
4.跨網頁POST,設定控制項的PostBackUrl屬性,與超連結不同的是,它會以HPPT POST的方式導向至目的網頁。

不同網站的網頁間傳遞值
QueryString,適用任何導向方式,直接依網址取得key、value值。
Form,當來源網頁使用跨網頁POST或是伺服器重新導向時,可利用來取得POST的內容

PreviousPage
網頁前置詞 "PreviousPageType VirtualPath='~/Default3.aspx'"
可由Page.PreviousPage取得來源網頁的public屬性。
Server.Transfer或PostBackUrl才會有PreviousPage。
if (Server.Transfer)
PreviousPage.IsCrossPagePostBack==True;
else if(PostBackUrl)
PreviousPage.IsCrossPagePostBack==False;
else
PreviousPage==null;

2009年2月27日 星期五

ASP.NET 3.5 網站開發基礎-1

第一章:ASP.NET3.5與Visual Studio 2008介紹與運用

本章只是在重複介紹.NET FRAMEWORK版本以及開發工具的基本常識。

需要注意的一些重點如下:

1.用戶端browser送出請求時,WebServer監聽80port,發現目標網頁為aspx檔案便呼叫w3wp.exe代理程式,載入aspnet_ISAP.dll引擎,執行網頁程式。

2.建立ASPNET網站有兩種方式:(1)專案類型方式,此種方式用於較舊版的開發方式,所有網頁程式事先於設計階段編譯成dll,並放置在於ServerExplorer中隱藏的bin資料夾。(2)網站類型方式,這是主流,每個網頁都會在runtime動態編譯為一個dll,並放置在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\的暫存目錄中執行。

3.網站類型又分為四種開啟方式:(1)FileSystem,不需要WebServer(IIS),它使用VS所建立的虛擬開發Server,需注意不要將路徑設定在桌面或是MyDocuments以避免之後會有權限的困擾。資料夾權限部份會等於登入者的權限。(2)LocalIIS(即HTTP),網站建立在IIS的虛擬目錄中,OS版本若為WindowsServer2000,IIS版本為5.0,WindowsServer2003、XP,IIS版本為6.0,WindowsServer2008、VISTA,IIS版本為7.0,至於資料夾權限需要特別注意,IIS5.0設定權限的帳號是ASPNET、IIS6.0以後則為NetworkService而非登入者帳號。(3)FTP,用於維護。(4)RemoteSite,也用於維護,而且需要安裝FrontPageServerExtensions方能使用,然而更大問題是會跟SharePoint Server相衝,因此更為少用。

2009年2月24日 星期二

第二個禮拜

第五章:流程控制、迴圈與例外狀況處理

流程控制
if判斷式,應該不用多做解釋
而swith使用上一要注意兩個地方:
1. 運算式的結果必須為整數列舉字串
2. 如果沒有使用break離開,會一直做下去
switch(aa)
{
case a : MessageBox.Show("Hello");
case b : MessageBox.Show("Hi");
case c : MessageBox.Show("你好");
}
如果結果是b,會印"Hi"、"你好"
因為沒有使用break,會從找到的結果以下一直做,做到看到break為止

迴圈:for、foreach、while、do
比較要注意的是break和continue的使用

for( int i = 0; i<100; i++)
{
j += i;
if (i == 50)
break;
if(i == 25)
continue;
j +=1;
}

上述程式碼會從1加到50而不是100,因為在50就break了
而每次加都會多加一,只有在25的時候不會,因為遇到continue關鍵字會從下一個迴圈繼續做
忽略continue以下全部的程式碼

例外狀況處理
catch的時候,可以多重catch
不過要子代先catch再catch父代,不然會造成compile time error
而finally則是一定會做的事情
就算在try catch遇到return關鍵字也會做

補充

int? a = null;
int b;
b = a?? 6;

Nullable a = null
int b;
b = a.HasValue ? a.Value : 6 ;

上面兩段是完全一樣的程式


第六章:陣列、泛形與集合

補充:
1.
Hashtable的item是DictionaryEntry
而Dictionary<>的item則是KeyValuePair<>
2.
陣列不能唯獨、速度快;集合則剛好相反


第七章:物件導向與法

下列的資料會自動初始化:
static變數、實體變數、陣列中的元素

partial method
1. 只能存在於partial class中
2. 不可有回傳值(void)
3. 隱含為private,不可改變,也不需註明
4. 不能建立委派(delegate)到部份方法
5.若沒有實作,則會忽略呼叫

建構子
overload時,若需呼叫自己或副類別建構子
使用this和base關鍵字

public A(int a) { this.age = a; }
public A() : this(15) {}
public A() : base(16) {}

上述程式碼就可以在建構子間作呼叫

補充

using QQ = System.Web.UI.MobileControls;
...(略)
QQ.List a = new QQ.list;


第八章:物件導向進階

class內屬性的唯讀,可參考下列程式碼
public EmpName { get; private set; }
不同於interface的private set
interface若宣告某個屬性只有get,實作的class則可決定要不要有set;
但interface內若宣告private set;實作的class則一定只能get

覆寫和隱藏
父類別使用virtual關鍵字的method,表示可以給子類別用override關鍵字作覆寫
若子類別沒有使用override關鍵字,則可用new來隱藏父類別方法,無論覆類別有沒有virtual

狀況一
父親:public virtual void AA() { MessageBox.Show("Hello"); }
兒子:public override void AA() { MessageBox.Show("Hi"); }

狀況二
父親:public void AA() { MessageBox.Show("Hello"); }
兒子:public new void AA() { MessageBox.Show("Hi"); } (new可忽略,但若四級警告會錯誤)

父親 a = new 兒子();
a.AA()
狀況一會顯示Hi,而狀況二會顯示Hello

2009年2月15日 星期日

第二天上課(台北恆逸)

第六章:陣列、集合與泛型

因為第四章要運用到陣列,所以先提一下第六章順便補充說明一下第三章提供的實值型別與參考型別的差異,放在最後的補充說明

陣列總覽

寫程式時經常用到的陣列,卻不知道原來陣列也有名字

int a[] - 一般陣列

int a[,] - 多維陣列

int a[][] - 不規陣列(又稱陣列中的陣列)

一般陣列就不多說了,多維陣列和不規則陣列的差異在初始及應用不同。

多維陣列初始就知道大小

int[,] a=new int[2,3];

而不規則陣列則是先宣告一維陣列的大小

int[][] a=new int[2][];

再決定子陣列大小

a[2]=new int[5];

第四章:方法和運算子

宣告方法的參數列

  • 輸入參數 PassByVal
  • 參考參數 PassByRef
  • 輸出參數 PassByOut
  • 參數陣列 PassByParam

第一種輸入參數就不多提了,來討論一下何時使用參考參數、何時使用輸出參數。

由於不像輸入參數會建立新的記憶體位置,參考參數是直接存取原參數記憶體位置,因此使用前必須事先宣告,不然你的VS就會跟你不高興,這點和輸出參數不同,輸出參數不用事先宣告,相對的你必須在輸出參數內宣告一個新的記憶體位置。

這裡我是提供自己的想法,如果有不對地方請多多指教

其實在.NET BCL中,很少看的到這二種運用,我一時想不到有參考參數的例子,倒是記得在很多的xxx.TryParse()中有out的運用,我的解釋是這樣的,如果你的方法已經有一個回傳值,但是又非得回傳更多的回轉值時,你就可以使用這二種參數,至於使用時機如DateTime.TryParse(string s,out DateTime result)就是一個典點的事先不會預設值,而是透過方法內建立一個新的記憶體位置後回傳,所以你可以這樣

DateTime result;
string s=“2009/02/14”;
DateTime.TryParse(s,out result);

另外何時用參考參數,例如方法很多,但都是使用同一個變數的時候,尤其各方法又各自有自己的回傳值時

void check(ref People user)
{
if(check2(user))
check3(user);
else
check4(user);
}

資料轉換

一般有型別自己提供的Parse、TryParse,另外還有一種針對之前有提到的CTS提供的轉換類別Convert,使用方法像是

Convert.ToInt32(“5”);
Convert.ToBoolean(“True”);

補充說明

實值型別與參考型別的差異

int a=5;

int b=a;

這時候a=5,b=5。因為int是實值型別,因此b複製了a的值:

b=10;

這時候a=5,b=10。a還是5,而b更新了自己的值為10。

int[] aa={0,1,2};

int[] bb=aa;

bb[2]=3;

aa[2]的值是??

這時候aa[2]的值是3,因為bb=aa是複制了記憶體位置,因為陣列是參考型別。

說明文件

這邊提醒一下剛使用VS的工程師,微軟提供了非常豐富的說明文件,大部份都有多國語言,但是除了上http://msdn.microsoft.com自己尋找之外,如何透過VS來快速查詢,答案是你只要在你有疑問的程式段落上,以滑鼠點一下位置或圈選起來,接著按F1之後,VS就會幫你連結到最有可能的解答連結(當然如果你是使用本機的MSDN Library會比較快,不過網路上是資訊肯定是最新的)

2009年2月14日 星期六

第一天上課(台北恆逸)

 

第一章:認識.NET Framework

介紹.NET Framework版本、教你有關BCL(Base Class Library)、CLR(Common Language Runtime)的基本知識、執行環境、版本功能的差異,其實BCL就是指.NET Framework已經幫我們準備好的程式,例如Windows Form`訊息對話框,只要直接使用MessageBox類別、連結資料庫存取使用System.Data下面的類別。

第二章:Visual Studio 2008開發工具

這部分是台灣書籍講的特別清楚的環節,比較特別的是講到工具列的運用時,以前除了知道加入自訂或其他元件的功能,原來還能拉一段文字拖拽在上面,當成暫存的剪貼簿重覆使用。

第三章:變數與資料型別

宣告變數語法

我們都知道每個語言有保留的關鍵字作為特殊用除,那我們可以用C#關鍵字來宣告變數名稱嗎?答案是可以,使用方法是前面必須要加上「@」,例如至於要用在什麼地方?還沒能想到也,不過「@」和「_」有什麼差別呢!他們的差別如下:

string @string;
string _string;

這時候你的自動完成功能裡面會有個變數是string和一個_string,另外我們知道變數不能以數值開頭作為宣告,還有一個差別就在這裡,如下:

string @1abc;
string _1abc;

唯讀變數與常數

唯讀跟常數,對剛入門的設計師可能較不會注意到的地方

  • 唯讀變數的值可以在執行時期再決定《可以經由方法於執行期間指定,如int a=GetNumber()》
  • 常數的值必須在編譯時期就要決定《必須宣告就要指定值,如int a=5》

C#基本型別觀念

實值型別跟參考型別也是經常被混淆的地方,

C#內建型別與共通型別(Common Type System,CTS)

舉個例子:

C#的int 就是CTS的System.Int32,同時也是VB的Integer,所以各種語言的型別都有各自對應CTS的型別,他們是通用的。

列舉型別資料

Enum abc
{
a=0,
b=1,
c=2,
}

string[] names=Enum.GetNames(typeof(abc));
Array values=Enum.GetValues(typeof(abc));

第一個沒問題,我們可以取得a,b,c,那麼第二個取得的是?,這裡舉二個例子

foreach(var item in values) {} 得到的是a,b,c

foreach(int item in values) {} 得到的是0,1,2

要注的意地方是,這裡的Values值不是指a,b,c的值,而是Enum abc的值,所以取得未轉型時得到的是a,b,c,而以int轉型時得到的才是0,1,2。

老師補充的存取範圍卻沒講的地方

這是一般常見的宣告方式public、private、protected、internal ,其實還有一種經常被疏忽掉的protected internal。

MSDN的說明如下

protected internal 存取範圍表示 protected OR (或) internal,而非 protected AND (和) internal。換句話說,protected internal 成員可從在相同組件中的任何類別進行存取,其中也包括衍生類別。若要將存取範圍限制為僅在相同組件中的衍生類別,請將類別本身宣告為 internal,並且將其成員宣告為 protected。

2009年2月13日 星期五

第一天上課

果然和我預期的差不多,在上課有看到上這門課前面是上一些基礎課程,看了一下上課的教材,果然是入門級的課程,有點悶呀。