在一小時內學會 C#
關於作者
Aisha Ikram
我現在在英國一家軟件公司任技術帶頭人
職業
位置
簡介
C# 是一種具有 C++ 特性
本文通過一系列例程以簡短但全面的方式討論了 C# 語言構造和特性
注意
接下來關於 C# 的討論主題
編程結構
命名空間
數據類型
變量
運算符與表達式
枚舉
語句
類與結構
修飾符
屬性
接口
函數參數
數組
索引器
裝箱與拆箱
委托
繼承與多態
以下主題不會進行討論
C++ 與 C# 的共同點
諸如垃圾回收
數據類型轉換
異常處理
編程結構
和 C++ 一樣
看看 C# 中的 Hello World 程序
復制內容到剪貼板
代碼:
using System;
namespace MyNameSpace
{
class HelloWorld
{
static void Main(string[] args)
{
Console
}
}
類塊或結構定義之後沒有必要再加一個半角分號
命名空間
每個類都打包於一個命名空間
現在思考當你要從其他命名空間的類中訪問 HelloWorld 類
復制內容到剪貼板
代碼:
using System;
namespace AnotherNameSpace
{
class AnotherClass
{
public void Func()
{
Console
}
}
}
現在在你的 HelloWorld 類中你可以這樣訪問
復制內容到剪貼板
代碼:
using System;
using AnotherNameSpace; // 你可以增加這條語句
namespace MyNameSpace
{
class HelloWorld
{
static void Main(string[] args)
{
AnotherClass obj = new AnotherClass();
obj
}
}
}
在
你同樣可以定義嵌套命名空間
Using
#include 指示符被後跟命名空間名的 using 關鍵字代替了
變量
除了以下差異
數據類型
所有 C# 的類型都是從 object 類繼承的
以下是 C# 內建類型的列表
類型 字節 描述
byte
sbyte
short
ushort
int
uint
long
ulong
float
double
decimal
string
char
bool true
注意
用戶定義類型文件包含
以下類型繼承時均分配內存
值類型
值類型是在堆棧中分配的數據類型
? 除字符串
? 結構
? 枚舉類型
引用類型
引用類型在堆(heap)中分配內存且當其不再使用時
引用類型包括
? 類
? 接口
? 集合類型如數組
? 字符串
枚舉
C# 中的枚舉和 C++ 完全一樣
例子
復制內容到剪貼板
代碼:
enum Weekdays
{
Saturday
}
類與結構
除了內存分配的不同外
例子
復制內容到剪貼板
代碼:
struct Date
{
int day;
int month;
int year;
}
class Date
{
int day;
int month;
int year;
string weekday;
string monthName;
public int GetDay()
{
return day;
}
public int GetMonth()
{
return month;
}
public int GetYear()
{
return year;
}
public void SetDay(int Day)
{
day = Day ;
}
public void SetMonth(int Month)
{
month = Month;
}
public void SetYear(int Year)
{
year = Year;
}
public bool IsLeapYear()
{
return (year/
}
public void SetDate (int day
{
}
}
屬性
如果你熟悉 C++ 面向對象的方法
所以上面的類應該寫成這樣
復制內容到剪貼板
代碼:
using System;
class Date
{
public int Day{
get {
return day;
}
set {
day = value;
}
}
int day;
public int Month{
get {
return month;
}
set {
month = value;
}
}
int month;
public int Year{
get {
return year;
}
set {
year = value;
}
}
int year;
public bool IsLeapYear(int year)
{
return year%
}
public void SetDate (int day
{
this
this
this
}
}
這裡是你 get 和 set 屬性的方法
復制內容到剪貼板
代碼:
class User
{
public static void Main()
{
Date date = new Date();
date
date
date
Console
(
}
}
修飾符
你必須知道 C++ 中常用的 public
readonly
readonly 修飾符僅用於修飾類的數據成員
復制內容到剪貼板
代碼:
class MyClass
{
const int constInt =
readonly int myInt =
readonly int myInt
public MyClass()
{
myInt
}
public Func()
{
myInt =
Console
}
}
sealed
帶有 sealed 修飾符的類不允許你從它繼承任何類
復制內容到剪貼板
代碼:
sealed class CanNotbeTheParent
{
int a =
}
unsafe
你可以使用 unsafe 修飾符在 C# 中定義一個不安全上下文
復制內容到剪貼板
代碼:
public unsafe MyFunction( int * pInt
{
int* pAnotherInt = new int;
*pAnotherInt =
pInt = pAnotherInt;
*pDouble =
}
接口
如果你有 COM 的思想
復制內容到剪貼板
代碼:
using System;
interface myDrawing
{
int originx
{
get;
set;
}
int originy
{
get;
set;
}
void Draw(object shape);
}
class Shape: myDrawing
{
int OriX;
int OriY;
public int originx
{
get{
return OriX;
}
set{
OriX = value;
}
}
public int originy
{
get{
return OriY;
}
set{
OriY = value;
}
}
public void Draw(object shape)
{
}
// 類自身的方法
public void MoveShape(int newX
{
}
}
數組
數組在 C# 中比 C++ 中要高級很多
方括號在類型後面而不是在變量名後面
創建元素使用 new 運算符
C# 支持一維
例子
復制內容到剪貼板
代碼:
int[] array = new int[
for (int i =
array = i;
int[
array
int[
array
int[][] arrayOfarray = new int[
arrayOfarray[
arrayOfarray[
索引器
索引器用於書寫一個可以通過使用 [] 像數組一樣直接訪問集合元素的方法
例子
注意
復制內容到剪貼板
代碼:
class Shapes: CollectionBase
{
public void add(Shape shp)
{
List
}
//indexer
public Shape this[int index]
{
get {
return (Shape) List[index];
}
set {
List[index] = value ;
}
}
}
裝箱/拆箱
裝箱的思想在 C# 中是創新的
例子
復制內容到剪貼板
代碼:
class Test
{
static void Main()
{
int myInt =
object obj = myInt ; // 裝箱
int myInt
}
}
例程展示了裝箱和拆箱兩個過程
函數參數
C# 中的參數有三種類型
如果你有 COM 接口的思想
按值傳遞/輸入參數
值參數的概念和 C++ 中一樣
例子
復制內容到剪貼板
代碼:
SetDay(
void SetDay(int day)
{
}
按引用傳遞/輸入
C++ 中的引用參數是通過指針或引用運算符 & 傳遞的
你不能將未初始化的引用參數傳遞給函數
例子
復制內容到剪貼板
代碼:
int a=
FunctionA(ref a); // 使用 ref
Console
復制內容到剪貼板
代碼:
void FunctionA(ref int Val)
{
int x= Val;
Val = x*
}
輸出參數
輸出參數是只從函數返回值的參數
例子
復制內容到剪貼板
代碼:
int Val;
GetNodeValue(Val);
復制內容到剪貼板
代碼:
bool GetNodeValue(out int Val)
{
Val = value;
return true;
}
參數和數組的數量變化
C# 中的數組使用關鍵字 params 進行傳遞
注意
例子
復制內容到剪貼板
代碼:
void Func(params int[] array)
{
Console
}
復制內容到剪貼板
代碼:
Func(); // 打印
Func(
Func(
Func(new int[] {
int[] array = new int[
Func(array); // 打印
運算符與表達式
運算符和表達式跟 C++ 中完全一致
is 運算符
is 運算符是用於檢查操作數類型是否相等或可以轉換
復制內容到剪貼板
代碼:
void function(object param)
{
if(param is ClassA)
//做要做的事
else if(param is MyStruct)
//做要做的事
}
}
as 運算符
as 運算符檢查操作數的類型是否可轉換或是相等(as 是由 is 運算符完成的)
復制內容到剪貼板
代碼:
Shape shp = new Shape();
Vehicle veh = shp as Vehicle; // 返回 null
Circle cir = new Circle();
Shape shp = cir;
Circle cir
object[] objects = new object[
objects[
object[
string str;
for(int i=
{
str = objects as string;
if(str == null)
Console
else
Console
}
復制內容到剪貼板
代碼:
Output:
Aisha
can not be converted
語句
除了些許附加的新語句和修改外
以下是新的語句
foreach
用於迭代數組等集合
例子
復制內容到剪貼板
代碼:
foreach (string s in array)
Console
lock
在線程中使代碼塊稱為重點部分
(譯注
checked/unchecked
用於數字操作中的溢出檢查
例子
復制內容到剪貼板
代碼:
int x = Int
{
x++; // 異常
}
unchecked
{
x++; // 溢出
}
下面的語句已修改
Switch
Switch 語句在 C# 中修改過
例子
復制內容到剪貼板
代碼:
int var =
switch (var)
{
case
case
}
C++ 的輸出
復制內容到剪貼板
代碼:
<Value is
而在 C# 中你將得到一個編譯時錯誤
復制內容到剪貼板
代碼:
error CS
from one case label (
復制內容到剪貼板
代碼:
switch (var)
{
case
case
}
例子
復制內容到剪貼板
代碼:
const string WeekEnd =
const string WeekDay
string WeekDay = Console
switch (WeekDay )
{
case WeekEnd: Console
case WeekDay
}
委托
委托讓我們可以把函數引用保存在變量中
委托使用關鍵字 delegate 聲明
例子
復制內容到剪貼板
代碼:
delegate int Operation(int val
public int Add(int val
{
return val
}
public int Subtract (int val
{
return val
}
public void Perform()
{
Operation Oper;
Console
string optor = Console
Console
string opnd
string opnd
int val
int val
if (optor ==
Oper = new Operation(Add);
else
Oper = new Operation(Subtract);
Console
}
繼承與多態
C# 只允許單一繼承
例子
復制內容到剪貼板
代碼:
class Parent{
}
class Child : Parent
虛函數
虛函數在 C# 中同樣是用於實現多態的概念的
復制內容到剪貼板
代碼:
class Shape
{
public virtual void Draw()
{
Console
}
}
class Rectangle : Shape
{
public override void Draw()
{
Console
}
}
class Square : Rectangle
{
public override void Draw()
{
Console
}
}
class MainClass
{
static void Main(string[] args)
{
Shape[] shp = new Shape[
Rectangle rect = new Rectangle();
shp[
shp[
shp[
shp[
shp[
shp[
}
}
Output:
Shape
Rectangle
Square
使用
你可以隱藏基類中的函數而在子類中定義其新版本
復制內容到剪貼板
代碼:
class Shape
{
public virtual void Draw()
{
Console
}
}
class Rectangle : Shape
{
public new void Draw()
{
Console
}
}
class Square : Rectangle
{
//這裡不用 override
public new void Draw()
{
Console
}
}
class MainClass
{
static void Main(string[] args)
{
Console
Shape[] shp = new Shape[
Rectangle rect = new Rectangle();
shp[
shp[
shp[
shp[
shp[
shp[
Console
rect
Square sqr = new Square();
sqr
}
}
Output:
Using Polymorphism
Shape
Shape
Shape
Using without Polymorphism:
Rectangle
Square
多態性認為 Rectangle 類的 Draw 方法是和 Shape 類的 Draw 方法不同的另一個方法
注意
調用基類成員
如果子類的數據成員和基類中的有同樣的名字
復制內容到剪貼板
代碼:
public Child(int val) :base(val)
{
myVar =
base
}
OR
public Child(int val)
{
base(val);
myVar =
base
}
前景展望
本文僅僅是作為 C# 語言的一個快速浏覽
以後
From:http://tw.wingwit.com/Article/program/net/201311/13663.html