重庆熊猫 Loading

C#教程 - C#介绍(Introducing C#)

更新记录
转载请注明出处。
2022年9月10日 发布。
2022年9月10日 从笔记迁移到博客。

C#介绍

C#介绍(是什么)

编程语言。特点:

  • 微软开发,亲儿子。
  • 2002年正式发布。
  • 基于.Net(.NET Framework、.NET Core)平台的编程语言。

C#作者

Anders Hejlsberg(安德斯·海尔斯伯格)

C#特点(优势)

  • 类似C\C++高效灵活,类似VB可视化编程,类似Java的强大且规范的类库。
  • 使用地球最强大的Visual Studio IDE进行高效开发。
  • 微软官方首推的编程语言,亲儿子。
  • 既保持高效的开发效率,又可以调用Windows底层平台功能。

C#软件的开发与执行过程

  • 编译时:编写C#代码,C#编译器编译C#代码生成程序集。

  • 运行时:载入程序集中的IL代码到运行时,即时编译器编译中间语言代码(IL)成本机代码,然后执行本机代码。

image

C#版本更新

说明

C# 8主要用于.NET Core 3和.NET Standard 2.1标准,C# 8部分语言特性只有.NET Core 3实现支持。C# 7主要用于.NET Framework 4.6/4.7/4.8和.NET Core 2.x和.NET Standard 2.0标准。

C# 1.0

C# 1.0在2002年发布,实现了基本的面向对象。

C# 2.0

C# 2.0在2005年发布,加入的主要语言特性如下。

Feature Topic
Nullable value types Making a value type nullable
Generics Making types more reusable with generics

C# 3.0

C# 3.0在2007年发布,加入的主要语言特性如下。

Feature Topic
Implicitly typed local variables Inferring the type of a local variable
LINQ Querying and Manipulating Data Using LINQ

C# 4.0

C# 4.0在2010年发布,加入的主要语言特性如下。

Feature Topic
Dynamic types The dynamic type
Named/optional arguments Optional parameters and named arguments

C# 5.0

C# 5.0在2012年发布,加入的主要语言特性如下。

Feature Topic
Simplified asynchronous tasks Understanding async and await

C# 6.0

C# 6.0在2015年发布,加入的主要语言特性如下。

Feature Topic
static imports Simplifying the usage of the console
Interpolated strings Displaying output to the user
Expression bodied members Defining read-only properties

C# 7.0

C# 7.0在2017年发布,加入的主要语言特性如下。

Feature Topic
Binary literals and digit separators Storing whole numbers
Pattern matching Pattern matching with the if statement
out variables Controlling how parameters are passed
Tuples Combining multiple values with tuples
Local functions Defining local functions

C# 7.1

C# 7.1在2017年发布,加入的主要语言特性如下。

Feature Topic
Default literal expressions Setting fields with default literal
Inferred tuple element names Inferring tuple names
async Main Improving responsiveness for console apps

C# 7.2

C# 7.2在2017年发布,加入的主要语言特性如下。

Feature Topic
Leading underscores in numeric literals Storing whole numbers
Non-trailing named arguments Optional parameters and named arguments
private protected access modifier Understanding access modifiers
You can test == and != with tuple types Comparing tuples

C# 7.3

C# 7.3在2018年发布,加入的主要语言特性如下:改进ref变量,指针,stackalloc。

C# 8.0

C# 8.0在2019年发布,加入的主要语言特性如下。

Feature Topic
Nullable reference types Making a reference type nullable
Switch expressions Simplifying switch statements with switch expressions
Default interface methods Understanding default interface methods

C#程序组成

C#程序源代码组成:

  • 命名空间。
  • 类型(预定义类型、自定义类型)(类、结构、接口、枚举、委托)。

编写C#程序的源代码本质是:使用类型(预定义类型、自定义类型)、定义各种类型的交互。

C#源代码最终被编译器编译成程序集,程序集的外在文件表现:exe文件、dll文件。 程序集的主要内容:CIL/元数据/清单。

C#源代码文件后缀

.cs

C#语言语法

构成C#语言的基本语法元素(细节)

  • 关键字(Keyword)
  • 标识符(Identifier)
  • 操作符(Operator)
  • 标点符号
  • 字面值
  • 注释与空白

标识符(Identifier)

标识符概念:字符,人为创造用于指代某物。
标识符规则:首字母只可以是字母@_,后续字符可以是字母、数字、下划线。

注意:

  • 标识符可以是任何Unicode字符。
  • 如果非要将关键字作为标识符,可以使用@做前缀。
  • @前缀可以放在任何标识符前面,和没用@前缀是一样的。

image

标识符命名规范类型:

  • Pascal:每个单词的首字符大写,其他字母小写。
  • Camel:首个单词字母小写其余单词首字母大写,其他字母小写。

注意:C#的标识符区分大小写(case-sensitive)

建议:

  • 不要使用单词缩写要使用清晰的单词全写。
  • 局部变量使用camel风格。

关键字(Keywords)

关键字:为了帮助编译器解释代码,给某些单词(或字符)特别的意义,这些单词(或字符)称为语言的关键字。

C#所有关键字都是小写。关键字官方文档

C#中所有关键字:

关键字 关键字 关键字 关键字
abstract enum long stackalloc
as event namespace static
base explicit new string
bool extern null struct
break false object switch
byte finally operator this
case fixed out throw
catch float override true
char for params try
checked foreach private typeof
class goto protected uint
const if public ulong
continue implicit readonly unchecked
decimal in ref unsafe
default int return ushort
delegate interface sbyte using
do internal sealed virtual
double is short void
else lock sizeof while

上下文关键字:只在指定语言结构上下文存在的关键字。

C#中上下文关键字

add dynamic join select
alias equals let set
ascending from nameof value
async get on var
await global orderby when
by group partial where
descending into remove yield

注意:关键字不可以用作自定义标识符,如果非要用作标识符,可以使用@修饰

class class  {...}      // Illegal
class @class {...}      // Legal

注意:如果使用@修饰自定义标识符,是没有影响的,都表示同一个标识符

static void Test()
{
    int @panda = 666;
    int panda = 666;  //error,已在此范围定义了名为“panda”的局部变量
}

提示:@修饰符常用于多种语言编写的.NET库之间的互相操作,可减少关键字冲突。

语句和块

语句:描述一个类型 或 告诉程序去执行某个动作 的指令。

注意:通常使用分号表示语句结束,但使用分号结尾的不一定是语句(如:using)

块:由一个成对的大括号包围的 0条 或 多条语句。

提示:块后不需要分号结尾。

注释(Comments)

说明

辅助解释说明代码的文本。注释不影响代码编译/执行。

分类

image
单行(single-line comments)

// 单行注释

多行(multiline comments)

/* 多行注释 */

文档注释(Comments embed XML documentation tags)

/// <summary>
/// 文档注释
/// </summary>
/// <param name="args">参数描述</param>

规范

书写好理解的代码,而不是满篇注释。

文档注释(XML Documentation)

作用:在代码文件中插入文档注释可以在日后直接提取到文档中。
image

格式:

/// <summary>
/// 文档注释
/// </summary>
/// <param name="args"></param>

常用文档注释标签:
image

空白

说明:通常空白没有影响,可以增加美观。分类:

  • 换行符\n
  • 回车符\r
  • 空格
  • 制表符\t

Main多种形式

public static void Main();
public static int Main();
public static void Main(string[] args);
public static int Main(string[] args);
public static Task Main();
public static Task<int> Main();
public static Task Main(string[] args);
public static Task<int> Main(string[] args);

本质就是参数和返回值的不同而已。返回值是:void / int / Task。参数是:string[] 或者 空。
注意:Main首字母大写。
注意:C#中参数接收的数组第一个元素为接收的第一个值,不是程序名。
如何选择Main形式,取决于是否需要返回值、是否需要参数。

变量(variable)

变量概念

在计算机中变量代表存储地址,而变量的类型决定了存储在内存中数值的类型。变量名是符号,该符号指代指定的内存区域。变量名是内存区域地址的符号命名,类似房间的门牌号。

声明变量

修饰符 数据类型 变量名;

为什么要声明变量?向编译器申请一块内存区域,并说明内存区域内的数据如何存储,并给内存区域命名。类似住酒店,告诉前台你要多大的房间,几个人入住,房间号多少。

值类型 和 引用类型 的差异

差异

  • 值类型内存的变量直接指向存储实际的数据。
  • 引用类型变量的内存指向存储的一个引用,该引用指向实际数据区域。

实例:

int var1;   //定义值类型变量
int var2;   //定义值类型变量
float var3; //定义值类型变量
Dealer theDealer;  //定义引用类型变量

示意图:
image

C#变量分类

名称 描述
本地变量 local variable 在方法作用域内保存的临时数据
成员字段 field (instance or static) 保存类或结构类型自身或实例相关的数据,是类型成员
方法参数 parameter (value, ref, out, or in) 从一个方法传递到另一个方法的临时变量,不是类型成员
数组元素 array element 数组的成员,可以是本地变量,也可以是类型成员

变量自动初始化

本地变量(Local variables) 和 函数参数(Function arguments) 必须手动初始化。其他变量会自动初始化。

变量类型 存储位置 自动初始化 用途
本地变量 栈或堆 方法内部的变量
类类型字段 类型或实例的成员字段
结构类型字段 栈或堆 结构成员字段
方法参数 实参或形参
数组元素 数组成员

实例:

int var1;
int var2 = 17;
float var3 = 26.834F;
Dealer dealer1;
Dealer dealer2 = null;

示意图:
image

注意:堆也存储静态字段,在程序运行过程中不会被GC回收,直到程序运行结束才会回收。

常量

引用本地类型(Ref Locals)

可以定义本地变量引用的类型:

  • 数组的元素(array element)。
  • 类型的字段(field)。
  • 本地的变量(local variable)。
  • 适合场景:减少内存分配,使用引用方式使用值。方法返回引用。

注意:

  • 从C# 7版本开始支持。
  • 使用的时候双方都需要带ref修饰。

实例:引用类型实例的成员

using System;

namespace ConsoleApp1
{
    class TestClass
    {
        public string website = "Panda666";
        public static int Code = 666;
    }
    class Program
    {
        static void Main(string[] args)
        {
            //引用类的字段成员
            TestClass pandaTest = new TestClass();
            ref string localWebsite = ref pandaTest.website;
            localWebsite = "www.panda666.com";
            Console.WriteLine(pandaTest.website); //www.panda666.com

            //引用类的字段成员(静态)
            ref int localCode = ref TestClass.Code;
            localCode = 666666;
            Console.WriteLine(TestClass.Code); //666666

            //wait
            Console.ReadKey();
        }
    }
}

实例:引用数组的成员

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //引用数组成员
            int[] arr = new int[] { 1, 2, 3 };
            ref int localIntRef = ref arr[0];
            localIntRef = 10;
            Console.WriteLine(arr[0]); //10

            //wait
            Console.ReadKey();
        }
    }
}

实例:引用本地变量

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            //引用本地变量
            string pandaWebsite = "www.panda666.com";
            ref string localStringRef = ref pandaWebsite;
            localStringRef = "panda666.com";
            Console.WriteLine(pandaWebsite); //panda666.com

            //wait
            Console.ReadKey();
        }
    }
}

实例:返回引用本地变量和引用类型参数

static ref string GetWebsite(ref string stringLocalRef)
{
    return ref stringLocalRef;
}

实例:和 readonly 结合使用,防止

框架设计指南

https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/

posted @ 2022-09-10 07:53  重庆熊猫  阅读(1330)  评论(0编辑  收藏  举报