2016年3月28日 星期一

介面(Interface)

Source : 出處

介面說明

  • 介面為只有宣告成員,而沒有實作的類別
  • C#中使用interface來宣告介面
  • 介面只能定義屬性、方法、事件、索引,且不包含實作(Implementation)這些成員的程式碼
    • 介面可以有0個或多個成員
    • 介面的成員只能是屬性、方法、事件、索引子
      public interface 介面
      {
          int 屬性 { get; }               //屬性
          public void 方法();             //方法
          event MyEvent 事件;            //事件
          int this[int index] {get; set;} //索引子
      }
    • 介面的成員不能是常數、欄位運算子、建構函式、解構函式、型別、靜態成員
    • 由類別或結構提供介面的實作
      public interface 介面
      {
          string 屬性 { get; set; }
          string 方法();
      }
      
      class 類別 : 介面
      {
          private string 欄位 = "Hello";
          public  string 屬性
          {
              get { return 欄位;  }
              set { this.欄位 = value; }
          }
      
          public string 方法()
          {
              return 欄位 + " World";
          }
      }
  • 一個類別只能繼承一個父類別,但可以實作(繼承)多個介面
    class 類別 : 介面1, 介面2, 介面3
    {
        xxxxx
    }
  • 介面可以繼承多個介面
  • 介面不可以被實體化 即不可以new 介面
  • 若類別繼承介面,則要實作介面的所有成員
    • 若介面B有繼承其它介面A,則繼承介面B的類別需實作介面A和介面B的成員
      
      public interface 介面A
      {
          string 方法A();
      }
      
      public interface 介面B : 介面A
      {
          string 方法B();
      }
      
      class 類別 : 介面B
      {
          public string 方法()A
          {
              return "實作介面A的方法A";
          }
      
          public string 方法()B
          {
              return "實作介面B的方法B";
          }
      }

介面的用法

  • 下面的例子假設有基本的程式如下:
    public interface 介面 
    {
        string 方法();
    }
    
    class 類別A : 介面
    {
        public string 方法()
        {
            return "類別A";
        }
    }
    
    class 類別B : 介面
    {
        public string 方法()
        {
            return "類別B";
        }
    }
    
  • 介面基本用法:
    class 類別
    {
        public void 方法1()
        {
            介面 物件 = new 類別A();
            System.Console.WriteLine( 物件.方法() );     //顯示:類別A
    
            物件 = new 類別B();
            System.Console.WriteLine( 物件.方法() );     //顯示:類別B
        }
    }
  • 介面進階用法-多型(Polymorphism):
    方法2( )是很常使用的寫法,當一個方法傳入的參數可能是不同的類別時,可以讓這些類別繼承某個介面,並將方法的參數型別設為該介面
    class 類別
    {
    
        public void 方法2()
        {
            介面 物件 = new 類別A();
            顯示方法(物件);              //顯示:類別A
    
            物件 = new 類別B();
            顯示方法(物件);              //顯示:類別B
        }
    
        public void 顯示方法(介面 物件)
        {
            System.Console.WriteLine( 物件.方法() );
        }
    }
    

2016年3月26日 星期六

分割字串

source : MSDN

class TestStringSplit
{
    static void Main()
    {
        char[] delimiterChars = { ' ', ',', '.', ':', '\t' };

        string text = "one\ttwo three:four,five six seven";
        System.Console.WriteLine("Original text: '{0}'", text);

        string[] words = text.Split(delimiterChars);
        System.Console.WriteLine("{0} words in text:", words.Length);

        foreach (string s in words)
        {
            System.Console.WriteLine(s);
        }

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/* Output: Original text: 'one two three:four,five six seven' 7 words in text: one two three four five six seven */

判斷字串是否表示數值

source :MSDN

若要判斷字串是否為指定之數字型別 (Numeric Type) 的有效表示,請使用靜態 TryParse 方法,這是由所有基本數字型別以及 DateTimeIPAddress 等這類型別實作的方法。下列範例顯示如何判斷 "108" 是否為有效的 int

int i = 0; 
string s = "108";
bool result = int.TryParse(s, out i); //i now = 108

如果字串包含非數字字元或者數值對於您指定的特定型別而言太大或太小,TryParse 會傳回 false 並且將 out 參數設為零。否則,會傳回 true 並且將 out 參數設為字串的數值。

System_CAPS_note注意事項

字串可能只包含數字字元,並且對於您使用其 TryParse 方法的型別而言仍然是無效的。例如,"256" 不是 byte 的有效值,但卻是 int 的有效值。 「"98.6" 不是 int 的有效值,但卻是 decimal 的有效值。

下列範例顯示如何使用 TryParselongbytedecimal 值的字串表示。
string numString = "1287543"; //"1287543.0" will return false for a long
long number1 = 0;
bool canConvert = long.TryParse(numString, out number1);
if (canConvert == true)
  Console.WriteLine("number1 now = {0}", number1);
else
  Console.WriteLine("numString is not a valid long");

byte number2 = 0;
numString = "255"; // A value of 256 will return false
canConvert = byte.TryParse(numString, out number2);
if (canConvert == true)
  Console.WriteLine("number2 now = {0}", number2);
else
  Console.WriteLine("numString is not a valid byte");

decimal number3 = 0;
numString = "27.3"; //"27" is also a valid decimal
canConvert = decimal.TryParse(numString, out number3);
if (canConvert == true)
  Console.WriteLine("number3 now = {0}", number3);
else
  Console.WriteLine("number3 is not a valid decimal");