Beginner with c# 7 (轉)

worldblog發表於2007-12-02
Beginner with c# 7 (轉)[@more@]1。7 語句(Statements)

借用了c/c++大多數的語句方法,不過仍然有些值得注意的地方。還有些地方是有所改動的。
在這裡,我只提一些c#特有的東東。

1。7。10 “foreach”語句
“foreach”語句列舉一個集合內的所有元素,並對這些元素一系列的操作。還是看看例子吧:*/

using System;
using System.Collections;
class Test
{
  static void WriteList(ArrayList list) {
  foreach ( o in list)
  {
  int i = (int) o;//如果是for語句,這裡一定會報錯!
  Console.WriteLine(0);
  Console.WriteLine(++i);
  }
  }
  static void Main() {
  ArrayList list = new ArrayList();
  for (int i = 0; i < 10; i++)
  list.Add(i);
  WriteList(list);
  }
}
/*這個例子用“foreach”掃描了整個“list”,並把“list”中所有的元素列印出來。有時候還是
挺方便的。

1。7。15 檢查開關(The checked and unchecked statements)
“checked”和“unchecked”語句用來控制數學運算和完整型別轉換的檢查工作。“checked”檢查它
作用的域中可能出現的違例,並丟擲一個異常;而“unchecked”則阻止所有的檢查。舉個例子:*/

using System;
class Test
{
  static int x = 1000000;
  static int y = 1000000;
  static int F() {
  checked {return (x * y);}  // 丟擲 OverflowException
  }
  static int G() {
  unchecked {return (x * y);}  // 返回 -727379968
  }
  static int H() {
  return x * y;  // 預設狀態。
  }
  static void Main() {
  F();  //可以登出掉此行試試。
  Console.WriteLine(G());
  Console.WriteLine(H());
  }
}

/*
在編譯過程中不會有任何錯誤出現。因為“checked”和“unchecked”只在執行時才起作用。值得一說的是
H()。它的預設狀態和當前的預設檢查的狀態有關。但返回的結果肯定和F()或G()中的任一個相同。
再看一個例子:*/

using System;
class Test
{
  const int x = 1000000;
  const int y = 1000000;
  static int F() {
  checked {return (x * y);}  // 編譯器警告(Compile warning):溢位(overflow)
  }
  static int G() {
  unchecked {return (x * y);}  // 返回 -727379968
  }
  static int H() {
  return x * y;  // 編譯器警告(Compile warning):溢位(overflow)
  }
  static void Main() {
  Console.WriteLine(F());  //可以登出掉此行試試。
  Console.WriteLine(G());
  Console.WriteLine(H());  //可以登出掉此行試試。
  }
}

/* 當F()和H()求值的時候,就會引起一個編譯警告。而在G()中,因為有了“unchecked”,遮蔽了這個警
告。要注意的是“checked”和“unchecked”都不能對的返回值進行操作!比如:*/
class Test
{
  static int Multiply(int x, int y) {
  return x * y;
  }
  static int F() {
  checked{ return Multiply(1000000, 1000000); } // 與 return Multiply(1000000, 1000000);
  }  // 有相同的效果。
}
/* 其實大家稍微想一下知道為什麼m$沒有這麼做!對這個內容的討論超出本文的範圍和俺的能力之外哦。

在c#中,所有的十六進位制數都是uint。如果用強制型別轉換會引起編譯器報錯。用“unchecked”則可以
跳過這個機制,把uint的十六進位制數轉化為int。如:*/

class Test
{
  public const int AllBits = unchecked((int)0xFFFFFFFF);
  public const int HighBit = unchecked((int)0x80000000);
}

/* 上例所有的常數都是uint,而且超過了int的範圍,沒有“unchecked”,這種轉換會引發一個編譯器錯
誤。注意:上面用的是“unchecked”運算子。不是語句。不過它們之間除了一個用“()”,另一個用
“{}”以外,幾乎一樣。BTW,“checked”同樣。

1。7。16 “lock”語句(The lock statement)
“lock”獲得一個相互排斥的鎖定。(俺查過一些資料,但都沒有清晰說明,暫不介紹)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987289/,如需轉載,請註明出處,否則將追究法律責任。