【c#基础】1.C#简介和数据类型

一、简介

        C#是一种现代的、面向对象的编程语言,由微软公司开发。它最初发布于2002年,是为了取代微软早期的编程语言Visual Basic和C++而开发的。C#语言在设计时考虑到了很多新的编程范式和技术,因此它既具备了C++语言的高效性和灵活性,又具备了Java语言的跨平台性和安全性。

        C#语言主要应用于Windows平台的开发,特别是.NET平台上的开发。.NET平台是微软的一个开发平台,它包括了一个庞大的类库和各种工具,可以用来开发Windows应用程序、Web应用程序和服务端应用程序等。C#语言和.NET平台紧密结合,因此在.NET平台上使用C#语言进行开发是非常方便和高效的。

        C#语言的语法相对简单易学,特别是对于熟悉C++或Java语言的程序员来说。它支持面向对象编程、泛型编程、事件驱动编程、异步编程等多种编程范式,可以应用于各种类型的应用程序的开发。

        C#语言是一种强类型语言,这意味着变量必须先被声明为某种数据类型,然后才能被使用。C#语言支持多种数据类型,包括整型、浮点型、布尔型、字符型、字符串型等等。此外,C#语言还支持数组、枚举、结构体和类等复合数据类型。

        C#语言的语法规范由ECMA(欧洲计算机制造商协会)和ISO(国际标准化组织)联合发布,目前最新版本为C# 10.0。C#语言的开发工具主要有Visual Studio和Visual Studio Code,这些工具提供了强大的调试、测试、部署和版本控制等功能,可以大大提高开发效率和代码质量。

        C#语言在Windows平台上的应用非常广泛,它可以用于开发各种类型的桌面应用、Web应用和服务端应用等。此外,C#语言还可以用于开发游戏、机器学习、大数据处理等领域的应用程序。总的来说,C#语言是一种功能强大、易学易用的编程语言,适合各种类型的应用程序的开发。

二、编译

  1. 语法分析(Parsing):C#源代码在被编译之前,需要进行语法分析,将源代码转换成语法树。语法分析器会检查源代码是否符合C#语言的语法规范,如果有语法错误,则会发出编译错误提示。

  2. 语义分析(Semantic analysis):在语法和词法分析完成后,编译器会进行语义分析,检查源代码是否符合C#语言的语义规范。语义分析器会检查变量的类型、作用域、函数调用等等,如果存在语义错误,则会发出编译错误提示。

  3. 代码优化(Code optimization):在语义分析完成后,编译器会进行代码优化,使生成的目标代码更加高效和优化。代码优化包括删除死代码、常量折叠、函数内联等等。

  4. 代码生成(Code generation):最后一步是代码生成,编译器会将优化后的中间代码转换成目标代码(通常是机器码),并将目标代码输出到磁盘上的可执行文件中。这些步骤中的前三个是编译过程中最为重要的部分,它们保证了程序的正确性和可靠性,同时也为后面的代码优化和生成提供了必要的信息。

三、创建C#工程

        开始使用 -> 创建新的项目 -> 模板选择:控制台应用(.Net Framework) -> 创建

1.注释

  1. 单行://xxxxx

  2. 多行: /* */

  3. 三个斜杠: /// 用在方法前、类前,作解释说明

2.打印

Console.Write();   //输出不换行

Console.WriteLine();  //输出换行

 //背景颜色
 Console.BackgroundColor=ConsoleColor.Green;
 Console.WriteLine("Hello, World!");

 //字体颜色
 Console.ForegroundColor = ConsoleColor.Red;
 Console.WriteLine("Hello, World!");

 //发出蜂鸣的声音(频率,时间)
 Console.Beep(1000,10000);

 // 用户控制台输入
 Console.ReadLine();

3.标识符

1.组成

        字母,数字,下划线

2.规则

  1. 数字不能开头

  2. 严格区分大小写

  3. 不能和C#关键字,类库名重名,命名规范: 1.简洁明了  2. 小驼峰

int studentNum; // 定义
studentNum = 45; // 赋值
Console.WriteLine("学生个数:" + studentNum);   // 使用

int roomNum = 6;
Console.WriteLine("教室个数:" + roomNum + "。");

4.二进制

  1.  1字节(Byte)代表8位(bit),即 1Byte=8bit

  2. 区分存储的数的正负, 首位 0表示正数,1表示负数

  3. 练习

    • 8位,最大正数是127 -> 0 111,1111 + 1 = 1000,0000

    • 8位,最小负数是-128 -> 1000,0000

四、数据类型

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

  • 值类型(Value types)

  • 引用类型(Reference types)

  • 指针类型(Pointer types)

1.值类型(Value types)

简单类型

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

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

类型描述范围默认值
int32 位有符号整数类型-2,147,483,648 到 2,147,483,6470
short16 位有符号整数类型-32,768 到 32,7670
long64 位有符号整数类型-9,223,372,036,854,775,808 到 9,223,372,036,854,775,8070L
float32 位单精度浮点型-3.4 x 10^38 到 + 3.4 x 10^380.0F
double64 位双精度浮点型(+/-)5.0 x 10^-324 到 (+/-)1.7 x 10^3080.0D
char16 位 Unicode 字符U +0000 到 U +ffff'\0'
bool布尔值True 或 FalseFalse
byte8 位无符号整数0 到 2550
decimal128 位精确的十进制值,28-29 有效位数(-7.9 x 10^28 到 7.9 x 10^28) / 10^(0 到 28)0.0M
sbyte8 位有符号整数类型-128 到 1270
uint32 位无符号整数类型0 到 4,294,967,2950
ulong64 位无符号整数类型0 到 18,446,744,073,709,551,6150
ushort16 位无符号整数类型0 到 65,5350

值类型不可为空:int x = null (错误写法)。

可空值类型需要加?:int? x = null(正确写法)。

// 整数
int num = 2147483647;
Console.Writeline(sizeof(float));

// 进制
 1M = 1024KB   1KB = 1024B    1B(字节) = 8b(位)
 B:Byte字节    b:bit位
 计算机中存储数据的最小单位:Byte字节

// 无符整数
 byte     1B      8b    最小:0  最大:255
 ushort   2B      16b   最小:0  最大:65535
 uint     4B      32b   最小:0  最大:2^32-1
 ulong    8B      64b   最小:0  最大:2^64-1

// 有符整数
// 区分存储的数的正负, 首位0表示正数,1表示负数
 sbyte    1B      8b    最小:-128   最大:127
 short    2B      16b   最小:-2^15  最大:2^15-1
 int      4B      32b   最小:-2^31  最大:2^31-1
 long     8B      64b   最小:-2^63  最大:2^63-1

// 实数
 float:单精度    4B   在赋值时后面需要加上f    
 double:双精度   8B   一个数默认就是double类型
 float a = 12.5616512f;
 Console.Writeline(a);
 double b = 0.5151561123456789;
 Console.Writeline(b);

// 布尔
// bool:布尔类型,一般有两个取值:true 和 false。
 int a = 5;
 int b = 10;
 bool c = a > b;
 Console.Writeline("c = " + c);

// 字符
// char:字符 在赋值时需要加上 '' 单引号
//ASCII 值:https://baike.baidu.com/item/ASCII/309296?fr=aladdin

 char a = 'A';
 char b = 'b'; 
 Console.Writeline(a + b);
枚举

        定义枚举(定义到类外面或者命名空间里面)
         结构:public enum 名字 { }

// 定义枚举(定义到类外面或者命名空间里面)
// 结构:public enum 名字 {}
// C# 枚举是值类型。换句话说,枚举包含自己的值,且不能继承或传递继承。

Week w=Week.Monday;
Console.WriteLine(w)

public enum Week
{
   Monday,
   Tuesday,
   Wednesday,
   Thursday,
   Friday,
   Saturday,
   Sunday
}
结构体

//定义结构体
// 结构:public struct 名字 { }

//定义结构体的类型:struct 名称{}

Rect juxing; //声明一个结构体的变量
juxing.length=100;  //结构体里面的数据赋值,结构体变量,数据=值
juxing.width=200;

Console.WriteLine("矩形的面积:"+juxing.length*juxing.width);

struct Rect{
    public float length;   
    public float width;
}
//定义结构体
// 结构:public struct 名字 {}
public struct Book
{
    public float price;
    public string name;
    public int id;
}
public struct People
{
    public string name;
    public bool gender;
    // 结构成员不能指定为 abstract、virtual 或 protected(默认是 private)。
    private int money;
    public void SetMoney(int a)
    {
        money = a;
        Debug.Print(money);
    }
    
}

        1.结构可带有方法、字段、索引、属性、运算符方法和事件。
        2.结构可定义构造函数,但不能定义析构函数。但是,您不能为结构定义默认的构造函数。默认的构造函数是自动定义的,且不能被改变。
        3.与类不同,结构不能继承其他的结构或类。
        4.结构不能作为其他结构或类的基础结构。
        5.结构可实现一个或多个接口。
        6.结构成员不能指定为 abstract、virtual 或 protected。
        7.当您使用 New 操作符创建一个结构对象时,会调用适当的构造函数来创建结构。与类不同,结构可以不使用 New 操作符即可被实例化。
        8.如果不使用 New 操作符,只有在所有的字段都被初始化之后,字段才被赋值,对象才被使用。

结构体和类的区别:
        1.类是引用类型,结构是值类型。
        2.结构不支持继承。
        3. 结构不能声明默认的构造函数。

2.引用类型

对象(Object)类型
对象不好理解,放到所有类型讲完的后面讲解,此处先不讲解

        对象(Object)类型 是 C# 通用类型系统(Common Type System - CTS)中所有数据类型的终极基类。Object 是 System.Object 类的别名。所以对象(Object)类型可以被分配任何其他类型(值类型、引用类型、预定义类型或用户自定义类型)的值。但是,在分配值之前,需要先进行类型转换。

        当一个值类型转换为对象类型时,则被称为 装箱;另一方面,当一个对象类型转换为值类型时,则被称为 拆箱。

动态(Dynamic)类型

您可以存储任何类型的值在动态数据类型变量中。这些变量的类型检查是在运行时发生的。

声明动态类型的语法:

dynamic <variable_name> = value;

//例如
dynamic d = 20
字符串(String)类型

        字符串(String)类型 允许您给变量分配任何字符串值。字符串(String)类型是 System.String 类的别名。它是从对象(Object)类型派生的。字符串(String)类型的值可以通过两种形式进行分配:引号和 @引号。

例如:

String str = "runoob.com"
//一个 @引号字符串:
@"runoob.com";
//C# string 字符串的前面可以加 @(称作"逐字字符串")将转义字符(\)当作普通字符对待

string str = @"C:\Windows";  等价于:string str = "C:\\Windows";
// string:字符串。赋值的时候需要加上 "" 双引号
// string str = "这里面写的就是字符串";

// 练习
// 1.定义小明的身高和体重,输出字符串: 小明的身高是180cm,体重是75公斤
int height = 180;
int weight = 75;
Console.Write("小明的身高是" + height + "cm,体重是" + weight + "公斤");

// 2.定义两个变量a = 5,b = 4.4,分别输入出:a:5,b:4.4;a + b = 9.4
int a = 5;
float b = 4.4f;
Console.Write("a:" + a + ",b:" + b);
Console.Write("a + b = " + (a + b));
指针类型(Pointer types)
指针不好理解,放到所有类型讲完的后面讲解,此处先不讲解

指针类型变量存储另一种类型的内存地址。C# 中的指针与 C 或 C++ 中的指针有相同的功能。

声明指针类型的语法:

type* identifier;

//例如

char* cptr;
int* iptr;

区别:

放到所有类型讲完的后面讲解,此处先不讲解

  1. 值类型存储的是值本身,引用类型存储的是内存地址

  2. 赋值,调用方法传参数的时候。

五、常量

// 变量:值可以发生变化  int a = 5; float b = 4.4f;
// 常量:值不能发生变化  (就是一个固定的值)
const float PI = 3.14f;

六、工程其他代码解释

  • using 引用命名空间,关键字:using

  • namespace 定义一个新的命名空间,格式:namespace 命名空间 {}

  • internal(内部):限定的是只有在同一程序集中可访问,可以跨类

  • static 可以修饰字段或者方法,修饰字段的时候,表示这个字段是静态的数据,叫做静态字段或者静态属性,修饰方法的时候,叫做静态方法,或者静态函数(使用static修饰的成员,只能通过类名访问)

  • class 声明一个新的类:

    /*
    * 定义一个静态的函数。
    * 关键字:static(静态) 关键字:void(空返回)
    */ 
    static void Main()
    
    /// <summary>
    /// 拿着钱去买买买
    /// </summary>
    /// <param name="money">带着的钱数</param>
    static void GoShopping(int money)
    {
        Console.WriteLine(money);
    }     

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值