2013年12月30日 星期一

[C#] 1-5 partial (type) 版本 與 (method)版本

1.partial (type)
部分型別定義允許類別、結構 (Struct) 或介面等的定義分割成多個檔案。

2.partial(method)
A partial method has its signature defined in one part of a partial type, and its implementation defined in another part of the type. Partial methods enable class designers to provide method hooks, similar to event handlers, that developers may decide to implement or not. If the developer does not supply an implementation, the compiler removes the signature at compile time. The following conditions apply to partial methods:
  • Signatures in both parts of the partial type must match.
  • 宣告的是形式、引述要一樣
  • The method must return void.
  • 方法必須 void 型態
  • No access modifiers are allowed. Partial methods are implicitly private.
  • 不允許存取的修飾字 且都是隱含 private



範例在有實際用到時補上。

[C#] 1-4 Convert class

Convert類別 就是將 datatype 轉換成其他datatype
範例是參考MSDN做出來,很棒!!




  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace convert類別
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             //object 型別的變數接受任何資料型別的值
  13.             object[] ary = {true-12163'x'new DateTime(2013,12,12),
  14.                        "105""103.0""-1", 1.00e2, 16.3e40};
  15.             long result;
  16.             //迴圈
  17.             foreach (object value in ary)
  18.             {
  19.                 try
  20.                 {
  21.                     result = Convert.ToInt64(value);
  22.                     Console.WriteLine("{0} : {1} 轉換 {2} : {3}",
  23.                         value.GetType()value, result.GetType(), result);
  24.                     Console.WriteLine();
  25.                 }
  26.                 catch (OverflowException) //產生溢位的狀況
  27.                 {
  28.                     Console.WriteLine("{0} : {1} : 溢位",
  29.                         value.GetType()value);
  30.                     Console.WriteLine();
  31.                 }
  32.                 catch (FormatException) //格式不符合
  33.                 {
  34.                     Console.WriteLine("{0} : {1} : 格式不合",
  35.                         value.GetType()value);
  36.                     Console.WriteLine();
  37.                 }
  38.                 catch (InvalidCastException) //無效的轉型
  39.                 {
  40.                     Console.WriteLine("{0} : {1} : 無效的轉型",
  41.                         value.GetType()value);
  42.                     Console.WriteLine();
  43.                 }
  44.            
  45.             }
  46.         }
  47.     }
  48. }

[C#] 1-3 console class

Console詳細請參考MSDN
表示主控台應用程式 (Console Application) 的標準輸入、輸出和錯誤資料流。 此類別無法被繼承。

範例 :
我列出常用的 Write()  WriteLine()   Read()  ReadLine()  。
注意Read() 預設是int型態,而且在輸出時是以ASCII碼表示,
所以要轉換成實際輸入的英文要強制轉換。

直接看範例解說比較快 :


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace _1._1._4_console
  7. {
  8.     class Program
  9.     {
  10.         static void Main(string[] args)
  11.         {
  12.             //迴圈 方便輸出練習
  13.             while (true)
  14.             {
  15.                 // .WRITE不會自動換行
  16.                 Console.Write("請輸出一個英數字 : ");
  17.                 //從標準輸入串流讀取一個字元
  18.                 //預設使用int來接,並且是轉換成ascii碼唷
  19.                 int a = Console.Read();
  20.                 //指定文字寫入標準輸出串流,但是不會換行
  21.                 Console.Write("直接輸出ascii碼 : " + a + "  ");        
  22.                
  23.                 //前面read()讀取了一個字元,"換行字元"仍留在串流中,所以再一次Read()吃掉
  24.                 //不然後面的讀取串流就會直接吃這換行字元而不正確
  25.                 Console.Read();
  26.                 //如果要用char來接,請使用強制轉型
  27.                 char c = Convert.ToChar(a);
  28.                 Console.Write("強制轉型(char) : " + c + " " );
  29.                 Console.Read();
  30.                 //會換行writeline
  31.                 Console.WriteLine();
  32.                 Console.WriteLine("請輸出一串英數字串");
  33.                 //從standard input stream 取一行字元
  34.                 //換行字元會一起被讀進來,所以不會影響下一個readline()
  35.                 string str = Console.ReadLine();
  36.                
  37.                 //standard output stream
  38.                 Console.WriteLine(str);
  39.                 Console.WriteLine();
  40.                 //clear()是把視窗的顯示訊息都清掉
  41.                 //Console.Clear();
  42.                 //取得顯示在主控台的標題
  43.                 string title = Console.Title;
  44.                 Console.WriteLine(title);
  45.             }
  46.         }
  47.     }
  48. }

[C#] 1-2 keyword base

(MSDN)base 關鍵字用於存取衍生類別中的基底類別 (Base Class) 成員:
  • 呼叫一個已被其他方法覆寫的基底類別中方法。
  • 指定建立衍生類別執行個體 (Instance) 時,所要呼叫的基底類別建構函式。
C++中,則是用界定運算子" :: ",來呼叫基礎的類別唷~
C# ,用base.xxx 來呼叫

範例:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace _1._1._3_base
  7. {
  8.     class person
  9.     {
  10.         protected string name = "小名";
  11.         protected string phone = "123456789";
  12.         public virtual void Info()
  13.         {
  14.             Console.WriteLine("名字 : {0}", name);
  15.             Console.WriteLine("編號 : {0}", phone);
  16.         }
  17.     }
  18.     class student : person
  19.     {
  20.         public string id = "001";
  21.         public override void Info()
  22.         {
  23.                 base.Info();
  24.             Console.WriteLine("學號 : {0}",id);
  25.         }
  26.     }
  27.     class Program
  28.     {
  29.         static void Main(string[] args)
  30.         {
  31.             student one = new student();
  32.             one.Info();
  33.         }
  34.     }
  35. }

2013年12月29日 星期日

[C#] 1-1 keyword abstract 使用抽象類別存取衍生類別的物件

(MSDN)抽象類別有下列功能:
  • 抽象類別不能執行實體化。
  • 抽象類別可能會包含抽象方法和存取子。
  • 無法使用 sealed (C# 參考) 修飾詞來修改抽象類別,因為這兩個修飾詞意義剛好相反。 sealed 修飾詞可以不讓類別被繼承,而 abstract 修飾詞卻需要類別被繼承。
  • 衍生自抽象類別的非抽象類別必須包含所有繼承抽象方法和存取子的實作。

在方法或屬性宣告裡使用 abstract 修飾詞,表示該此方法或屬性沒有包含實作。

範例 :
上半部是衍生類別
下半部是利用基礎的抽象類別去存取衍生類別物件


  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace _1._1._1_abstract
  7. {
  8.     //有使用到抽象方法,請產生抽象類別
  9.     public abstract class baseclass
  10.     {
  11.         //名稱與編號
  12.         private string id = "";
  13.         private string name = "";
  14.         public string ID
  15.         {
  16.             get { return id; }
  17.             set { id = value; }
  18.         }
  19.         public string Name
  20.         {
  21.             get { return name; }
  22.             set { name = value; }
  23.         }
  24.         //輸出方法
  25.         //一般輸出
  26.         public void Show()
  27.         {
  28.             Console.WriteLine("基礎類別的show...");
  29.         }
  30.         //虛擬修飾字的輸出
  31.         public virtual void ShowV()
  32.         {
  33.             Console.WriteLine("基礎類別的virtual...show");
  34.         }
  35.         //抽象是不能宣告實體
  36.         public abstract void Showinfo();
  37.     }
  38.     //繼承抽象類別的衍生類別
  39.     public class derivedclass : baseclass
  40.     {
  41.         //使用"new"覆蓋基礎的Show
  42.         public new void Show()
  43.         {
  44.             Console.WriteLine("衍生類別的show...");
  45.             //base.Show();     //仍可利用base. 關鍵字來呼叫基礎類別的show()
  46.         }
  47.         //
  48.         public override void ShowV()
  49.         {
  50.             Console.WriteLine("衍生類別的virtual...show");
  51.         }
  52.        
  53.         //務必要實作抽象類別的方法,(使用override覆蓋檔案,前提是抽象類別方法要有virtual or abstract or override)
  54.         public override void Showinfo()
  55.         {
  56.             Console.WriteLine(ID + " " + Name);
  57.         }
  58.        
  59.     }
  60.     class Program
  61.     {
  62.         static void Main(string[] args)
  63.         {
  64.             //衍生實體物件,初始化
  65.             derivedclass one = new derivedclass();
  66.             one.ID = "001";
  67.             one.Name = "陳曉明";
  68.             //衍生輸出
  69.             one.Showinfo();
  70.             one.Show();
  71.             one.ShowV();
  72.             Console.WriteLine();
  73.             //基礎類別,使用衍生類別向上轉型指定給抽像類別 OK!!!
  74.             baseclass base1 = one;
  75.            
  76.             //抽象輸出
  77.             base1.Showinfo();
  78.             base1.Show();
  79.             base1.ShowV();        //注意!! 有virtual修飾的method,會根據物件的型態呼叫該物件的方法版本,不是依據ref基礎型態
  80.         }
  81.     }
  82. }