C# 是一个简单的、现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的。
————————————————————————————–
C#简介
C# 是一个现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的,由 Ecma 和 ISO 核准认可的。
C# 是由 Anders Hejlsberg 和他的团队在 .Net 框架开发期间开发的。
C# 是专为公共语言基础结构(CLI)设计的。CLI 由可执行代码和运行时环境组成,允许在不同的计算机平台和体系结构上使用各种高级语言。
C# 强大的编程功能
- 布尔条件(Boolean Conditions)
- 自动垃圾回收(Automatic Garbage Collection)
- 标准库(Standard Library)
- 组件版本(Assembly Versioning)
- 属性(Properties)和事件(Events)
- 委托(Delegates)和事件管理(Events Management)
- 易于使用的泛型(Generics)
- 索引器(Indexers)
- 条件编译(Conditional Compilation)
- 简单的多线程(Multithreading)
- LINQ 和 Lambda表达式
- 集成Windows
————————————————————————————–
C# 环境
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# 的集成开发环境(Integrated Development Environment —— IDE)
- Visual Studio 2010 (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# 程序结构
C# Hello World 实例
一个C#程序主要包括以下部分:
- 命名空间声明(Namespace declaration)
- 一个 class
- Class 方法
- Class 属性
- 一个 Main 方法
- 语句(Statements)& 表达式(Expression)
- 注释
下面是一个可以打印出“hello world”的简单的代码
using System;
namespace HelloWorldApplication
{
class HelloWorld
{
static void Main(string args)
{
/*我的第一个C#程序*/
Console.WriteLine("Hello World");
Console.ReadKey();
}
}
}
分析程序的各个部分:
程序的第一行using System; using 关键字用于在程序中包含 System 命名空间。 一个程序一般有多个 using 语句
下一行是namespace声明。一个namespace是一系列的类。
HelloWorldApplication命名空间包含了类HelloWorld。下一行是class 声明。类HelloWorld包含了程序使用的数据和方法声明。类一般包含多个方法,方法定义了类的行为。在这里HelloWorld类只有一个Main方法。
下一行定义了Main方法,是所有C#程序的入口点。Main方法说明当执行时, 类将做什么动作。
下一行/……/将会被编译器忽略,且它会在程序中添加额外的注释。
Main方法通过语句Console.WriteLine (“Hello World”);指定了它的行为。
- 最后一行Console.ReadKey();是针对VS.Net用户的,这使得程序会等待一个按键的动作,防止程序从Visual Studio.Net启动时屏幕会快速运行并关闭
1、命名空间(namespace)的作用就好比分地盘,便于集中管理。
2、c#是完全面向对象的语言,所有对象的类型定义都必须是在某个命名空间下定义,所有的方法都必须包含在类型定义中。
3、C#中的类是利用命名空间组织起来的。命名空间提供了一种从逻辑上组织类的方式,防止命名冲突。
4、命名空间声明——用 namespace 关键字用于声明一个命名空间。此命名空间范围允许您组织代码并为您提供了创建全局唯一类型的方法
5、namespace name { 类型定义 } 其中:在命名空间中,可以声明类、接口、结构、枚举、委托 命名空间。
————————————————————————————–
编译 & 执行 C# 程序
- 使用 Visual Studio.Net 编译和执行 C# 程序
- 使用sharpdevelop(精简)
- 命令行编译
- 文本编辑器编辑,保存为HelloWorld.cs
- 命令提示符工具中运行csc HelloWorld.cs,生成exe文件
- 输入HelloWorld.exe
————————————————————————————–
C# 基本语法
C# 是一种面向对象的编程语言。在面向对象的程序设计方法中,程序由各种相互交互的对象组成。相同种类的对象通常具有相同的类型,或者说,是在相同的 class 中。
例如,以 Rectangle(矩形)对象为例。它具有 length 和 width 属性。根据设计,它可能需要接受这些属性值、计算面积和显示细节。
让我们来看看一个 Rectangle(矩形)类的实现,并借此讨论 C# 的基本语法:
using System;
namespace RectangleApplication
{
class Rectangle
{
//成员变量
double length;
double width;
public void Acceptdetails()
{
length = 4.5;
width = 3.5;
}
public double GetArea()
{
return length * width;
}
public void Display()
{
Console.WriteLine("Length:{0}", length);
Console.WriteLine("Width:{0}", width);
Console.WriteLine("Area:{0}", GetArea());
}
}
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
r.Acceptdetails();
r.Display();
r.GetArea();
Console.ReadLine();
}
}
}
using 关键字
在任何C#程序中第一条语句都是 using System;
using 关键字用于在程序中包含命名空间,一个程序可以包含多个using语句。
class 关键字
class 关键字用于声明一个类
成员变量
变量是类的属性或数据成员,用于存储数据。在上面的程序中,Rectangle类有两个成员变量,名为length 和 width
成员函数
函数是一系列执行指定任务的语句,类的成员函数是在类内声明的。上述程序中包含了三个成员函数:AcceptDetails( )、GetArea( )、Display( )
实例化一个类
类ExecuteRectangle 是一个包含Main( )方法和实例化Rectangle类的类
标识符
标识符是用来识别类、变量、函数或任何其它用户定义的项目。
C# 关键字
在 C# 中,有些标识符在代码的上下文中有特殊的意义,如 get 和 set,这些被称为上下文关键字(contextual keywords)。
下表列出了 C# 中的保留关键字(Reserved Keywords)和上下文关键字(Contextual Keywords):
————————————————————————————–
C# 数据类型
在 C# 中变量分为以下几种类型:
- 值类型(Value types)
- 引用类型(Reference types)
- 指针类型(Pointer types)
值类型(Value types)
值类型变量可以直接分配给一个值。它们是从类 System.ValueType 中派生的。
值类型直接包含数据。比如 int、char、float,它们分别存储数字、字母、浮点数。当您声明一个 int 类型时,系统分配内存来存储值。
下表列出了 C# 2010 中可用的值类型:
using System;
namespace DataTypeApplication
{
//获取int类型内存大小
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Size of int:{0}", sizeof(int));
Console.ReadLine();
}
}
}
引用类型(Reference types)
引用类型不包含存储在变量中的数据,但它们包含对变量的引用。
引用类型不包含存储在变量中的实际数据,但它们包含对变量的引用。
换句话说,它们指的是一个内存位置。使用多个变量时,引用类型可以指向一个内存位置。如果内存位置的数据是由一个变量改变的,其他变量会自动反映这种值的变化。内置的 引用类型有:object、dynamic 和 string。
对象(Object)类型
对象(Object)类型 是 C# 通用类型系统(Common Type System - CTS)中所有数据类型的终极基类。Object 是 System.Object 类的别名。所以对象(Object)类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。
当一个值类型转换为对象类型时,则被称为装箱;另一方面,当一个对象类型转换为值类型时,则被称为拆箱。
object obj;
obj = 100;//这时装箱
关于装箱和拆箱
装箱:值类型转换为对象类型, 实例:
int val = 8;
object obj = val;//整形数据转换为了对象类型(装箱)
拆箱:之前由值类型转换而来的对象类型再转回值类型, 实例:
int cal = 8;
object obj = val;//先装箱
int nval = (int)obj;//再拆箱
只有装过箱的数据才能拆箱
从本质上说是在堆和栈上的分配。引用类型放在栈上,对象类型放在堆上要把值类型变量放在堆上就需要进行一次装箱操作。拆箱过程与装箱过程正号相反。
装箱操作和拆箱操作是要额外耗费cpu和内存资源的,所以在c# 2.0之后引入了泛型来减少装箱操作和拆箱操作消耗。
拆箱是把“引用”类型转换成“值”类型;
装箱是把“值”类型转换成“引用类型”;
原因是有时某些方法的参数要求使用“引用”类型,而你想把“值”类型的变量通过这个参数传入,就需要使用这个操作。
动态(Dynamic)类型
您可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。
声明动态类型的语法:
dynamic <variable_name> = value;
例如: dynamic d = 20;
动态类型与对象类型相似,但是对象类型变量的类型检查是在编译时发生的,而动态类型变量的类型检查是在运行时发生的。
字符串(string)类型
字符串(String)类型 允许您给变量分配任何字符串值。字符串(String)类型是 System.String 类的别名。它是从对象(Object)类型派生的。
字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号。
string str = "Hello World";
@"Hello World"
C# string 字符串的前面可以加@(称作”逐字字符串”)将转义字符(\)当作普通字符对待,比如:
string str = @"C:\Windows";
等价于
string str = "C:\\Windows";
其他还有用户自定义引用类型:class、interface或delegate。
指针类型(Pointer types)
指针类型变量存储另一种类型的内存地址。
声明指针类型:type* identifier;
char* cptr;
int* iptr;
————————————————————————————–
类型转换
类型转换从根本上说是类型铸造,或者说是把数据从一种类型转换为另一种类型,在C#中,类型铸造有两种形式:
- 隐式类型转换。这些转换是C#默认的以安全方式进行的转换,不会导师数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
- 显式类型转换。也即强制类型转换,需要强制转换运算符,而且强制转换会造成数据丢失。
//显式类型转换实例
using System;
namespace TypeConversionApplication
{
class ExplictConversion
{
static void Main(string[] args)
{
double d = 5673.74;
int i;
//强制装换double为int
i = (int)d;
Console.WriteLine(i);
Console.ReadLine();
}
}
}
类型转换方法
//把不同值的类型转换为字符串类型
using System;
namespace TypeConversion
{
class StringConversion
{
static void Main()
{
int i = 75;
float f = 83.007f;
double d = 343.5435;
bool b = true;
Console.WriteLine(i.ToString());
Console.WriteLine(f.ToString());
Console.WriteLine(d.ToString());
Console.WriteLine(b.ToString());;
Console.ReadLine();
}
}
}
————————————————————————————–
C#变量
一个变量只不过是一个供程序操作的存储区的名字。在 C# 中,每个变量都有一个特定的类型,类型决定了变量的内存大小和布局。范围内的值可以存储在内存中,可以对变量进行一系列操作。
C# 中提供的基本的值类型大致可以分为以下几类:
C# 允许定义其他值类型的变量,比如 enum,也允许定义引用类型变量,比如 class。这些我们将在以后的章节中进行讨论。在本章节中,我们只研究基本变量类型。
变量定义和初始化
int i = 3;
double nun;
num = Convert.ToInt32(Console.ReadLine());
函数Convert .ToInt32()把用户输入的数据转换为int数据类型,因为Console.ReadLine()只接受字符串格式的数据。
常量:整数常量、浮点常量、字符常量、字符串常量
定义常量
using System;
namespace DeclaringConstantsApplication
{
class Program
{
static void Main(string[] args)
{
const double pi = 3.14159;//常量声明
double r;
Console.WriteLine("Enter Radius:");
r = Convert.ToInt32(Console.ReadLine());
double areaCircle = pi * r * r;
Console.WriteLine("Radius:{0}, Area:{1}", r, areaCircle);
Console.ReadLine();
}
}
}
——————-
C#中Console.WriteLine()的用法
using System;
namespace WriteLineApplication
{
class Program
{
static void Main(string[] args)
{
int num_one = 2017;
string str = "Hello";
Console.WriteLine("{1}\t{0}\t{1}", num_one, str);
Console.WriteLine("{0}\n{0,10}", num_one);//{0,10}表示以10个位来输出第0个参数
Console.WriteLine("{0,-10}", num_one);//{0,-10}'-'表示左对齐,默认是右对齐
Console.ReadLine();
}
}
}
——————-
————————————————————————————–
运算符
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C# 有丰富的内置运算符,分类如下:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 其他运算符
C# 中的运算符优先级
C# 判断结构
C# 循环结构
————————————————————————————–
学习参考:
1、https://docs.microsoft.com/en-us/dotnet/articles/csharp/index