最简单的C#快速入门

本文概述了C#语言的重要特性,包括迭代数组的foreach循环、线程同步的lock关键字、数字操作的checked/unchecked、switch语句的改进、委托的概念及应用、继承与多态、虚函数的使用、基类成员的调用等。


用于迭代数组等集合。

例子:
复制内容到剪贴板
代码:
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#

转载于:https://www.cnblogs.com/psdesign/archive/2008/08/25/1276004.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值