您的位置:首页 > 编程语言 > C#

最简单的C#快速入门

2008-08-25 18:36 417 查看
用于迭代数组等集合。

例子:

复制内容到剪贴板

代码:

foreach (string s in array)

Console.WriteLine(s);

lock

在线程中使代码块称为重点部分。

(译注:lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。)

checked/unchecked

用于数字操作中的溢出检查。

例子:

复制内容到剪贴板

代码:

int x = Int32.MaxValue; x++; // 溢出检查

{

x++; // 异常

}

unchecked

{

x++; // 溢出

}

下面的语句已修改:(译注:原文如此,疑为作者笔误)

Switch

Switch 语句在 C# 中修改过。

1.现在在执行一条 case 语句后,程序流不能跳至下一 case 语句。之前在 C++ 中这是可以的。

例子:

复制内容到剪贴板

代码:

int var = 100;

switch (var)

{

case 100: Console.WriteLine("<Value is 100>"); // 这里没有 break

case 200: Console.WriteLine("<Value is 200>"); break;

}

C++ 的输出:

复制内容到剪贴板

代码:

<Value is 100><Value is 200>

而在 C# 中你将得到一个编译时错误:

复制内容到剪贴板

代码:

error CS0163: Control cannot fall through

from one case label ('case 100:') to another

2.然而你可以像在 C++ 中一样这么用:

复制内容到剪贴板

代码:

switch (var)

{

case 100:

case 200: Console.WriteLine("100 or 200<VALUE is 200>"); break;

}

3.你还可以用常数变量作为 case 值:

例子:

复制内容到剪贴板

代码:

const string WeekEnd = "Sunday";

const string WeekDay1 = "Monday";

....

string WeekDay = Console.ReadLine();

switch (WeekDay )

{

case WeekEnd: Console.WriteLine("It's weekend!!"); break;

case WeekDay1: Console.WriteLine("It's Monday"); break;

}

委托

委托让我们可以把函数引用保存在变量中。这就像在 C++ 中使用 typedef 保存函数指针一样。

委托使用关键字 delegate 声明。看看这个例子,你就能理解什么是委托:

例子:

复制内容到剪贴板

代码:

delegate int Operation(int val1, int val2);

public int Add(int val1, int val2)

{

return val1 + val2;

}

public int Subtract (int val1, int val2)

{

return val1- val2;

}

public void Perform()

{

Operation Oper;

Console.WriteLine("Enter + or - ");

string optor = Console.ReadLine();

Console.WriteLine("Enter 2 operands");

string opnd1 = Console.ReadLine();

string opnd2 = Console.ReadLine();

int val1 = Convert.ToInt32 (opnd1);

int val2 = Convert.ToInt32 (opnd2);

if (optor == "+")

Oper = new Operation(Add);

else

Oper = new Operation(Subtract);

Console.WriteLine(" Result = {0}", Oper(val1, val2));

}

继承与多态

C# 只允许单一继承。多重继承可以通过接口达到。

例子:

复制内容到剪贴板

代码:

class Parent{

}

class Child : Parent

虚函数

虚函数在 C# 中同样是用于实现多态的概念的,除了你要使用 override 关键字在子类中实现虚函数外。父类使用同样的 virtual 关键字。每个重写虚函数的类都使用 override 关键字。(译注:作者所说的“同样”,“除……外”都是针对 C# 和 C++ 而言的)

复制内容到剪贴板

代码:

class Shape

{

public virtual void Draw()

{

Console.WriteLine("Shape.Draw") ;

}

}

class Rectangle : Shape

{

public override void Draw()

{

Console.WriteLine("Rectangle.Draw");

}

}

class Square : Rectangle

{

public override void Draw()

{

Console.WriteLine("Square.Draw");

}

}

class MainClass

{

static void Main(string[] args)

{

Shape[] shp = new Shape[3];

Rectangle rect = new Rectangle();

shp[0] = new Shape();

shp[1] = rect;

shp[2] = new Square();

shp[0].Draw();

shp[1].Draw();

shp[2].Draw();

}

}

Output:

Shape.Draw

Rectangle.Draw

Square.Draw

使用“new”隐藏父类函数

你可以隐藏基类中的函数而在子类中定义其新版本。关键字 new 用于声明新的版本。思考下面的例子,该例是上一例子的修改版本。注意输出,我用 关键字 new 替换了 Rectangle 类中的关键字 override。

复制内容到剪贴板

代码:

class Shape

{

public virtual void Draw()

{

Console.WriteLine("Shape.Draw") ;

}

}

class Rectangle : Shape

{

public new void Draw()

{

Console.WriteLine("Rectangle.Draw");

}

}

class Square : Rectangle

{

//这里不用 override

public new void Draw()

{

Console.WriteLine("Square.Draw");

}

}

class MainClass

{

static void Main(string[] args)

{

Console.WriteLine("Using Polymorphism:");

Shape[] shp = new Shape[3];

Rectangle rect = new Rectangle();

shp[0] = new Shape();

shp[1] = rect;

shp[2] = new Square();

shp[0].Draw();

shp[1].Draw();

shp[2].Draw();

Console.WriteLine("Using without Polymorphism:");

rect.Draw();

Square sqr = new Square();

sqr.Draw();

}

}

Output:

Using Polymorphism

Shape.Draw

Shape.Draw

Shape.Draw

Using without Polymorphism:

Rectangle.Draw

Square.Draw

多态性认为 Rectangle 类的 Draw 方法是和 Shape 类的 Draw 方法不同的另一个方法,而不是认为是其多态实现。所以为了防止父类和子类间的命名冲突,我们只有使用 new 修饰符。

注意:你不能在一个类中使用一个方法的两个版本,一个用 new 修饰符,另一个用 override 或 virtual。就像在上面的例子中,我不能在 Rectangle 类中增加另一个名为 Draw 的方法,因为它是一个 virtual 或 override 的方法。同样在 Square 类中,我也不能重写 Shape 类的虚方法 Draw。

调用基类成员

如果子类的数据成员和基类中的有同样的名字,为了避免命名冲突,基类成员和函数使用 base 关键字进行访问。看看下面的例子,基类构造函数是如何调用的,而数据成员又是如何使用的。

复制内容到剪贴板

代码:

public Child(int val) :base(val)

{

myVar = 5;

base.myVar;

}

OR

public Child(int val)

{

base(val);

myVar = 5 ;

base.myVar;

}

前景展望

本文仅仅是作为 C# 语言的一个快速浏览,以便你可以熟悉该语言的一些特性。尽管我尝试用实例以一种简短而全面的方式讨论了 C# 几乎所有的主要概念,但我认为还是有很多内容需要增加和讨论的。

以后,我会增加更多的没有讨论过的命令和概念,包括事件等。我还想给初学者写一下怎么用 C# 进行 Windows 编程。

参考文献:

我们都知道的 MSDN

Tom Archer 著,Inside C#

Eric Gunnerson 著,A Programmer's Introduction to C#

Karli Watson 著,Beginning C#

O'Reilly(奥莱利出版),Programming C#
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: