C#语言入门、xamarin基础、.NET MAUI全栈开发技术综合笔记

本文详细介绍了C#语言的基础,包括类、静态成员、类型和方法,强调了委托和事件在C#中的重要性。此外,文章还深入探讨了.NET MAUI全栈开发技术,涵盖了MVVM模式、数据库使用、页面布局和控件、事件处理,以及SQLite集成。同时,还介绍了键值存储和MQTT通信协议的基础知识。
摘要由CSDN通过智能技术生成

文章目录

前言:

本文主要分为三大部分学习,b站视频
(1).NET_C#语言入门详解二期-刘铁锰老师
(2)xamarin基础
(3)东北大学张引《.NET MAUI全栈开发技术》

一、C#语言入门

1、类

类与实例:类是概念,实例是具体,飞机是类,一架飞机是实例。

使用new操作符创建一个类的实例:

(new Form()).ShowDialog();

类的三大成员

要学会使用MSDN文档
某些特殊类或对象在成员方面侧重点不同
模型类或对象重在属性,如EntityFramework工具类或对象重在方法,如Math,Console通知类或对象重在事件,如各种Timer

属性(Property)

存储数据,组合起来表示类或对象当前的状态

方法(Method)

由C语言中的函数(function)进化而来,表示类或对象“能做什么’
工作中90%的时间是在与方法打交道,因为它是“真正做事”“构成逻辑”的成员

事件(Event)

类或对象通知其它类或对象的机制,为C#所特有(Java通过其它办法实现这个机制)善用事件机制非常重要

2、静态成员与实例成员

  • 静态(Static)成员在语义上表示它是“类的成员”
  • 实例(非静态)成员在语义表表示它是“对象的成员
  • 绑定(Binding)指的是编译器如果把一个成员与类或对象关联起来
    – 不可小觑的“.“操作符——成员访问

3、类型、变量和方法

3.1类型(Type)

亦称数据类型(DataType),是数据在内存中存储时的“型号”

  • 小内存容纳大尺寸数据会丢失精确度、发生错误
  • 大内存容纳小尺寸数据会导致浪费
    编程语言的数据类型与数据的数据类型不完全相同
3.2类型的作用

类型在C#语言中的作用
一个C#类型中所包含的信息有:

  • List item存储此类型变量所需的内存空间大小
  • 此类型的值可表示的最大、最小值范围
  • 此类型所包含的成员(如方法、属性、事件等)
  • 此类型由何基类派生而来
  • 程序运行的时候,此类型的变量在分配在内存的什么位置
    Stack简介
    Stack overflow Heap简介
    使用PerformanceMonitor查看进程的堆内存使用量
    关于内存泄漏
  • 此类型所允许的操作(运算)
3.3五大数据类型

在这里插入图片描述

3.4变量

是存放数据的地方,简称“数据”变量的声明变量的使用

在这里插入图片描述

3.5方法(旧称函数)

是处理数据的逻辑,又称“算法”

  • 方法的声明
  • 方法的调用

3.6程序=数据+算法

有了变量和方法就可以写有意义的程序了

4、操作符

在这里插入图片描述

5、字段、属性、索引器、常量

6、值参数、引用参数

在这里插入图片描述

7、委托(Delegates)和事件管理(Events Management)

在这里插入图片描述

7.1 委托详解(Delegate)

C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。委托(Delegate) 是存有对某个方法的引用的一种引用类型变量。引用可在运行时被改变。委托(Delegate)特别用于实现事件和回调方法。

实例化委托(Delegate)

delegate <return type> <delegate-name> <parameter list><delegate-name> dg = new <delegate-name>(匹配的方法放入此处);

匿名方法:
语法:

<variable_name>= delegate(int x) {
    //coding };

委托的优点:

类似代理功能,拥有多态性,相同委托可以合并 并按顺序执行。

7.2 C# 事件详解(Event)

事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。
C# 中使用事件机制实现线程间的通信。

通过事件使用委托
类 或对象可以通过事件向其他类或对象通知发生的相关事情。 发送(或引发)事件的类称为“发布者”,接收(或处理)事件的类称为“订阅者”。

声明事件(Event)
在类的内部声明事件,首先必须声明该事件的委托类型。
关键字: event

// 基于上面的委托定义事件
public event <event_name>;

事件概述
事件具有以下属性:

  • 发行者确定何时引发事件;订户确定对事件作出何种响应。
  • 一个事件可以有多个订户。 订户可以处理来自多个发行者的多个事件。
  • 没有订户的事件永远也不会引发。
  • 事件通常用于表示用户操作,例如单击按钮或图形用户界面中的菜单选项。
  • 当事件具有多个订户时,引发该事件时会同步调用事件处理程序。 若要异步调用事件,请参阅 “使用异步方式调用同步方法”。
  • 在 .NET 类库中,事件基于 EventHandler 委托和 EventArgs 基类。

代码示例

using System;namespace ConsoleApp1{
       
class CarEvent    {
           
//默认速度        
private int speed =80;                    
//警告速度        
private int Warn_Speed =100;        public delegate void Exceed_Speed_Limit_Even();        //基于上面的委托定义事件        
public event Exceed_Speed_Limit_Even Exceed_Speed_Even;        
static void Main()       
 {
   
 CarEvent carEvent = new CarEvent();            carEvent.Exceed_Speed_Even += Speed_Limit_Even;            //carEvent.Exceed_Speed_Even +=Speed_Limit_Even2;
             carEvent.AddSpeed(); 
             carEvent.AddSpeed(); 
             carEvent.AddSpeed(); 
             Console.ReadLine();        
             }        
             public void AddSpeed()        {
               int v = speed + 10;            
             if (v > Warn_Speed && Exceed_Speed_Even!=null)            
             {
    Exceed_Speed_Even();  }            else            
    {
                   
    this.speed = v;            
    }        
    }        
    //        
    private static void Speed_Limit_Even()        {
               Console.WriteLine("超速警告~~~");        }       
     /*private static void Speed_Limit_Even2()        {            Console.WriteLine("超速警告0002~~~");        }*/    }}

8、泛型(Generics)

8.1定义

泛型(Generic) 允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法。

8.2特性

它有助于您最大限度地重用代码、保护类型的安全以及提高性能。
可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。

例如一个加法,现在有int 和float两种类型,我们用泛型只需要写一遍即可。而不用泛型则需要俩种方法,当然也可以使用object,但是这样会造成装箱拆箱,影响效率。
泛型约束及作用
在声明泛型方法/泛型类的时候,可以给泛型加上一定的约束来满足我们特定的一些条件。
约束是使用 where 上下文关键字指定的。
总结:限制类型参数代表的数据类型,让它只代表某类或者某些数据类型。

泛型限定条件:
T:结构(类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型)
T:类 (类型参数必须是引用类型,包括任何类、接口、委托或数组类型)
T:new() (类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时new() 约束必须最后指定)
T:<基类名> 类型参数必须是指定的基类或派生自指定的基类
T:<接口名称> 类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
T:U
示例1:
泛型参数必须具有无参数的公共构造函数

public class class_name <T> where T : new(){
   }

示例2:
类型参数必须是指定的基类或派生自指定的基类

public class class_name<T> where T : base_class_name{
   }

泛型的语法有俩种:
第一种是在类名后面加上

class My<T>
{
   
    ArrayList arrList = new ArrayList();//
    public void Add(T i)
    {
   
        arrList.Add(i);
    }
}

第二种是在方法名后面加上

class Your
    {
   
        ArrayList arrList = new ArrayList();//
        public void Add<T>(T i)
        {
   
            arrList.Add(i);
        }
    }

9、动态数组 ArrayList

常用属性:

属性 描述
Capacity 获取或设置动态数组中可以包含的元素个数
Count 获取动态数组中实际包含的元素个数
IsFixedSize 判断动态数组是否具有固定大小
IsReadOnly 判断动态数组是否只读
IsSynchronized 判断访问动态数组是否同步(线程安全)
Item[Int32] 获取或设置指定索引处的元素
SyncRoot 获取一个对象用于同步访问动态数组

常用方法:

方法名 描述
public virtual int Add(object value) 将对象添加到动态数组的末尾
public virtual void AddRange(ICollection c) 将 ICollection 的元素添加到动态数组的末尾
RemoveAll(Predicate match) 关键是其参数格式 Predicate match 难以理解,其中Predicate为对方法的委托,会根据传递的对象和委托中的定义是否匹配来返回true和false,委托通过Lambda表达式实现。
public virtual void Clear() 从动态数组中移除所有的元素
public virtual bool Contains(object item) 判断某个元素是否在动态数组中
public virtual ArrayList GetRange(int index, int count) 返回一个动态数组,表示源动态数组中元素的子集

public virtual int IndexOf(object) 搜索整个动态数组,并返回对象在动态数组中第一次出现的索引,索引从零开始
public virtual void Insert(int index, object value) 在动态数组的指定索引处插入一个元素
public virtual void InsertRange(int index, ICollection c) 在动态数组的指定索引处插入某个集合的元素
public virtual void Remove(object obj) 从动态数组中移除指定的对象
public virtual void RemoveAt(int index) 移除动态数组中指定索引处的元素
public virtual void RemoveRange(int index, int count) 从动态数组中移除某个范围的元素
public virtual void Reverse() 逆转动态数组中元素的顺序
public virtual void SetRange(int index, ICollection c) 复制某个集合的元素到动态数组中某个范围的元素上
public virtual void Sort() 对动态数组中的元素进行排序
public virtual void TrimToSize() 将容量设置为动态数组中元素的实际个数

  var intList = new List<int> {
    1, 2, 3, 4, 5, 6, 7, 8 };
            intList.RemoveAll(n => n > 3);    //【★★关键★★】
            foreach (var item in intList)
            {
   
                Console.WriteLine(item);
            }
            Console.ReadKey();

intList的结果元素为{1, 2, 3}

10、文件的输入与输出

10.1定义:

当打开文件进行读写时,它变成一个**流(Stream)。**从根本上说,流是通过通信路径传递的字节序列。有两个主要的流:输入流 和 输出流。输入流用于从文件读取数据(读操作),输出流用于向文件写入数据(写操作)。

10.2操作:

文件创建、删除、写入数据、读取数据

文件创建
//第一种方式              
//创建或打开用于写入 UTF-8 编码文本的文件。 如果该文件已存在,将覆盖其内容。    
//返回 一个 System.IO.StreamWriter,它使用 UTF-8 编码写入到指定的文件。  
StreamWriter streamWriter1 = File.CreateText(path);//执行完毕--需要关闭
streamWriter1.Close();
//第二种方式
//在指定路径中创建或覆盖文件。
FileStream fileStream = File.Create(path);//执行完毕--需要关闭
fileStream.Close();
//第三种方式
FileInfo file = new FileInfo(path);FileStream fileStream = file.Create();
文件删除
//第一种方式
FileInfo file = new FileInfo(path);
if (file.Exists){
        
file.Delete();
}
//第二种方式 
if (File.Exists(path)) {
       
File.Delete(path); 
}
写入数据
    FileInfo file = new FileInfo(@"C:\Users\lenovo\Desktop\myTxt.txt");   
     FileStream fileStream = file.Create();    string str = "我在学习File";    
     byte[] decBytes = System.Text.Encoding.UTF8.GetBytes(str);    
     fileStream.Write(decBytes, 0, decBytes.Length);    
     fileStream.Close();
读取数据
try
	{
   
		FileInfo file = new FileInfo(@"C:\Users\lenovo\Desktop\big.pdf");
		}     

11、构造函数

构造函数就是与类(或结构体)具有相同名称的成员函数,它在类中的地位比较特殊,不需要我们主动调用,当创建一个类的对象时会自动调用类中的构造函数。在程序开发的过程中,我们通常使用类中的构造函数来初始化类中的成员属性。

C# 中的构造函数有三种:
实例构造函数;
静态构造函数;
私有构造函数。

一般情况下,首先执行类中的初始化参数,再执行类中的静态构造函数,然后执行 Main 函数里面的内容,接着初始化 Demo 类,这时会执行类中的构造函数。

11.1 实例构造函数

  • 构造函数是类中特殊的成员函数,它的名称与它所在类的名称相同,并且没有返回值。
  • 当使用 new 关键字创建类的对象时,可以使用实例构造函数来创建和初始化类中的任意成员属性。
public class Person{
   
    private string name;
    private int age;
    public Person
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值