C#语言及其特点
C#是基于.NET框架上的编程语言之一
C#是微软公司发布的一种面向对象的、运行于.NET Framework和.NET Core之上的高级程序设计语言。
C#是一种安全的、稳定的、简单的、优雅的,由c和c++衍生出来的面向对象的编程语言。它在继承c和c++强大功能时去掉了一些它们的复杂特性。
C#是面向对象的编程语言。
基本语法
整型
byte
(字节型)范围0~255
short
(短整型)范围-32768~32767
int
(整型)范围-2147483648~2147483647
long
长整型-910^18 ~ 910^18
浮点型
float
浮点型 float c = 1.2F 定浮点型后面必须标明F
double
双精度浮点型
十进制类型
decimal
精度比浮点高
//后面需加上M
decimal e = 1.2M;
bool类型
只有两个值true或者false
字符串类型
string 字符串
char 字符 只能有一个值
string str = "你好";
char cr = '1';
空类型
null
swich
for
数组
函数
out 和 ref 的区别 out 传进来的实参必给 参数重新赋值
如图所示则会报错
ref定义的参数必须在调用方法之前给参数赋值,否则报错
面向对象
类和对象
函数的访问修饰符
public 公有的所有的类都可以访问
private 只有当前类部访问
protected 受保护的当前类和子类可以访问
internal 内部的只限于本项目访问
protected internal 只能本项目或者子类访问
多态
抽象类
1、抽象类中的抽象属性和抽象方法必须是公有的,因此必须有public修饰符
2、子类必须override抽象类中的所有抽象属性和抽象方法,如果没有全部override,那么子类必须是抽象类
3、抽象类中可以有非抽象属性和非抽象方法,也可以是私有或者公有,但是如果是私有的话子类就不能访问,无意义,所以一般情况下都设置为公有
4、有抽象方法或抽象属性的类一定是抽象类,抽象类中的属性或方法不一定都是抽象的
接口
抽象类与抽象方法:
1.使用关键字abstract修饰的类,称为抽象类.
2.抽象类只是用到一个类所具有的行为,不能单独通过创建对象来使用.使用new是错误的.
3.抽象类中可以有抽象方法,也可以没有任何抽象方法.
4.抽象类不能是静态的(static)或者密封的(sealed)
抽象方法的概念与使用要点:
1.在抽象类中使用abstract修饰的方法,称为抽象方法.
2.抽象方法必须在抽象类中定义,不能再普通类中使用.
3.抽象方法只能是一个方法的申明,不能有任何的方法体.
4.抽象方法仅仅表示一个应该具有的行为,具体实现由子类实现.
5.抽象方法在子类中被实现(重写)必须使用关键字override.
6.子类必须重写父类的所有抽象方法,除非子类本身也是抽象类.
多态:
不同对象,接收相同消息,产生不同的行为,称为多态。
使用继承实现多态:
父类中必须有抽象方法或虚方法.
子类必须重写父类中的抽象方法或虚方法.
子类对象必须转换成父类对象去使用.
LSP:李氏替换原则:
1.子类的对象能够替换其父类.
2.父类对象不能替换子类.
3.父类的方法都要在子类中实现或者重写.
is与as操作符:
is,检查对象是否与指定类型兼容,如果转换失败程序中断.
as 用于在兼容的引用类型之间执行转换,转换失败返回null.
抽象方法仅仅是声明,没有任何实现内容。
抽象方法必须在子类中重写以后才有使用价值.
针对抽象方法问题引出:
如果需要在父类中提供一个方法,该方法有自己的方法体,子类根据自己的需求决定是否重写该方法,而不是必须重写.
父类方法定义成:virtual,子类可以重写也可以不重写.
虚方法如同抽象方法一样,可以实现多态.
子类没有重写虚方法时,直接调用父类的虚方法.
构造方法,用来对象创建过程中初始化。
Equals默认支持的是引用相等,想让对象相同,重写Equals
虚方法和抽象方法
用virtural修饰,要有方法体,哪怕是一个分号,可以被子类override,除了密封类都可以写
用abstract修饰,不允许有方法体,必须被子类override,只能在抽象类中.
关于Equals()虚方法:
对于字符串和值类型能够自动比较是否相等.
对于对象比较必须重写后才有意义.
关于ToString()虚方法:
默认返回该对象的完全限定类型名称,可根据需要重写.
而对于值类型,因为重写的该方法,则返回变量值的字符串表示.
结构体
struct loca
{
public int a;
public int b;
public loca(int a,int b)
{
this.a = a;
this.b = b;
}
}
static void Main(string[] args)
{
loca lo = new loca(2, 3);
lo.a = 22;
Console.WriteLine(lo);
}
枚举
enum ca
{
red,
pink,
orangin
}
static void Main(string[] args)
{
ca a = new ca();
a = ca.red;
Console.WriteLine(a);
}
结构体和枚举都是值类型
操作符重载
using
Disposable
处理导入资源还能用于清理资源
委托
public delegate bool IsQiu(int num,int rezul);
static IsQiu ev = delegate (int num, int rezul) { return num < rezul; }; // 求最小值
static IsQiu evs = delegate (int num, int rezul) { return rezul < num; }; //求最大值
static int sho(int[] it, IsQiu iq)
{
int rezul = it[0];
for (int i = 0; i < it.Length; i++)
{
if (iq(i,rezul))
{
rezul = it[i];
}
}
return rezul;
}
static void Main(string[] args)
{
int[] arr = new int[]{ 2,3,4,1,5,6};
//求最小值
int ad = sho(arr, ev);
Console.WriteLine(ad);
}
Lambda
上面例子还有一种更简单的封装
public delegate bool IsQiu(int num,int rezul);
static int sho(int[] it, IsQiu iq)
{
int rezul = it[0];
for (int i = 0; i < it.Length; i++)
{
if (iq(i,rezul))
{
rezul = it[i];
}
}
return rezul;
}
static void Main(string[] args)
{
int[] arr = new int[]{ 2,3,4,1,5,6};
//求最小值
int min = sho(arr,(a,b)=> a<b);
//求最大值
int max = sho(arr, (a, b) => b < a);
Console.WriteLine(max);
Console.WriteLine(min);
}
反射
类
using System;
#nullable disable
namespace Models.Entity
{
public class Advert
{
public int Id { get; set; }
public int SortId { get; set; }
public string Url { get; set; }
public string Image { get; set; }
private int ul;
public int Ul {
get => ul;
set => ul = value;
}
public void show()
{
Console.WriteLine("很好");
}
public static void show1()
{
Console.WriteLine("版本");
}
public static void show2()
{
Console.WriteLine("不被");
}
}
}
通过反射获取类中的所有属性或方法
//反射
//动态加载 dll
Assembly assembly = Assembly.Load("ConsoleApp1");
//获取类型
Type type = assembly.GetType("Models.Entity.Advert");
foreach (var item in assembly.GetTypes())
{
Console.WriteLine(item);
//foreach (var items in item.GetMethods())
//{
// Console.WriteLine(items);
//}
}
dynamic ab = Activator.CreateInstance(type);
ab.show();
线程
var tas = new Task(() =>
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine(i);
}
});
tas.Start(); //启动线程
tas.Wait(); //等待线程执行完毕 会阻塞
Stopwatch 可以获取某段程序编译后的时间
并行处理
锁(lock)
DateTime
Regex
Regex regex = new Regex(@"^\d");
bool a = regex.IsMatch("bc");
Console.WriteLine(a);
var date = DateTime.Now;
string str = date.ToString("yyyy-MM-dd HH:mm:ss");
Console.WriteLine(str);