C# 2015 學習紀錄:「Unobtrusive Validation」

By // 沒有留言:
ASP.NET 4.5以後的版本提供了「Unobtrusive Validation」功能,可以在用戶端(Client-Side)利用jQuery進行認證(Validation)功能(兩種)。

「Unobtrusive Validation」預設是開啟的,表示ASP.NET會使用jQuery進行驗證。
(jQuery是JavaScript其中一個的資源庫,可以取代JavaScript並提供跨瀏覽器、更省資源的驗證功能。)如果關閉,則ASP.NET會使用4.5版本以前HTML的腳本元素、利用JavaScript進行驗證。

如果開啟一個空專案(網站),使用ASP.NET的Validation Control時,會因為沒有jQuery資源庫與相關設定而出現相關錯誤,解決方式有兩種:利用NuGet安裝jQuery所需要的套件,或者是關閉Unobtrusive Validation。

關閉的話,可以選擇在單一頁面的(aspx)Load event handler中加入:
UnobtrusiveValidationMode = UnobtrusiveValidationMode.None;
或是直接在專案(Project或Solution)的Web.config中的configuration加入設定:
<appSettings>
    <add key="ValidationSettings:UnobtrusiveValidationMode" value="None"/>
</appSettings>


Excel 資料庫管理與模擬分析 上課心得Part I

By // 沒有留言:

移除重複資料

可以用「顏色」方式標註一樣的資料,然後按滑鼠右鍵以「醒目顏色做排序」,此時可以重複資料排序在資料前方(後方)。

什麼是資料庫?

  1. 欄位標題只能有一列
  2. 欄位名稱不能重複
  3. 如果需要一個欄位、多個敘述,可以利用「手動換列」方式達成
  4. 1筆資料需位於同1列
  5. 不能有空白列
  6. 資料庫邊界上下左右最好有一行、一欄的空白行列,以利切割區分
  7. 每個工作表最好只建單一資料庫
  8. 資料庫延展方向最好「垂直向下」
  9. 務必以「表格」型式呈現

將資料行列轉換成表格型態,會自動新增合計列、自動篩選與排序功能

加總函數

SUMPRODUCT(陣列1,[陣列2],...):計算陣列對應元素乘積的總和

醫美函數 TEXT(及格人數/C5, “0.00%")

三維參照

三維參照函數的工作表一定要連續,不可以跳的選取。支援三維參照的函數有:SUM、AVERAGE、COUNT、COUNTA、

看到資料庫形式的資料的執行步驟:

  1. 插入「表格」
  2. 變更「表格名稱」,例如「XXX表格」
  3. 新增名稱=XXX=XXX表格

身分證字號的資料驗證

  1. 要有10位元=LEN (F7)=10
  2. 第一碼要是英文字=CODE (UPPER(F7)) >= 65 * (CODE(UPPER(F7)) <= 90) 可以利用char() 與 code()
  3. 後九碼要是數字=ISNUMMBER ( - RIGHT(F7,9))
  4. 將上述三個公式相乘、最後得到TRUE或FALSE做資料驗證。

=NOT(ISBLANK(E3))*(F4>=E4)

建立「名稱」

補充筆記

  1. 利用vlookup查表,再前面多加 IF () 以及 ISBLACK() 來解決 #N/A的問題,IFERROR()
  2. 欄位名稱性質不同=變表格、欄位名稱性質相同=不變表格
  3. 能不呼叫函數就不呼叫函數,這樣可以讓效能比較好。

C# 2015 學習紀錄:「Refactoring重構」與「參數傳遞值或參考」

By // 沒有留言:

Refactoring重構函數

在C#裡,VS提供一個很簡報的方式,可以幫助我們把現有的程式碼片段,輕易地轉換成一個區域函數(Method),讓Programmer可以很輕鬆的管理開發的程式碼。

使用方式:

  1. 將欲轉換的程式碼圈選。
  2. 按下Ctrl + . (period)。
  3. 選擇Extract Method。
  4. 命名新的函數與呼叫函數名稱。

用refactoring方式產生的區域函數,在使用上是不使用「this」來呼叫函數的,且產生的函數識別字中也多了「static」的字樣,與一般自行新增的不同(日後詳細補充static的細節)。

用「值」或「參考」來傳遞參引數

平常呼叫函數時,我們通常都是值的方式傳遞給函數去運算,這樣可以有效確保原本變數的值不被改變、維持獨立性,但有時候我們可能也需要讓函數去處理同一個值、而不是複製的分身,此時我們便需要利用「Reference」的方式,讓函數可以處理同一個變數的值,例如:

Private vodi CalculateFutureValue ( decimal monthlyinvestment, decimal monlyInterestRate, int months, ref decimal futureValue)

{

for (int i = 0; i < months; i++)

[

futureValue = (futureValue + monthlyInestment) * (1 + monthlyInterestRate);

}

}

上述例子因為第四個參數是用「ref」的方式,因此該函數處理的是與主程式同一個函數的值,因此這個函數就不需要有回傳,futureValue已經擁有算數處理過的結果了。

參考的參數傳遞方式有兩種,分別是「ref」跟「out」的方式,格式如下:

[ { ref | out } ] type variableName

「ref」跟「out」主要的差別是使用「out」時,該變數可以不事先初始化,但在呼叫的函數程式執行結束前,必須要將值賦予給這個變數。

關於參數傳遞使用值或參考方式,有幾點注意事項:

  1. 通常使用「值」來進行傳遞是比較好的寫程式習慣,這樣變數不會被函數干擾或更改。
  2. 使用「ref」會比「out」的習慣來得好,因為總是先初始化一個變數的數值是比較良好的習慣。
  3. 使用「out」的例外時機是,當我們想使用「TryParse」這類的函數時,因為它的函數在定義第二個參數時,便已指名需要用「out」的模式來傳遞參數了。
  4. 用「ref」跟「out」的方式回傳參數時,通常用一個「Object」會比單獨回傳個別的值來得好。
  5. 當我們回傳參考時,被呼叫的函數就不用再寫return了。

「實值 Value Type」與「參考 Reference Type」型別

根據MSDN文件說明:「C#有兩種資料型別:實值與參考,通常是須考量應用程式的效能時,或是管理資料與記憶體時,這部分的差異便顯得格外重要。」當變數是以基本內建資料型別的其中一種方式,或是使用者定義的結構進行宣告時,這類的變數便是實值型別 (Value Type),而其中有一個例外是「string」資料型別,它是屬於參考型別。

實值型別會將內容儲存在配置於堆疊的記憶體中,例如 int x = 42; 其中的42會存在堆疊的記憶體區域中,當變數X因為定義的方法完成執行而超出範圍時,堆疊就會捨棄此值。使用堆疊很有效率,但是實值型別有限的存留期,讓它並不適合在不同類別之間共用資料。

相反地,參考性別(例如類別或陣列)會將內容配置在堆積(Heap)的不同記憶體區域,當方法完成時,這段記憶體並不會歸還給堆積,只有當C#的記憶體回收系統判定不需要它時才會回收,雖然在宣告參考型別時會需要較大的額外負荷,但是它們具有可以從其他類別存取的優點。

這部分日後有機會會再撰文補充。

呼叫函數 (Calling Method) 與被呼叫的函數 (Called Method)

註:原文書討論這類呼叫函數 (Calling Method) 與被呼叫的函數 (Called Method) 時會讓人有點混淆,這邊舉個簡單例子來說明:

// f () 此函數含有呼叫g()的函數,因此是「呼叫函數 Calling Method」void f()

{

g();

}


// g() 為實際被呼叫函數,因此是「被呼叫函數 Called Method」void g()

{

}

C# 2015 學習紀錄:控制結構、參數傳遞

By // 沒有留言:

邏輯運算元 && ||

當我們使用「&&」時,條件式內的兩個條件都必須為真「True」才會符合AND的條件 ,而「||」則是兩個條件內的任一為真即可,而不論是「&&」或「||」在檢驗條件式時,只要第一個條件式不成立,第二個條件的內容即不會執行(short-circuit operators)。如果必須要執行第二個條件式的話,可以改用「&」或「|」,來強制讓第二個條件式執行完再判斷 True或 Flase。

邏輯運算元的運算順序是先計算算數運算與相關比較邏輯元後,再執行邏輯判斷,如果有需要或對運算順序有疑問的話,可以用「Parenthese」雙括號來強制指定運算順序。

選擇性的傳遞參數

當使用C#呼叫方法(Method)時,如果我們遇到呼叫方法時無法指定一些參數時、想要用預設參數(Optional Parameters)時,我們可以在定義方法時將參數的預設值是先定義好。

像是:

private decimal GetFutureValue

(decimal monthlyInvestment,

decimal monthlyInterestRate = 0.05m, int months = 12) // 這2個引數(參數)已是先定義好值

{

decima futureValue = 0m;

for (int i=1; i < months ; i++)

{

futureValue = (futureValue + monthlyInvestment) + (1 + monthlyInterestRate);

}

return futureValue;

}

在這個 GetFutureValue的方法裡,第一個monthlyInvestment是在呼叫方法時必須要代入的參數,但是第二、三個參數monthlyInterestRate 與 month則是彈性需要的,以下用三個呼叫的方式來說明:

  1. decimal futureValue = this.GetFutureVale (monthlyInvestment, monthlyInterestRate, months),傳遞三個變數去呼叫函數,就像平常的使用方式。
  2. decimal futureValue = this.GetFutureValue (monthlyInvestment, monthlyInterestRate),省略了第三個變數去呼叫函數,此時程式會自動以函數預設的month = 12作為參數使用。

在使用預設參數時有幾點需要注意:

  1. 預設參數的位置必須在一般參數的後面,也就是在宣告彈性的或預設的參數時,其後的參數都必須要也是彈性(Optional)或預設(Default)的。
  2. 如果你在呼叫預設、彈性參數時的引數是使用位置(Position)方式傳遞的話,則這彈性參數之前的一般參數都必須在呼叫此函數時先定義好要傳遞的值(Value),且函數內引數的預設參數必須要有順序性,以上面的例子來說明就是不可以忽略第二個monthlyInterestRate引數,然後直接傳遞month的變數。
  3. 如果參數傳遞的方式是以名稱(Name)方式時就不用按照第2點的限制使用,可以不用管該變數時一般的還是彈性的。

參數傳遞如何使用名稱(Name)傳遞?

使用宣告變數(Parameter)時的名稱,接著以「:」冒號接著,再打上要呼叫函數的變數名稱(Argument)即可。像是:decimal futureValue = this.GetFutureValue(monthlyInvestment:monthlyInvestmet)

使用以名稱方式傳遞參數的好處就是不用遵守該函數的變數是不是預設變數,以及不用遵守呼叫時的變數順序,另外也可以與位置(Position)傳遞方式合併使用:

decimal futureValue = this.GetFutureValue (monthlyInvestment, months:months)


C# 2015 學習紀錄:如何處理數字與文字

By // 沒有留言:

變數、常數變數命名規則

  1. 「變數 Variable」命名可以依照 Camel Notation原則命名,也就是第一個英文字母小寫,後續接續的單字的第一個英文字母用大寫,例如:int counter = 1;、long numberOfBytes = 20000;、float interestRate = 8.125f;
  2. 「變數常數 Const Variable」命名可以依照 Pascal notation原則命名,也就是第一個英文字母大寫其餘小寫,例如:const int DaysInNovember = 30;、const decimal SalesTax = .075m;
  3. 各控制項的 Camel Notation命名參考方式可以到此網站瀏覽。

數值型態

C# 2015 提供 13種內建的數值型態,其中特別要注意的是float、decimal的宣告,必須在宣告型別、指定數值時,特別以文字「f」或「m」來特別表示其值屬於何種型別。

運算子與運算元

數學運算可以區分「二元運算子 Binary operators」與「一元運算子 Unary operators」,二元的意思便是像加減乘除或模數,都是需要兩個運算子(數字或變數)來搭配使用,像是1 + 1 =2 這樣。而一元則是只有一個運算子而已,像是正號+負號 - ,僅僅改變一個運算子的數值而已。

除法跟模數運算部分:

division (/) : If you’re working with integer data types, the division operator returns an interger value that represents the number of times the right operand goes into the left operand. Then, the modulus (%) operator returns an interger value that represents the remainder (which is the amount that’s left over after dividing the left operand by the right operand). If you working with non-integer data types, the division operator returns a value that uses decimal places to indicate the result of the division, which is usually what you want.
使用數學函數的方法:class.methodName ( one or more arguments) 例如:int shipWeight = Math.Round (shipWeightDouble);double orderTotal = Math.Round (orderTotal, 2);double area = Math.Pow (radius, 2) * Math.PI

字串與特殊字元

特殊字元的字串輸入我們遇到換行、Tab或需要雙引號的時候,在C#中有兩種方式可以提供我們使用:
  1. 「Escape Sequences」傳統上常使用的「\n」、「\t」、「\r」、「\\」、「\”」方式,用來當字串遇到反斜線、雙引號或是控制字元像是換行、Tab或Enter之類的的符號時。例如: string code = “JSPS”; decimal price = 49.50m; string result = “Code: “ + code + “\n” + “Price: $” + price + “\n; 輸出結果: Code: JSPS Price: $49.50
  2. 「Verbatim string literals」:只需要在字串的 “ “ 前加入「@」後,即可在字串中正常的使用各種特殊字元,但如果要使用雙引號「”」的話,必須在每一個「”」前多加一個「“」。例如: string path = @“c:\c#.net\files”; 輸出結果:c:\c#.net\files
因為「Escape Sequences」通常使用上比較簡單也比較容易插入字串,而「Verbatim string literals」則是方便在字串內隨意輸入特殊字元,通常也比較適合用來表達檔案目錄時,兩種表示特殊字元的方式都可以,端賴何種情況適合哪一種表示方式。

.NET結構與類別定義的資料類別

.NET提供了兩種資料類別的定義方式,分別是結構「 Structures」與類別「classes」,其中如果資料型態宣告的是由結構來源的變數,像是int, double等等,這些都屬「值」的型別,其變數存的資料真的就是那份資料,並且當複製或指派給另一個變數時,另一個變數是以複製的方式、創造另一個變數出來。而類別的資料型態像是String、Object,其儲存的是該String (Object)物件的參考值,也就是可以有多個變數可以共參考同一個字串或物件類別。

變數 & NULL

C#允許數值型態的資料類型可以有NULL值存在,命名方式係在宣告變數型別後立刻接上一個「?」表示其為一個可儲存NULL值的變數,例如:int? num = null;,我們可以利用屬性「HasValue」與「Value」測試該變數的值是否為NULL值,如果不是、那其值為何。