一. 什么是 .Net Framework 及C#集成开发环境

1. .Net 框架(.Net Framework)

微软公司开发的一个面向对象的开发平台,用于编写应用程序

例如Windows应用程序,Web 应用程序等。

这个框架下面支持多种语言,同时编写的应用程序也支持多平台,可以在Windows,Liunx,及MacOS上运行,多种语言之间还能彼此交互。

同时,.Net 应用程序不依赖于操作系统。只依赖于.Net Framework

.Net 框架拥有一个巨大的代码库,提供给客户端语言比如 C# 使用

2. C# 的集成开发环境(Integrated Development Environment)

书中及课堂上要求使用Microsoft Visual Studio,下文使用更为轻量化的Jetbrains Rider,不影响学习。

在使用VS或

二. C#的程序结构与基本语法

1. C#的程序结构

C#源代码文件的后缀(扩展名)为.cs

一个 C# 程序主要包括以下部分:

  • 命名空间声明(Namespace declaration)

  • 一个 类

  • 类 方法

  • 类 属性

  • 一个 Main 方法

  • 语句(Statements)& 表达式(Expressions)

  • 注释

以下面的C#代码为例

using System;
namespace HelloWorldApplication
{
   {
      static void Main(string[] args)
      {
         /* 这是一个C# 程序*/ 
         Console.WriteLine("Hello World");
         Console.ReadKey();
      }
   }
}

程序的第一行 using System; using 关键字用于在程序中包含 System 命名空间。 一个程序一般有多个 using 语句

第二行是命名空间声明。一个命名空间里包含了一系列的类。HelloWorldApplication 命名空间包含了类 HelloWorld。

第五行定义了Main方法,是所有C# 程序的入口点。Main 方法说明当执行时类将做什么动作

第七行是注释,会显示在源代码中,但是在编译时会被忽略

第八行 Main 方法通过语句 Console.WriteLine("Hello World"); 指定了它的行为。 WriteLine 是一个定义在 System 命名空间中的 Console 类的一个方法。该语句会在控制台上显示消息 "Hello World"。

第九行Console.ReadKey() 使得程序会等待一个按键的动作,防止程序从启动时会快速运行并关闭。

需要注意的是

  • C# 是大小写敏感的。例如定义一个变量ABC,那么在之后的程序中使用abc是没有定义的。

  • 所有的语句和表达式必须以分号(;)结尾。

  • 程序的执行从 Main 方法开始。

  • 与 Java 不同的是,文件名可以不同于类的名称。

2. C#的基本语法

以下一个 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();
            Console.ReadLine();
        }
    }
}

using 关键字

在任何 C# 程序中的第一条语句都是:

using System;

class 关键字

class 关键字用于声明一个类。

C# 中的注释

注释是用于解释代码。编译器会忽略注释的条目。在 C# 程序中,多行注释以 /* 开始,并以字符 */ 终止,如下所示:

/* 这个程序演示
C# 的注释
使用 */

单行注释是用 // 符号表示。例如:

// 这一行是注释 

成员变量

变量是类的属性或数据成员,用于存储数据。在上面的程序中,Rectangle 类有两个成员变量,名为 lengthwidth,分别代表长和宽。

成员函数

函数是一系列执行指定任务的语句。类的成员函数是在类内声明的。我们举例的类 Rectangle 包含了三个成员函数: AcceptDetailsGetAreaDisplay。分别用于给 lengthwidth 赋值,计算面积,输出 lengthwidth 及面积。

标识符

标识符是用来识别类、变量、函数或任何其它用户定义的项目。即所谓的变量的名字。类的名字,函数的名字。

在 C# 中,类的命名必须遵循如下基本规则:

  • 标识符必须以字母、下划线或 @ 开头,后面可以跟一系列的字母、数字( 0 - 9 )、下划线( _ )、@。

  • 标识符中的第一个字符不能是数字

  • 标识符必须不包含任何嵌入的空格或符号,比如 ? - +! # % ^ & * ( ) [ ] { } . ; : " ' / \

  • 标识符不能是 C# 关键字。除非它们有一个 @ 前缀。 例如,@if 是有效的标识符,但 if 不是,因为 if 是关键字。

  • 标识符必须区分大小写。大写字母和小写字母被认为是不同的字母。

  • 不能与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

三. C#数据类型

在 C# 中,变量分为以下几种类型:

  • 值类型(Value types)这里只讲这个,其他两个不考

  • 引用类型(Reference types)

  • 指针类型(Pointer types)

值类型(Value types)

值类型变量可以直接分配给一个值。它们是从类 System.ValueType 中派生的。

值类型直接包含数据。比如 int、char、float,它们分别存储数字、字符、浮点数。当您声明一个 int 类型时,系统分配内存来存储值。

下表列出了 C# 中可用的值类型:

类型

描述

范围

默认值

bool

布尔值

True 或 False

False

byte

8 位无符号整数

0 到 255

0

char

16 位 Unicode 字符

U +0000 到 U +ffff

'\0'

decimal

128 位精确的十进制值,28-29 有效位数

(-7.9 x 1028 到 7.9 x 1028) / 100 到 28

0.0M

double

64 位双精度浮点型

(+/-)5.0 x 10-324 到 (+/-)1.7 x 10308

0.0D

float

32 位单精度浮点型

-3.4 x 1038 到 + 3.4 x 1038

0.0F

int

32 位有符号整数类型

-2,147,483,648 到 2,147,483,647

0

long

64 位有符号整数类型

-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

0L

sbyte

8 位有符号整数类型

-128 到 127

0

short

16 位有符号整数类型

-32,768 到 32,767

0

uint

32 位无符号整数类型

0 到 4,294,967,295

0

ulong

64 位无符号整数类型

0 到 18,446,744,073,709,551,615

0

ushort

16 位无符号整数类型

0 到 65,535

0

C# 类型转换

在 C# 中,类型转换是将一个数据类型的值转换为另一个数据类型的过程。

C# 中的类型转换可以分为两种:自动类型转换强制类型转换

自动类型转换

隐式转换是不需要编写代码来指定的转换,编译器会自动进行。

隐式转换是指将一个较小范围的数据类型转换为较大范围的数据类型时,编译器会自动完成类型转换,这些转换是 C# 默认的以安全方式进行的转换, 不会导致数据丢失。

例如,从 int 到 long,从 float 到 double 等。

从小的整数类型转换为大的整数类型,从派生类转换为基类。将一个 byte 类型的变量赋值给 int 类型的变量,编译器会自动将 byte 类型转换为 int 类型,不需要显示转换。

byte b = 10;
int i = b; // 隐式转换,不需要显式转换

将一个整数赋值给一个长整数,或者将一个浮点数赋值给一个双精度浮点数,这种转换不会导致数据丢失:

int intValue = 42;
long longValue = intValue; // 隐式转换,从 int 到 long

强制类型转换

显式类型转换,即强制类型转换,需要程序员在代码中明确指定。

显式转换是指将一个较大范围的数据类型转换为较小范围的数据类型时,或者将一个对象类型转换为另一个对象类型时,需要使用强制类型转换符号进行显示转换,强制转换会造成数据丢失。

例如,将一个 int 类型的变量赋值给 byte 类型的变量,需要显示转换。

int i = 10;
byte b = (byte)i; // 显式转换,需要使用强制类型转换符号

强制转换为整数类型:

double doubleValue = 3.14;
int intValue = (int)doubleValue; // 强制从 double 到 int,数据可能损失小数部分

强制转换为浮点数类型:

int intValue = 42;
float floatValue = (float)intValue; // 强制从 int 到 float,数据可能损失精度

强制转换为字符串类型:

int intValue = 123;
string stringValue = intValue.ToString(); // 将 int 转换为字符串

下面的实例显示了一个显式的类型转换:

using System;

namespace TypeConversionApplication
{
    class ExplicitConversion
    {
        static void Main(string[] args)
        {
            double d = 5673.74;
            int i;

            // 强制转换 double 为 int
            i = (int)d;
            Console.WriteLine(i);
            Console.ReadKey();
           
        }
    }
}

当上面的代码被编译和执行时,它会产生下列结果:

5673