2013年12月27日 星期五

C#、C/C++、Java

 C#(C Sharp)是微軟(Microsoft)為.NET Framework量身訂做的程式語言,C#擁有C/C++的強大功能以及Visual Basic簡易使用的特性,是第一個元件導向(Component-oriented)的程式語言,和C++與Java一樣亦為物件導向(object-oriented)程式語言。

 
以下是三種語言的特性分析:

功能
C++
Java
C#
   Platform Independence
無
有
有
   Garbage Collection
無
有
有
   Type Safety
無
有
有
   Scalability
無
有
(透過package來實踐)
有
(透過namespace來實踐)
   Pointer
有
無
無
(但可透過unsafe來使用)
   Multiple Inheritance
有
無
(透過interface來實踐)
無
(透過interface來實踐)
   Macro
有
無
無
   Template
有
無
無
   Operator Overloading
有
無
有
   Structure
有
無
有
   Enumeration
有
無
有
   Exception Handling
有
有
有


其實我以前也是學C++起來的,C++的強大其實這是大部分的程式員都認同的,它是C語言的演化,所以有了類似物件導向的概念。但是語言是透過時代的演進下而慢慢的產生了新技術,所以進而誕生了Java這樣的物件導向程式語言。C#就是在這樣的概念下又產生了一個相似的兄弟語言。創造C#的Anders Hejlsberg目的也是希望能比Java好還要更好的使用技術(但是不是就見仁見智了)。
 我們先來討論C++,C++是一種概稱, 是C語言加上物件的觀念,基本上(基本上啦~), 我個人的經驗是覺得,如果要真的懂如何去學習程式這門技術,一定要懂怎麼寫C/C++,或者ASM這兩個最接近電腦語言的程式語言。因為比較能夠真正的去了解到電腦的運作方式,如何寫才會有最好的效能,懂的演算法的呈現。之後再去學習C#這類的高階語言時,會非常容易了解如何的運用。我覺得C/C++、ASM就像是古代武學的內功一樣,通常我覺得會C/C++、ASM的人通常比較少人上手其它語言時會很困難。


C#理論上也算是C++的一種演化, 只不過C#更為高階, 一些記憶體配置或是記憶體回收等等這些麻煩又複雜的低階工作都由C#幫你完成, C# programmer只需專注於.Net函式庫的應用和程式開發. C#可以很容易引用VC的DLL和VB的COM, C#具有強大的物件功能, 豐富的.Net Library, 數量精簡的關鍵字, 優良的程式語言架構, 和JAVA類似的語法, 以及如同VB一般的方便使用。


簡單的說,就是諸如像是C#這類的語言,都已經把以前程式員會遇到的問題,都幫你排除,你只要稍微寫一點程式,就可以有很大的效果。當然啦,如果是追求程式藝術, 講究執行速度和硬體驅動控制, C/C++、ASM還是第一把交椅,可以參考使用微軟的Visaul C++。C#必須在.Net Framework平台上執行, 並透過.Net Framework提供的大量簡易使用的函式庫來達到快速的發展應用程式的目的. C#不適合低階應用, 因為用到了unmange code就不太好管理, 也破壞了.Net 跨平台的優點。
 Java基本上能運用的層面也是很廣,它除了效能上是比較不適合寫低階的控制上,其它你能想的到的技術,它大部分都能實現,發展的十分成熟,程式的結構本身也不難學習,但Java其實是一個不太容易上手的技術,它的難不是難在程式的寫作上,而是在環境的設定,很多人常常光在設定架構上,就望之卻步了,我曾經也遇到新手的程式員,會寫Java程式,但是面對一個他未曾從頭開始建置的專案時.他常常會搞不懂怎麼讓Java裡的程式運行起來。
 通常我們也很常用Java來寫Server端的應用,或者Web Client的應用,App應用程式,或者Mobile系統,這是Java目前在市場上常看到的應用方式。最有名的就是大家目前最熟悉的「Android」、「當個創世神」啦
 如果你考慮到完全的跨平台, 可以選擇JAVA (其實現在微軟也慢慢往真正的跨平台方向邁進), 如果你單純的想要學學程式語言, 學學程式流程和資料結構等等基礎功, DOS下的C++是最好的入門選擇。C#是微軟幫開發者能想到很麻煩的事情,都幫你處理掉了,所以想要快速製作網站,可以考慮C#。
 最後我必須要說,任何一門技術都可以玩的很厲害,端看自已投入學習多少喔。


-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年12月26日 星期四

Visual Studio的自動縮排

在eclipse和vs中都有自動排版功能
在eclipse中是:ctrl+shift+f
在visual Studio:先選中你要自動排版的內容,或者ctrl+a之後ctrl+k,然後ctrl+f 。這樣就全文自動排版了。
以下是在介面上的操作方式。

選擇縮排樣式

  1. 在 [Tools工具] 功能表上,選取 [Option選項]。
  2. 在 [Text Editor文字編輯器] 資料夾中,選擇 [All Langauges所有語言] 子資料夾中的 [Tabs索引標籤] 選項,將此選項設定為全域性。
    -或-
    用來進行程式設計的語言子資料夾中選擇 [Tabs索引標籤] 選項。
  3. 在 [Indenting縮排] 下選取下列其中一項:
    • [None無] -- 游標將移至下一行起點。
    • [Block區塊] -- 游標將使下一行與前一行對齊。
    • [Smart智慧] -- (可供使用時為預設值) 您用來進行程式設計的語言會決定要使用的適當縮排樣式。 例如,當您在 Visual Basic 中建立 "For...Next" 迴圈,此迴圈中包含 If 或 Select Case 陳述式,這些陳述式會在迴圈 (自訂的內部縮排將予以保留) 中顯示為縮排的程式碼區塊。
  4. 按一下 [Ok確定]。

若要變更縮排索引標籤設定值

  1. 在 [Tools工具] 功能表上,選取 [Options選項]。
  2. 在 [Text Editor文字編輯器] 資料夾中,選擇 [所有語言] 子資料夾中的 [Tabs索引標籤] 選項,將此選項設定為全域性。
    -或-
    在用來進行程式設計的語言子資料夾中選擇 [索引標籤] 選項。
  3. 若要指定定位和縮排作業中所使用的定位字元,請選取 [保留定位點]。
    -或-
    若要指定使用的空白字元,請選取 [插入空格]。
  4. 如果選擇 [插入空格],請在 [定位點和縮排大小] 中輸入用來代表每個定位點和縮排的空白字元數目。

若要手動增加或減少縮排

  1. 選擇要縮排的文字。
  2. 要增加縮排時,請按 TAB 鍵或選取 [縮排] 圖示。
    若要減少縮排,則按 SHIFT+TAB 鍵組合或選取 [取消縮排] 圖示。

將智慧型縮排套用至選取的程式碼

  1. 為您程式設計所使用的語言,在 [縮排] 中選取 [智慧] 選項。 如需詳細的指令,請參閱此主題稍早所提到的「若要選擇縮排樣式」程序。
  2. 選取您想要套用 [智慧] 縮排的文字。
  3. 在 [編輯] 功能表中選取 [進階],並且選擇 [格式化選取範圍],或按組合鍵 CTRL+K、CTRL+F。
    [格式化選取範圍] 將開發語言的智慧型縮排規則套用至選取文字中。

若要將定位點長度的空白區 (White Space) 轉換為定位點,或將定位點轉換為空白區

  1. 選取要轉換的文字。
  2. 在 [編輯] 功能表上選取 [進階]。
  3. 選擇 [選取範圍空白鍵轉定位鍵],將定位點長度的空白區轉換為定位字元。
    -或-
    選擇 [選取範圍定位鍵轉空白鍵],將定位字元轉換為定位點長度的空白區。
    將會轉換第一個字母、數字或符號左邊的所有定位或空白區。 位於程式碼行中或行尾的定位或空白區則不受影響。
-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年12月25日 星期三

NuGet操作 - Extending擴展

這次要提到的,是NuGet的封裝擴展,有些封裝的安裝新指令可以在Package Manager Console window中使用新的命令。像是MvcScaffolding這樣的封包,可以用建立命令來生成ASP.NET MVC的控制器和視圖命令。下圖顯示了安裝MvcScaffolding創建一個新的命令Scaffold,完成tab expansion。

創建一個PowerShell腳本擴展,該模塊ClassNamer.psm1的代碼如下所示:

function Get-ClassName {

    $ie = new-object -com InternetExplorer.Application

    $ie.navigate("http://www.classnamer.com/")

    if (!$ie) { Write-Host "variable is null" }

    while ($ie.Busy -eq $true)

    {

        Start-Sleep -Milliseconds 1000;

    }



    $doc = $ie.Document

    if (!$doc)

    {

        Write-Host "variable is null"

        return "SorryCantGiveYouAGenericClass"

    }

    $answer = $doc.getElementByID("classname")

    return $answer.innerHtml


}

Export-ModuleMember Get-ClassName

有兩部分此代碼,函數的定義和定義 public函數,從模塊組的導出命令。這裡是Get-類名函數的簡短描述:


  • 建立一個IE Object
  • 瀏覽獲得頁面
  • 睡眠而忙碌(或許應該加上一個最大循環計數器)
  • 得到的文檔,這是web頁面的DOM
  • 查詢相關元素的doc Object和取得的Value


接下來的部分是寫獲得該模組導入的Script,init.ps1到Package Manager Console,該代碼如下所示:

param($installPath, $toolsPath, $package, $project)


Import-Module(Join-Path $toolsPath ClassNamer.psm1)


當上述Script運行時,將導入模塊ClassNamer.psm1。現在需要做的就是把兩個PowerShell的文件放在一個文件夾的工具,並在同一個文件夾中,執行了NuGet的命令規範ClassNamer tools文件夾。該命令將產生一個ClassNamer.nuspec文件的default metadata。當我們在ClassNamer.nuspec執行NuGet pack,它會創建一個pack,其中包含工具文件夾,當我們在Visual Studio安裝的軟體包的init.ps1腳本會被NuGetybgz執行行和安裝模組。如果部驟正確,將能夠看到已經安裝的軟件包並運行新的Get-類名的命令。

-雲遊山水為知已逍遙一生而忘齡- 電腦神手

2013年12月24日 星期二

NuGet操作 - Install安裝指南

這是分享的是一個很重要操作技巧,Nuget的安裝。介紹如何透過PowerShell命令查尋、安裝、刪除和更新NuGet軟件包。開發者可以使用管理NuGet軟件包對話框封裝工作。
如果想安裝一個程式封裝包在開啟於專案裡時,使用PowerShell命令是必需的。在某些情況NuGet也需要使用PowerShell在一些只可以存取的封裝。

NuGet是一個簡化程式庫安裝程序的Visual Studio 2010延伸套件,由微軟RD與開發社群共同開發,以Open Source方式釋出。透過NuGet,能有效簡化程式庫的安裝程序,另外還提供版本更新、移除等功能,將下載安裝程式庫的動作簡化到點一下滑鼠就完成。

從Tools menu中,選擇Library Package Manager,然後單擊Package Manager Console。




下方會顯示Package Manager Console的視窗



這兩個下拉列表設置,讓你從你的窗口中輸入命令省略參數的默認值:

在封裝資源列表,使用希望輸入的命令選擇默認資源(NuGet package feed)。通常官方的NuGet封裝資源是默認值。有關 alternative feeds的更多信息,請參考Nuget官方網站文件。
在默認的項目列表中,使用命令執行要運作的默認項目。 (默認值將在解決方案,當打開的窗口之一的第一個項目,不一定是已經在解決方案資源管理器中選定的。)
當輸入命令時,可以覆蓋這些默認值。在Package Manager Console視窗中,Get-Package-ListAvailale 在命令提示下查看可供選擇的封裝資源中所有包涵的列表。




對於默認的軟件包源,該命令會列出數以千計的包。但更好的方法是指定一個過濾器。

例如,要查找日誌記錄包ELMAH,輸入Get-Package -ListAvailable -Filter elmah (封裝的名稱)或Get-Package -Filter Logging -ListAvailable(在封包描述裡的一個關鍵字)。


可以使用Get-package命令指定更多的選項,輸入Get-Help Get-Package,或者Package Manager Console Powershell Reference。



對於使用安裝封裝命令中指定多個選項,輸入Get-Help Install-Package或Package Manager Console PowerShell Reference。

NuGet指定的封裝檢索和封裝在Default project drop-down list中選擇該項目安裝它(除非在命令中指定一個不同的項目)。文件被複製到解決方案,參考可能被添加到項目中,該項目的app.config或web.config文件可能被更新。

如果正在安裝的封裝依賴於其他程序包但還沒安裝,NuGet會安裝已輸入的。

如果封裝需要接受許可,不會被提示在對話框中。相反的,訊息會指出使用該函式庫的構成許可證驗收。



你可以在Solution Explorer的references看到Visual Studio已經安裝好的library。


如果app.config or web.config file已經有更新,會看到例如安裝ELMAH上的參數


新的資料夾就會被建立在solution folder,如果專案沒有solution folder,封裝資料夾會建立在project folder。



該文件夾包含每個已安裝包中的子文件夾。子文件夾包含由包安裝的文件。它還包含包文件本身(。nupkg文件,該文件是包含所有包中包含的文件的zip文件)。



可以在專案中使用Library。當輸入程式碼時,智慧感知技術就會跳出函式庫和功能。




2013年12月23日 星期一

C# - Enum列舉

Enum(列舉) 在 C 語言時代就是賦予常數值可讀意義的簡便方法,效果是列舉出多個常數,並設定數值。

以下是C語言的例子:
enum{ stop, stand, run };

大括號中每一個元素稱為列舉元。 如果沒設定數值,預設是從0開始遞增。如果要設定數值,可以這樣打 enum{ stop=5, stand, run }; 這樣就會變成 (stop=5 ; stand=6 ; run=7) 也可以這樣用 enum{ stop=5, stand, run=2 };


Enum列舉是Java裡很常見的一個型別,Java 的列舉型別是一種特殊型別,當我們要在列舉型別的場合中加上泛型能力時,需要運用一些不同的處理手段。我們也需要用到 Reflection (反射)。


以下是Java Enum的class定義:

public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {
    public final int compareTo(E o)
    {
        Enum other = (Enum)o;
        Enum self = this;
        if (self.getClass() != other.getClass() && // optimization

            self.getDeclaringClass() != other.getDeclaringClass())

            throw new ClassCastException();

        return self.ordinal - other.ordinal;
    }
}

Enum是個抽象類別,無法直接實例化,它實作了Comparable介面,在compareTo()方法中,主要是針對ordinal成員比較,也就是在需要排序Enum實例的場合,是依據ordinal成員進行排序。

在C#裡Enum 關鍵字用來宣告列舉型別 (Enumeration),是由一組名為列舉值清單的具名常數所構成的獨特型別,Enum算是整數(int)型別,當然,也可以指定成long, byte, short.....等型別,我們叫作「基底型別」。例如:

enum Days { Sat, Sun, Mon, Tue, Wed, Thu, Fri };

每個列舉型別都有基礎型別,此基礎型別可以是除了char型別以外的任何整數型別。列舉項目的預設基礎型別是int。根據預設,第一個列舉值的值是0,而每一個接下來的列舉值會遞增1,列舉值的名稱中可能不包含空格。

不論是指派其它值做為新版本的列舉,或是變更新版本之列舉成員的值,都可能造成相依的原始程式碼發生問題。常見的情況是,enum 值用於 switch 陳述式中,而且如果其他項目又加入至 enum 型別,則預設值的測試將會傳回非預期的 true。


public class EnumTest
{
    enum Days { Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri };

    static void Main()
    {

        int x = (int)Days.Sun;
        int y = (int)Days.Fri;

        Console.WriteLine("Sun = {0}", x);

        Console.WriteLine("Fri = {0}", y);
    }
}

public class EnumTest
{
    enum Days { Sat = 1, Sun, Mon, Tue, Wed, Thu, Fri };

    static void Main()
    {
        int x = (int)Days.Sun;
        int y = (int)Days.Fri;

        Console.WriteLine("Sun = {0}", x);
        Console.WriteLine("Fri = {0}", y);
    }
}

在這個範例裡,宣告了一個 Days 列舉型別。兩個列舉值會明確轉換成整數,然後指派給整數變數。所以在三種程式語言的比較,其實大致上都是大同小異。

以下範例enum型別的轉換是ComPort的三個enum型別的變數 parity, stopbits, handshake,要從字串轉換成enum型別,注意enum 型別的轉換方法:


parity = (System.IO.Ports.Parity) Enum.Parse(typeof(System.IO.Ports.Parity), "None");

stopbits = (System.IO.Ports.StopBits) Enum.Parse(typeof(System.IO.Ports.StopBits), "One");
handshake = (System.IO.Ports.Handshake) Enum.Parse(typeof(System.IO.Ports.Handshake), "None");

-雲遊山水為知已逍遙一生而忘齡- 電腦神手