文章是根据b站视频 刘铁猛《C#语言入门详解》全集 所自己整理的基于C++基础的学习笔记,如有错误还请指出,本系列文章的前提是有C++的基础,会有很多关于C++与C#的对比,如有错误,还请指出,我们共同进步
一,通过Vs2022创建C#程序
通过这个会创建出如下面图片的程序框架
如果没有,还请去安装器安装相关插件
二,对框架程序的简单介绍
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//上面的是一些名称空间,都是一些常用的名称空间,与C++中的名称空间类似
namespace ConsoleApp2 //这个名称空间的命名默认是我们解决方案(solution)的名称
{
internal class Program //这是由我们自己编写的类,名称默认是项目名
{
static void Main(string[] args) //程序进入的入口,类比C++的main函数
{
}
}
}
三,Hello World
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp2
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
System.Console.WriteLine("Hello world");
//Console类其实是System名称空间下的类
}
}
}
Console 是类库中的类, " . " 是成员操作符,后面是类中的一个函数,在窗口上打印东西
我们写的两条语句其实等价,在类前加上名称空间叫做 全限定名(完全限定名),但我们在最开始写了 using System; 所以主程序中的System. 不写也没事
四,类和名称空间
C#是完全面向对象的语言,所以主程序本身也是一个类
名称空间是以树状结构组织类和其他类型
类和名称空间放在什么地方
类和名称空间放在类库中
类库的引用
我们想要使用某个类,就要先引用对应的类库
具体方式是从项目中的references 右击Add references 然后找到需要的类库进行引用
这些都是vs2022自带的库,当然也可以引用我们自己写的类库,还不大会,之后补充
DLL引用(黑盒引用)
指的是对编译好的dll直接引用,无法看到源代码,当类库出现问题时,只能找类库编写者修改
项目引用(白盒引用)
有源代码,我们可自行调试和修改
一个项目是可以被其他被其他solution所引用,当前solution仅有我们自己创建的ConsoleApp2项目
右击solution—Add—Existing project,可以添加现有项目
依赖关系
引用使用某个类库后,我编写的程序对这个类库就产生了依赖性,若类库有问题,程序就会有问题
类库中的类有问题,我的程序就有问题,这就是依赖关系,也称作耦合关系
优秀的程序往往追求高内聚(功能精确放到类中),低耦合(类之间的关系尽可能的低)
UML(通用建模语言)类图
用图的形式把程序中的关系用图的形式表示,
类图,展现类之间的关系
使用NuGet添加对dll的引用,用来解决复杂依赖关系
NuGet可以将多个类库同时引用
基础阶段用不上
类的三大成员
简单一说不代表全部,后面会重点且全面地记录
属性(Property)
存储数据,组合起来表示类或对象当前的状态
方法(Mothod)
由c语言的函数进化而来,表示对象能做什么
属性和方法可以类比数据结构和算法
事件(Event)
类或对象通知其他类或对象的机制,为C#特有
对于上面三种成员,某些类或对象侧重不同,比如Timer类库侧重事件
静态成员与实例成员
静态成员隶属于类而不是某一个对象,被所有对象共享,关键字是static
静态(static)成员 在语义上表示他是类的成员
实例(非静态)成员,隶属于对象的成员
静态成员是不能用实例访问的,只能用类名使用成员访问操作符访问
五,类和对象的关系
对象也称作实例,是类经过“实例化"后得到的内存中的实体
“实例化”理解为依照类去创建按对象
一般使用new操作符来创建类的实例
引用变量(这个后面会说,与C++还是区别挺大的) 与实例的关系
引用变量---孩子 ,实例---气球
气球不一定有孩子牵着
多个孩子可以通过自己的绳子牵着同一个气球,也可以都通过一根绳子牵气球
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
//只有气球
new Form(); //没有孩子牵着的气球很快就会飞走
//内存垃圾收集器很快也就会把这个实例给收回了
//有孩子,但是没有气球
Form Form; //这个引用变量没有任何实例
//有孩子,并且牵着气球
Form myForm;
myForm = new Form(); //引用变量有指向的实例
//多个孩子通过各自的绳子牵着同一个气球
Form myForm1;
Form myForm2;
myForm1= new Form();
myForm2 = myForm1; //两个引用变量指向的是同一个实例
//通过赋值,或者具体函数可以证明两个变量 指向的是一个实例,就不再说了
//多个孩子同过同一根绳子牵着气球
//这个要等到 了解ref 引用参数之后才好说
//他大致与 C++的引用是一致的
}
}
}
首次,Form是一个类,这里没有说他的用法,只是演示引用变量与实例之间的关系
然后,这里只是提一嘴,并不细讲,后面会详细介绍他们之间内存中的关系