C#语言初级入门介绍

本文的目的在于为尚未接触过C#的程序员介绍这种编程语言。不论你以前是否用过C/C++或者Java,都可以从本文开始学习C#。本文的唯一假定是你具有某种类型的编程知识(如具有面向对象编程的经验则更好,但并非必须),并拥有某种类型的C#编译器。
最简单的C#程序

首先我们来看标准的Hello World程序。用文本编辑器创建一个新文件HelloWorld.cs,把下面的代码放入这个文件:

// 第一个c#程序

class HelloWorld {
static void Main() {
System.Console.WriteLine("Hello World!");
}
}

现在,在DOS命令窗口进入保存HelloWorld.cs的目录,然后执行:

csc HelloWorld.cs

该命令编译源代码并生成HelloWorld.exe文件。运行这个执行文件就可以看到:
Hello World!

下面我们来分析一下这个例子。第一行代码是一行注释,由“//”开始。和C/C++以及Java一样,“//”告诉编译器忽略该行直至结尾为止的内容。C#中的另外一种注释方法是块注释。块注释由“”结束。

程序中第二个重要的地方是第四行Main()方法的声明(static void Mian(){)。每一个C#程序都包含一个Main方法,它是程序执行的起点和终点。另外还请注意,HelloWorld类的Main()方法定义成了静态(static)方法。程序的Main方法永远不会是全局的,这意味着Main方法必须包含在类里面,如本例中Main()是在类HelloWorld里面(Main方法也可以包含到结构里面,但一般它总是在类里面)。

程序中最后一个关键的地方是向控制台输出文本的代码,即“System.Console.WriteLine("Hello World!");”。WriteLine是一个方法,定义于Console类。WriteLine()把文本输出到标准输出设备并换行。Console类包含在System名称空间(类的集合)里面。如果你想避免用“System.Console”的方式来指出Console类的全称,可以在文件的开头加上“using System;”这行代码,以后就可以直接写出“Console.WriteLine("Hello World!");”。

下面这个例子示范如何创建和使用用户定义的类以及如何创建动态链接库。利用文本编辑器创建两个文件。第一个是Apple.cs,内容如下:
public class Apple {

private string variety = "";

public Apple(string appleVariety) {
this.variety = appleVariety;
}

public void outputVariety() {
System.Console.WriteLine(variety);
}

}

第二个文件是Example2.cs,内容如下:

class Example2 {

static void Main() {
Apple mac = new Apple("Macintosh ");
Apple gra = new Apple("Granny Smith");
Apple cor = new Apple("Cortland");
mac.outputVariety();
gra.outputVariety();
cor.outputVariety();
}
}

首先,我们定义了一个新的用户定义类,名字为Apple。虽然Apple类并不一定要放到独立的文件中,但把每个类都放到自己独立的文件中是一个好的面向对象编程习惯,有助于简化组织和管理。我们为Apple类的声明加上了public修饰符(public class Apple),这样其他类就可以创建Apple类的实例。

下一行代码定义了实例变量variety。使用了修饰符private之后,只有在Apple类的内部才可以直接访问variety变量。这是一种常见的面向对象编程习惯,称为封装。封装之后,对象的工作细节对于对象的用户来说就隐藏不可见了。你现在正使用的键盘就是封装在现实世界中一个很好的例子。我们并不完全了解键击如何发送到控制器(我们之中的大多数都不知道),但只要理解它的接口如何运作就可以了。例如我们知道,打开文本编辑器,按下键盘上的“&”键,“&”字符就会出现在屏幕上。如果每一个人都必须了解键盘的工作细节而不是只要了解它的接口,我们之中不会有很多人使用它。

接下来的三行代码是:

public Apple(string appleVariety) {
this.variety = variety;
}

这三行代码定义了Apple类的构造函数。类的构造函数类似一个描述如何创建类实例的蓝图。我们能够很容易地将构造函数和类里面的其他方法区分开来,因为构造函数总是和类具有相同的名字。在本例中,类Apple的构造函数有一个字符串参数,这个参数值随后被保存到实例变量variety。

Apple类的最后一个方法是outputVariety()。这个方法为访问实例变量提供了接口,所以称为存取方法(Accessor Method)。

下面我们来看Example2类。这个例子与前文例子的区别在于要创建并使用用户定义类Apple的实例。我们用new操作符创建了三个Apple类的实例。创建类的实例时,我们无需显式地调用类的构造函数,new操作符将自动为我们调用类的构造函数。创建了三个Apple类的对象之后,我们依次调用这三个对象的outputVariety方法,由outputVariety方法输出这三个对象里variety的值。

下面我们来编译和运行这个例子。首先我们要把Apple类编译成动态链接库,命令如下:

csc /target:library Apple.cs

/target:library表示不要创建执行文件,而是创建一个.dll文件(即动态链接库)。所以,上面的命令将生成一个Apple.dll文件。

接下来我们编译Example2.cs,编译命令如下所示:

csc /reference:Apple.dll Example2.cs

现在我们得到了执行文件Example2.exe。执行这个文件可以在控制台上看到如下输出:

Macintosh
Granny Smith
Cortland

在这最后一个例子中,我们来看看C#的抽象和多态性。首先我们来定义一下这两个新的术语。抽象(Abstract)通过从多个对象提取出公共部分并把它们并入单独的抽象类中实现。在本例中我们将创建一个抽象类Shape(形状)。每一个形状都拥有返回其颜色的方法,不论是正方形还是圆形、长方形,返回颜色的方法总是相同的,因此这个方法可以提取出来放入父类Shape。这样,如果我们有10个不同的形状需要有返回颜色的方法,现在只需在父类中创建一个方法。可以看到使用抽象使得代码更加简短。

  在面向对象编程领域中,多态性(Polymorphism)是对象或者方法根据类的不同而作出不同行为的能力。在下面这个例子中,抽象类Shape有一个getArea()方法,针对不同的形状(圆形、正方形或者长方形)它具有不同的功能。

   下面是代码:

public abstract class Shape {
protected string color;
public Shape(string color) {
this.color = color;
}
public string getColor() {
return color;
}
public abstract double getArea();
}

public class Circle : Shape {
private double radius;
public Circle(string color, double radius) : base(color) {
this.radius = radius;
}
public override double getArea() {
return System.Math.PI * radius * radius;
}
}

public class Square : Shape {
private double sideLen;
public Square(string color, double sideLen) : base(color) {
this.sideLen = sideLen;
}
public override double getArea() {
return sideLen * sideLen;
}
}

public class Example3
{
static void Main()
{
Shape myCircle = new Circle("orange", 3);
Shape myRectangle = new Rectangle("red", 8, 4);
Shape mySquare = new Square("green", 4);
System.Console.WriteLine("圆的颜色是" + myCircle.getColor()
+ "它的面积是" + myCircle.getArea() + ".");
System.Console.WriteLine("长方形的颜色是" + myRectangle.getColor()
+ "它的面积是" + myRectangle.getArea() + ".");
System.Console.WriteLine("正方形的颜色是" + mySquare.getColor()
+ "它的面积是" + mySquare.getArea() + ".");
}
}

我们创建的第一个类是Shape。这是一个抽象类,因为我们不想创建这个类的实例,我们要创建的是它的派生类的实例。我们从所有的形状(圆、长方形、正方形)提取出共同特征到Shape类。Shape类有一个实例变量color,它的变量声明中带有protected修饰符。protected修饰符表示这个变量只能在类的内部或者该类的派生类中访问。紧接这个变量声明的就是Shape类的构造函数和存取方法getColor(),这两个方法都没有什么新的东西。最后一个方法getArea()加上了abstract修饰符,这是因为每一种不同的形状都有不同的面积计算方法,因此这个方法必须由各种形状自己来定义。

  接下来的三个类Circle、Rectangle和Square都从Shape类派生,它们都具有Shape所描述的特征。这可以从它们的定义中看出来,它们的声明中都带有“public class:Shape {”,这个“: Shape”就表示当前的类从Shape类派生。由于这三个类都从Shape派生,它们自动拥有Shape中定义的所有public或者protected实例变量,即Circle、 Rectangle和Square包含了实例变量color。

  每一个Sharp的派生类都有自己的构造函数,负责调用父类Shape的构造函数设置公共的实例变量(color)以及设置自己特有的实例变量。例如“public Circle(string color, double radius) : base(color)”这个语句中,“: base(color)”就表示用参数color调用父类的构造函数。

  最后我们来看一下getArea()方法,它是一个多态性的示范。所有形状都有getArea()方法,但是根据对象是圆、长方形还是正方形,具体调用的方法也不同。

  要运行这个例子,先把所有文件保存到同一目录,然后执行下面的命令:

csc /target:library /out:Shapes.dll
Shapes.cs Circle.cs Rectangle.cs Square.cs

   然后执行:

csc /reference:Shapes.dll Example3.cs

   现在,如果我们运行Example3.exe,将得到如下输出:

圆的颜色是orange它的面积是28.274333882308138.
正方形的颜色是green它的面积是16.
长方形的颜色是red 它的面积是32.

(0)

相关推荐

  • C#语言初级入门介绍

    本文的目的在于为尚未接触过C#的程序员介绍这种编程语言.不论你以前是否用过C/C++或者Java,都可以从本文开始学习C#.本文的唯一假定是你具有某种类型的编程知识(如具有面向对象编程的经验则更好,但并非必须),并拥有某种类型的C#编译器. 最简单的C#程序 首先我们来看标准的Hello World程序.用文本编辑器创建一个新文件HelloWorld.cs,把下面的代码放入这个文件: // 第一个c#程序 class HelloWorld { static void Main() { Syste

  • C语言循环控制入门介绍

    目录 循环控制: for 循环 while 循环 do while 循环 switch case break: continue: break continue 区别: 总结 循环控制: for 循环 for (语句1; 表达式; 语句2) { 语句块 } 1)循环开始时,先执行语句1. 2)接着判断表达式的条件,如果条件成立,就执行一次循环体中的语句块. 3)语句块执行完后,接下来会执行语句2. 4)重复第2)步和第3),直到表达式的条件不成立才结束for循环. 常见形式: for (int

  • Vue.js双向绑定操作技巧(初级入门)

    首先在页面引入vue.js以及其他需要用到的或者可能要用到的插件(这里我多引用了bootstrap和jquery) 引用的时候需要注意文件的路径,准备工作这样基本就完成了,下面正式开始入门. vue.js最重要的一个特点就是双向数据绑定也就是我们常说的MVVM:Model-View-ViewModel.我们要实现双向绑定首先当然要有"双向",这里vue.js为我们提供了View层和Model层.View层就是在HTML中的代码,Model层则是Javascript代码. 下面是一个最基

  • Ruby入门介绍第1/5页

    一.方法 Ruby 的方法定义允许为参数设置默认值,不过在带有默认值的参数后面不能出现不带有默认值的参数(允许 * 和 &),也就是说下面的方法定义是不被允许的,解释时会出现 parse error. 还有一点与 C# 不同的是,方法定义不能出现在方法调用的后面. # parse error def Display(args1="proshea", args2) end # 允许 def Display(args1="proshea", *args2) en

  • C语言指针入门的简单实例教程

    c语言的指针的存在使得c语言对硬件的操控,以及灵活性得到了极大的提高. 但是指针的使用存在着很多难点问题. #include<stdlib.h> #include<stdio.h> //这里的函数是指针做参数的例子,要知道这个特性可以弥补c语言只能有一个返回值的特性. void swap1(int *pa,int *pb){ int t =*pa; *pa=*pb; *pb=t; } //main()函数必须要返回一个数字 int main(){ int a =15; int b=

  • ActiveMQ的简单入门介绍与使用

    一.什么是消息中间件 消息中间件顾名思义实现的就是在两个系统或两个客户端之间进行消息传送 二.什么是ActiveMQ ActiveMQ是一种开源的基于JMS(Java Message Servie)规范的一种消息中间件的实现,ActiveMQ的设计目标是提供标准的,面向消息的,能够跨越多语言和多系统的应用集成消息通信中间件. 三.什么时候需要用ActiveMQ ActiveMQ常被应用与系统业务的解耦,异步消息的推送,增加系统并发量,提高用户体验.例如以我在工作中的使用,在比较耗时且异步的远程开

  • C语言新手入门速通手册

    目录 前言 一.常量 二.字符串 三.转义字符 四.注释 五.选择语句 六.循环语句 七.函数 八.数组 总结 前言 本文讲解了初识C语言中的常量,字符串,转义字符,注释,选择与循环语句,函数与数组,因为是初识,所以都是点到为止 一.常量 顾名思义,常量就是不会发生改变的值,C语言中的常量分为以下几种: 字面常量 const修饰的常变量 #define定义的标识符常量 枚举常量 代码说明: #include<stdio.h> //字面常量 int main() { 30; 3.14; 'w';

  • MySQL初级入门篇之视图的相关概念及应用实例

    目录 1.浅谈数据库对象 2.什么是视图? 3.视图操作相关SQL 4.视图实操SQL 5.视图的优缺点 总结 1.浅谈数据库对象 2.什么是视图? 视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图.比如,针对一个公司的销售人员,我们只想给他看部分数据,而某些特殊的数据,比如采购的 价格,则不会提供给他.再比如,人员薪酬是个敏感的字段,那么只给某个级别以上的人员开放,其他 人的查询视图中则不提供这个字段.视图是一种 虚拟表 ,本身是 不具有数据 的

  • C语言堆栈入门指南

    C语言堆栈入门指南 在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念.堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈.我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方请朋友们不吝赐教,这对于大家学习会有很大帮助. 首先在数据结构上要知道堆栈,尽管我们这么称呼它,

  • MyBatis入门介绍(超简单)

    MyBatis 简介 MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis.MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects

随机推荐