1.基本語法
1.1變量和表達式
基本類型:
整形:
有符號 |
無符號 |
sbyte |
byte |
short |
ushort |
int |
uint |
long |
ulong |
浮點型
類型 |
備註 |
m取值範圍 e取值範圍 |
近似值 |
float |
0 |
1.5 X 10-45 到 3.4 X 1038 | |
double |
0 |
5.0 X 10-324 到 1.7 X 10308 | |
decimal |
小數型 |
0 |
1.0 X 10-28 到 7.9 X 1028 |
前兩者可用+/- m x 2e的形式存儲,decimal則是用+/- m x 10e存儲
另外三種簡單類型
類型 |
允許的值 |
char |
一個Unicode字符,用16位整形編碼 |
bool |
真假 |
string |
一組字符 |
1.2命名空間
namespace LevelOne
{
int a;
namespace LevelTwo
{
//類似這樣定義命名空間,C#中的所有代碼一般都包含在命名空間中,包括Main函數(C#的Main首字母大寫的哦,和C++不同)
}
}
namespace LevelOne2
{
//可以用"."運算符來調用其他命名空間中的東西
LevelOne.a=1;
//也可以用using語句,
using LevelOne;
a=1;
}
1.3運算符
運算符優先級:
組 |
運 算 符 |
初級運算符 |
() . [] x++ x-- new typeof sizeof checked unchecked |
一元運算符 |
+ – ! ~ ++x --x和數據類型轉換 |
乘/除運算符 |
* / % |
加/減運算符 |
+ – |
移位運算符 |
<< >> |
關係運算符 |
< > <= >= is as |
比較運算符 |
= = != |
按位AND運算符 |
& |
按位XOR運算符 |
| |
按位OR運算符 |
^ |
布爾 AND運算符 |
&& |
布爾OR運算符 |
|| |
三元運算符 |
?: |
賦值運算符 |
= += –= *= /= %= &= |= ^= <<= >>= >>>= |
從上表可以看到所有C#的運算符,大部分與C++相同,這裏介紹幾個不同的
checked和unchecked運算符
C#提供了checked和 unchecked運算符。如果把一個代碼塊標記爲checked,CLR就會執行溢出檢查,如果發生溢出,就拋出異常。如果改變代碼,使之包含checked運算符:
byte b = 255;
checked
{
b++;
}
Console.WriteLine(b.ToString());
運行這段代碼,就會得到一個錯誤信息:
Unhandled Exception: System.OverflowException: Arithmetic operation resulted in an overflow.
at Wrox.ProCSharp.Basics.OverflowTest.Main(String[] args)
如果要禁止溢出檢查,可以把代碼標記爲unchecked:
byte b = 255;
unchecked
{
b++;
}
Console.WriteLine(b.ToString());
注意,unchecked是默認值。只有在需要把幾個未檢查的代碼行放在一個明確標記爲checked的大代碼塊中,才需要顯式使用unchecked關鍵字。
is運算符
is運算符可以檢查對象是否與特定的類型兼容。例如,要檢查變量是否與object類型兼容:
注意:
"兼容"表示對象是該類型,或者派生於該類型。
int i = 10;
if (i is object)
{
Console.WriteLine("i is an object");
}
int和從object繼承而來的其他C#數據類型一樣,表達式i is object將得到true,並顯示信息。
as運算符
as運算符用於執行引用類型的顯式類型轉換。如果要轉換的類型與指定的類型兼容,轉換就會成功進行;如果類型不兼容,as運算符就會返回值null。如下面的代碼所示,如果object引用不指向string實例,把object引用轉換爲string就會返回null:
object o1 = "Some String";
object o2 = 5;
string s1 = o1 as string; //s1 = "Some String"
string s2 = o2 as string; //s1 = null
as運算符允許在一步中進行安全的類型轉換,不需要先使用is運算符測試類型,再執行轉換。
sizeof運算符
使用sizeof運算符可以確定堆棧中值類型需要的長度(單位是字節):
unsafe
{
Console.WriteLine(sizeof(int));
}
其結果是顯示數字4,因爲int有4個字節。
注意,只能在不安全的代碼中使用sizeof運算符。第7章將詳細論述不安全的代碼。
typeof運算符
typeof運算符返回一個表示特定類型的System.Type對象。例如,typeof(string)返回表示System.String類型的Type對象。
可空類型運算符
如果在程序中使用可空類型,就必須考慮null值在與各種運算符一起使用時的影響。通常可空類型與一元或二元運算符一起使用時,如果其中一個操作數或兩個操作數都是null,其結果就是null。例如:
int? a = null;
int? b = a + 4; // b = null
int? c = a * 5; // c = null
但是在比較可空類型時,只要有一個操作數是null,比較的結果就是false。即不能因爲一個條件是false,就認爲該條件的對立面是true,這在使用非可空類型的程序中很常見。例如:
int? a = null;
int? b = -5;
if (a >= b)
System.Console.WriteLine("a >= b");
else
System.Console.WriteLine("a < b");
空接合運算符
空 接合運算符(??)爲處理可空類型和引用類型時表示Null值的可能性提供了一種快捷方式。這個運算符放在兩個操作數之間,第一個操作數必須是一個可空類 型或引用類型,第二個操作數必須與第一個操作數的類型相同,或者可以隱含地轉換爲第一個操作數的類型。空接合運算符的計算如下:如果第一個操作數不是 null,則整個表達式就等於第一個操作數的值。但如果第一個操作數是null,則整個表達式就等於第二個操作數的值。例如:
int? a = null;
int b;
b = a ?? 10; // b has the value 10
a = 3;
b = a ?? 10; // b has the value 3
如果第二個操作數不能隱含地轉換爲第一個操作數的類型,就生成一個編譯錯誤
詳細查詢運算符可登陸http://msdn2.microsoft.com/zh-cn/library/6a71f45d(VS.80).aspx
查詢
1.5數組、結構和枚舉
數組
定義格式:
int[] 數組名
數組要在訪問之前初始化。
例如:
int[] Array={1,3};
或者
int[] Array=new int[2];
或者
int[] Array;
Array=new int[2];
結構體:和C++一樣
枚舉 :和C++一樣
enum typeName{value1,value2,value3}
1.5選擇及循環語句
選擇語句:if else和switch
int caseSwitch = 1;
switch (caseSwitch)
{
case 1:
Console.WriteLine("Case 1");
break;
case 2:
Console.WriteLine("Case 2");
break;
default:
Console.WriteLine("Default case");
break;
}
http://msdn2.microsoft.com/zh-cn/library/06tc147t(VS.80).aspx
循環語句:for, while, do…while和 foreach
前三個和C++一樣,就不講了,下面介紹下foreach,可以用於從集合中逐一選取元素進行循環
class ForEachTest
{
static void Main(string[] args)
{
int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 };
foreach (int i in fibarray)
{//用in關鍵字加在集合前
System.Console.WriteLine(i);
}
}
}
集合可以是數組,枚舉型等等~
2.函數
函數的定義和使用基本上和C++相同,其重載方式在講到類的時候再說。
注意的是參數中,C++的&符號代表引用而在C#
2.1委託
委託是一種引用方法的類型。一旦爲委託分配了方法,委託將與該方法具有完全相同的行爲。委託方法的調用可以像其他任何方法一樣,具有參數和返回值,如下面的示例所示:
public delegate int PerformCalculation(int x, int y);
delegate是定義委託的關鍵字
-
委託類似於 C++ 函數指針,但它們是類型安全的。
-
委託允許將方法作爲參數進行傳遞。
-
委託可用於定義回調方法。
-
委託可以鏈接在一起;例如,可以對一個事件調用多個方法。
using System;
// 聲明一個委託:
delegate void SampleDelegate(string message);
class MainClass
{
// 一個普通的函數:
static void SampleDelegateMethod(string message)
{
Console.Write(message);
}
static void Main()
{
// 建立一個委託實例d1並將函數SampleDelegateMethod賦值給它:
SampleDelegate d1 = SampleDelegateMethod;
// 運行委託 d1:
d1("Hello");
}
}
可以把它理解成函數指針那樣~