一,简介
C# 是一个现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的,由
Ecma
和ISO
核准认可的。
C# 是专为公共语言基础结构(CLI)设计的。CLI
由可执行代码和运行时环境组成,允许在不同的计算机平台和体系结构上使用各种高级语言。
C# 成为一种广泛应用的专业语言的原因有以下几点:
- 现代的、通用的编程语言。
- 面向对象
- 面向组件
- 容易学习
- 结构化语言
- 可以产生高效率的程序
- 可以在多种计算机平台上编译
- .Net 框架的一部分。
C# 强大的编程功能
虽然 C# 的构想十分接近于传统高级语言 C
和 C++
,是一门面向对象的编程语言,但是它与 Java
非常相似,有许多强大的编程功能
下面列出 C# 一些重要的功能:
- 布尔条件(Boolean Conditions)
- 自动垃圾回收(Automatic Garbage Collection)
- 标准库(Standard Library)
- 组件版本(Assembly Versioning)
- 属性(Properties)和事件(Events)
- 委托(Delegates)和事件管理(Events Management)
- 易于使用的泛型(Generics)
- 索引器(Indexers)
- 条件编译(Conditional Compilation)
- 简单的多线程(Multithreading)
- LINQ 和 Lambda 表达式
- 集成 Windows
二,环境
C# 是 .Net
框架的一部分,且用于编写 .Net
应用程序。
.Net 框架(.Net Framework)
.Net
框架是一个创新的平台,可以编写出下面类型的应用程序:
- Windows 应用程序
- Web 应用程序
- Web 服务
.Net
框架应用程序是多平台的应用程序。框架的设计方式使它适用于下列各种语言:
C#、C++、Visual Basic、Jscript、COBOL 等等。
所有这些语言可以访问框架,彼此之间也可以互相交互。
.Net
框架由一个巨大的代码库组成,用于 C# 等客户端语言。下面列出一些 .Net 框架的组件:
- 公共语言运行库(Common Language Runtime - CLR)
- .Net 框架类库(.Net Framework Class Library)
- 公共语言规范(Common Language Specification)
- 通用类型系统(Common Type System)
- 元数据(Metadata)和组件(Assemblies)
- Windows 窗体(Windows Forms)
- ASP.Net 和 ASP.Net AJAX
- ADO.Net
- Windows 工作流基础(Windows Workflow Foundation - WF)
- Windows 显示基础(Windows Presentation Foundation)
- Windows 通信基础(Windows Communication Foundation - WCF)
- LINQ
C# 编程的开发工具
C# 的集成开发环境(Integrated Development Environment - IDE)
微软(Microsoft)提供了下列用于 C# 编程的开发工具:
- Visual Studio (VS) (推荐)
- Visual C# 2010 Express (VCE)
- Visual Web Developer
在 Linux 或 Mac OS 上编写 C# 程序
虽然 .NET 框架是运行在 Windows 操作系统上,但是也有一些运行于其它操作系统上的版本可供选择。Mono
是 .NET 框架的一个开源版本,它包含了一个 C# 编译器,且可运行于多种操作系统上,比如各种版本的 Linux
和 Mac OS
。
Mono
的目的不仅仅是跨平台地运行微软 .NET 应用程序,而且也为 Linux
开发者提供了更好的开发工具。Mono
可运行在多种操作系统上,包括 Android、BSD、iOS、Linux、OS X、Windows、Solaris 和 UNIX。
三,基本语法
执行 C# 代码的过程包括下列步骤:
1.选择编译器
2.将代码编译为 MSIL
3.将MSIL
编译为本机代码
4.运行代码
5.垃圾回收
注:MSIL
包括用于加载,存储和初始化对象以及对对象调用方法的指令,还包括用于算术和逻辑运算,控制流,直接内存访问,异常处理和其他操作的指令。
在面向对象的编程方法中:
- 类和对象是核心
- 对象由类建模而成
- 把类转换为对象的过程称为类的实例化
- 对象是消息,数据和行为的组合
- 对象代表一个实实在在存在的实体(实际物体)或者实际概念
- 对象往往有边界,有属性,有方法(特定用途)
面向对象的程序设计思想是现代软件开发的基础
面向对象的程序由各种各样的类,对象和方法组成
一般而言,对象具有一下特性:
- 对象有状态,对象的状态由对象的各种属性和相应值构成
- 对象可以显示行为(即方法),对象的行为(方法)使对象可以完成相应功能
- 对象有一个唯一的身份,对象的身份可以把它与其他对象区分开来
(两个对象可能什么都相同,但是它们不可能有相同的身份)
各种定义
using 关键字:用于在程序中包含命名空间。一个程序可以包含多个 using 语句。在任何 C# 程序中的第一条语句都是:
using System;
class 关键字:用于声明一个类。
注释:用于解释代码,编译器会忽略注释的条目。在 C# 程序中,多行注释以 /* 开始,并以字符 */ 终止;单行注释是用 ‘//’ 符号表示。
C# 中 // 注释和 /// 注的区别::C# 引入了新的 XML 注释,即我们在某个函数前新起一行,输入 ///,VS.Net 会自动增加 XML 格式的注释
// 不会被编译,而 /// 会被编译
所以使用 /// 会减慢编译速度(但不会影响执行速度)
但使用 /// 会在其它的人调用你的代码时提供智能感知(通常在Form。Designer.cs 窗口会自动生成 /// 注释的程序)
成员变量:变量是类的属性或数据成员,用于存储数据。
成员函数:函数是一系列执行指定任务的语句。类的成员函数是在类内声明的。
C# 类的实例化:通过已有的类(class)创建出该类的一个对象(object),这一过程就叫做类的实例化。
标识符:标识符是用来识别类、变量、函数或任何其它用户定义的项目。在 C# 中,类的命名必须遵循如下基本规则:
- 标识符必须以字母开头,后面可以跟一系列的字母、数字( 0 - 9 )或下划线( _ )。
- 标识符中的第一个字符不能是数字。
- 标识符必须不包含任何嵌入的空格或符号,比如 ? - +! @ # % ^ & * ( ) [ ] { } . ; : " ’ / \。但是,可以使用下划线( _ )。
- 标识符不能是 C# 关键字。
C# 关键字:关键字是 C# 编译器预定义的保留字。这些关键字不能用作标识符,但是,如果想使用这些关键字作为标识符,可以在关键字前面加上@
字符作为前缀。在 C# 中,有些标识符在代码的上下文中有特殊的意义,如 get 和 set,这些被称为上下文关键字(contextual keywords)。
下表列出了 C# 中的保留关键字(Reserved Keywords)和上下文关键字(Contextual Keywords):
保留关键字列表
abstract | as | base | bool | break | byte | case |
---|---|---|---|---|---|---|
catch | char | checked | class | const | continue | decimal |
default | delegate | do | double | else | enum | event |
explicit | extern | false | finally | fixed | float | for |
foreach | goto | if | implicit | in | in (generic modifier) | int |
interface | internal | is | lock | long | namespace | new |
null | object | operator | out | out(generic modifier) | override | params |
private | protected | public | readonly | ref | return | sbyte |
sealed | short | sizeof | stackalloc | static | string | struct |
switch | this | throw | true | try | typeof | uint |
ulong | unchecked | unsafe | ushort | using | virtual | void |
volatile | while |
上下文关键字列表
add | alias | ascending | descending | dynamic | from | get |
---|---|---|---|---|---|---|
global | group | into | join | let | orderby | partial (type) |
partial (method) | remove | select | set |
字段:属性在类的声明中用变量表示,这样的变量称为字段(field)。
字段是在类声明的内部声明的,但是位于类的方法声明体之外。当类的每个对象维护自己的属性副本时,代表属性的字段又称为实例变量。
方法(Method):描述了类实际执行任务的机制,从形式上看,相当于C语言的函数
字段和方法都具有访问权限,主要为代码的安全考虑
通常有 3 种访问权限:private(私有的), public(公共的), protected(保护的)
使用权限:
- private 修饰的字段或者方法只允许在类的内部使用
- public 修饰的字段或者方法则没有什么限制,从类的外部可以直接使用
- protected 修饰的字段和方法可以在派生类中使用
命名空间:namespace中文多翻译为名字空间(或者命名空间)。
名字空间是用来组织和重用代码的编译单元,所谓namespace,是指标识符的各种可见范围。
System(名字空间).Console(类名).WriteLine(方法名)(“hello”)(要输出的函数参数);
在名字的开头使用 using 语句表示引用该名字空间,在代码书写中可以省略名字空间 。namespace
是 C# 的一个关键字,实际上,它只是起到标识作用,把需要的内容放到一起,细化管理,也可以定义自己的命名空间。
在新建C#项目时,会自动地把所有的东西放到一个新的名字空间里,这个名字空间默认的名字就是项目的名字
Main():一个项目可以就是你开发的一个软件,从扩展名来看,应用程序都会编译为一个 .exe 文件,既然是.exe文件,就表明它是可以被执行的。表现在程序中,这些应用程序都有一个主程序入口点,即Main()。
而类库,Windows控件等,则没有这个入口点,所以不能直接执行,而仅提供一些功能,给其他项目调用。这样的程序后缀名为 .dll
Visual Studio除了建立了一个控制台项目之外,该项目同时还属于一个解决方案
现在以下面这段代码为例找找这四种分别是什么:
- 类
- 字段
- 方法
- 主函数
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace liti
{
class Program
{
static void Main(string[] args) //主函数
{
MyClass haha = new MyClass(); //创建新的类的实例
haha.SayHello(); //执行类里面的方法
}
}
class MyClass //类,MyClass是类名,可以自己命名,需要符合标识符的规定
{
private int x; //成员字段,可以存储一个数据
//因为使用权限是private,所以不可以在主函数里不可访问x
public void SayHello() //成员方法,相当于c语言里的函数
//因为使用权限是public,所以可以在主函数里可以访问SayHello
{
Console.WriteLine("hello world!");
}
}
}
输入和输出
在一行输入一个数据,求两个数的和
- Console.Read():在一行输入一个字符
- Console.ReadLine():在一行输入一串字符
- Console.Write():输出时不换行
- Console.WriteLine():输出时换行
using System;
namespace liti
{
class Program
{
static void Main(string[] args)
{
//在一行输入一个数据
//Console.Read(); //读取一个字符
string s = Console.ReadLine(); //读取一行字符
int x = Convert.ToInt32(s); //将字符串转换为整数
s = Console.ReadLine();
int y = Convert.ToInt32(s); //必须手动转换
int z = x + y;
//Console.Write(z); //输出后不换行
Console.WriteLine(z); //输出后自动换行
//z会自动转换为字符输出
}
}
}
在一行输入多个数据,并求和
- ss1 = s1.Split(’ '):将输入的数据根据空格分解为子串
- Console.WriteLine(“和是{0}”, sum):带格式输出
using System;
namespace liti
{
class Program
{
static void Main(string[] args)
{
//在一行输入多个数据
string s1 = Console.ReadLine(); //输入数据,中间用空格隔开
string[] ss1 = s1.Split(' '); //Split方法表示按括号内分隔符拆分字符串
//s1 是一个类,类中有很多方法,比如Split方法
double[] a = new double[ss1.Length]; //分配新的空间
double sum = 0;
for (int i = 0; i < ss1.Length; i++)
{
a[i] = Convert.ToDouble(ss1[i]); //将字符串转换为double型
sum = sum + a[i]; //求和
}
Console.WriteLine(sum);
//带格式输出
Console.WriteLine("和是{0}", sum); //大括号里的数必须从0开始
}
}
}
类型转换
类型转换是把数据从一种类型转换为另一种类型。在 C# 中,类型转换有两种形式:
- 隐式类型转换 这些转换是 C# 默认的以安全方式进行的转换。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
- 显式类型转换 这些转换是通过用户使用预定义的函数显示完成的。显式转换需要强制转换运算符。
C# 提供了下列内置的类型转换方法:
序号 | 方法 | 描述 |
---|---|---|
1 | ToBoolean | 如果可能的话,把类型转换为布尔型。 |
2 | ToByte | 把类型转换为字节类型。 |
3 | ToChar | 如果可能的话,把类型转换为单个 Unicode 字符类型。 |
4 | ToDateTime | 把类型(整数或字符串类型)转换为日期-时间结构。 |
5 | ToDecimal | 把浮点型或整数类型转换为十进制类型。 |
6 | ToDouble | 把类型转换为双精度浮点型。 |
7 | ToInt16 | 把类型转换为 16 位整数类型。 |
8 | ToInt32 | 把类型转换为 32 位整数类型。 |
9 | ToInt64 | 把类型转换为 64 位整数类型。 |
10 | ToSbyte | 把类型转换为有符号字节类型。 |
11 | ToSingle | 把类型转换为小浮点数类型。 |
12 | ToString | 把类型转换为字符串类型。 |
13 | ToType | 把类型转换为指定类型。 |
14 | ToUInt16 | 把类型转换为 16 位无符号整数类型。 |
15 | ToUInt32 | 把类型转换为 32 位无符号整数类型。 |
16 | ToUInt64 | 把类型转换为 64 位无符号整数类型。 |
四, 数据类型
在 C# 中,变量分为以下几种类型:
- 值类型(Value types)
- 引用类型(Reference types)
- 指针类型(Pointer types)
值类型
值类型变量可以直接分配给其一个值。它们是从类 System.ValueType 中派生的。值类型直接包含数据。比如 int、char、float,它们分别存储数字、字母和浮点数。当声明一个 int 类型的变量时,系统将会分配内存来存储它的值。
如需得到一个类型或一个变量在特定平台上的准确大小,可以使用 sizeof
方法。表达式 sizeof(type) 产生以字节为单位存储对象或类型的存储尺寸。
引用类型
引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。
换句话说,它们指向的是一个内存位置。使用多重变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由多重变量之中的一个改变的,其他变量会自动相应这种值的变化。例如,内置的引用类型有:object、dynamic 和 string。
对象类型
对象类型是 C# 通用类型系统(CTS)中所有数据类型基类。 Object 是 System.Object 类的别名。对象类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。
当一个值类型转换为对象类型时,则被称为装箱;另一方面,当一个对象类型转换为值类型时,则被称为拆箱。
object obj;
obj = 100; // 这是装箱
动态类型
可以在动态数据类型变量中存储任何类型的值。这些变量的类型检查是在运行时进行的。
声明动态类型的语法:
dynamic <variable_name> = value;
例如:
dynamic d = 20;
动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时进行的,而动态类型变量的类型检查是在运行时进行的。
字符串类型
字符串类型允许给变量分配任何字符串值。字符串类型是 System.String 类的别名。它是从对象类型派生的。字符串类型的值可以通过两种形式进行分配:引号和 @ 引号。
指针类型
指针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针有相同的功能。
char* cptr; //声明指针
int* iptr;
根据代码了解下列知识:
- 变量的声明
- 表达式
- 值变量
- 引用变量
int x