C#基础复习

发布于:2024-11-02 ⋅ 阅读:(46) ⋅ 点赞:(0)


项目地址

  • 教程作者:繁体记忆抖音
  • 教程地址:
  • 代码仓库地址:
  • 所用到的框架和插件:
C#

一、基础复习

1.1 方法

结构:

返回类型 方法名(参数列表)
{
	方法体
}

无返回值 无参数方法
void SayHi()
{
	Console.WriteLine("Hi")
}
  • 例子:
void Main()
{
    Console.WriteLine("Hello, World!");
}


int Add(int a, int b)
{
    return a + b;
}

Add(1, 2)

1.2 类于对象

  • 命名空间:类似于几年级几班
引入命名空间

namespace 当前空间的名称
{
	class 类名称
		{
		
		}
}
  • 其他地方使用class的时候需要先引入命名空间,相当于python的import xxx一样,才可以使用里面的类
    Student.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    internal class Student
    {
        //private
        int password = 111;
        //public
        public string name = "PJJ";
    }
}

1.3 字段和属性

  • 自定义一个判断和设置姓名的方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    internal class Student
    {
        private int age;
        public void SetAge(int ageValue)
        {
            if (ageValue >=0 && ageValue<=130)
            {

                age = ageValue;
            }
            else
            {
                Console.WriteLine("Age must be leagel");

            }

        }


        //自动属性输入prop
        public string StudentName { get; set; }

    }
}

1.4 类的四大成员

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    internal class Student
    {
        //构造方法
        public Student() 
        {   
        }
        
        //变量
        private int age;
        //属性
        public  string name { get; set; }

        //方法
        public void SetAge(int ageValue)
        {
            if (ageValue >= 0 && ageValue <= 130)
            {

                age = ageValue;
            }
            else
            {
                Console.WriteLine("Age must be leagel");

            }
        }
    }
}

1.5 静态方法和静态成员

  • 类分为实例类和静态类
  1. 访问静态类只需要 类名.成员名
  2. 访问实例类成员,需要先创建类对象,然后使用 对象名.成员名
  3. 静态类是被static修饰的
  4. 静态类中,只能与静态成员,不能有实例
  5. 静态类是不能被实例化的,所以没有构造函数
  6. 但是实例类里可以有静态成员,我们直接使用类.成员名(这里与python 的 staticmethod一样)
namespace ConsoleApp1
{
    internal static class Student
    {
        public static string stu_id;
    }
}

1.6 重载

  • 重载就是方法名相同,参数的个数或者类型不同
public class Calculator
{
    // Add method with two int parameters
    public int Add(int a, int b)
    {
        return a + b;
    }

    // Overloaded Add method with three int parameters
    public int Add(int a, int b, int c)
    {
        return a + b + c;
    }

    // Overloaded Add method with two double parameters
    public double Add(double a, double b)
    {
        return a + b;
    }
}

  • 调用
Calculator calc = new Calculator();
int result1 = calc.Add(5, 10);         // 调用第一个 Add 方法
int result2 = calc.Add(5, 10, 15);     // 调用第二个 Add 方法
double result3 = calc.Add(5.5, 10.2);  // 调用第三个 Add 方法

1.7 构造函数重载

种让类拥有多个构造函数的技术,每个构造函数具有不同的参数列表。这样可以为类的实例化提供不同的初始化选项,根据需要传入不同的参数,从而更加灵活地构造对象。

  • 假设有一个表示人的类Person,通过构造函数重载,我们可以定义多个构造函数,以满足不同的初始化需求:
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Address { get; set; }

    public Person() : this("Unknown", 0, "Unknown") { }

    public Person(string name) : this(name, 0, "Unknown") { }

    public Person(string name, int age) : this(name, age, "Unknown") { }

    public Person(string name, int age, string address)
    {
        Name = name;
        Age = age;
        Address = address;
    }
}

1.8 实例化对象的三种常用方法

  • 学生类
namespace ConsoleApp1
{
    internal class Student
    {
        public string name { get; set; }
        public int age { get; set; }
        public string gender { get; set; }
    }
}
  • 实例化对象
using ConsoleApp1;

//方法一:先创建空对象,在赋值
Student stu1 = new Student();
stu1.name = "pjj";
stu1.age = 1;
stu1.gender = "female";

//方法二:对象初始化器

Student stu2 = new Student()
{
    name  ="pjj",
    age = 2,
    gender = "femal"
};

1.9 枚举类型

  • 定义一个枚举类型
public enum Gender
{
	男,
	女,
	自定义
}

1.10 泛型集合

  • 泛型集合:就是将同类的东西放在一起,这个集合可以是系统内置的,也可以是自己自定义的,类似于自己自定义的学生类,老师类等
  • 语法
List<自定义类型>自定义名字 = new List<自定义类型>()
List<string> list_abc = new List<string>();
  • 使用
string a = "a";
string b = "b";
string c = "c";

List<string> list_abc = new List<string>();
list_abc.Add("a");
list_abc.Add("b");
list_abc.Add("c");

1.11 遍历集合

  1. 使用for循环
for (int i = 0; i < list_abc.Count; i++) {
    Console.WriteLine(list_abc[i]);

}
  1. 使用foreach
foreach (var item in list_abc)
{
    Console.WriteLine(item);
}

1.12 数组

  • 数组是一种类型,一旦定义,数组长度无法改变,无法增加和删除里面的元素,只可更改和查询
//整数数组
int[] intArr = new int[] { 1, 2, 3, 4, 5 };

1.13 类库

  1. 类库是一种项目类型,用于存储各种类
  2. 类库本身不能直接运行,因为他没有Main方法
  3. 想要访问一个解决方案的其他项目,需要先添加其他项目的引用,在引入命名空间

1.14异常捕获与处理

try
{
    //遍历数组
    foreach (int i in intArr)
    {
        Console.WriteLine(i);
    }
}
catch (Exception e) //e是一个变量,可以随便写
{
    Console.WriteLine(e.Message);
}

1.15 值类型与引用类型

  • 值类型的有: int, double, bool, DateTime
  • 引用类型的有:string, array, List, 自定义类

1.16 里氏转换和虚方法

  • 里氏转换:父类里可以装入子类对象,如果父类里装的是子类对象,则可以将父类对象强制转换为子类
Dog normalDog = new Dog();
normalDog.SayHi();

//将父类里强制转换成子类
Dog xibaDog = new XibaDog();
xibaDog.SayHi();

//无转换的时候,由于父类强制的转换,所输出的都是
Hi, I am a dog
  • 虚方法:解决里氏转换的问题,这样我们我们可以创建一个相同的父类对象,里面可以装各种各样子的子类,并且任意控制他们继承的方法,更加的灵活,例如 动物都可以走路,但是鸟会飞,这样鸟可以继承父类,也可以添加自己的新的方式,
namespace ConsoleApp1
{
    internal class Dog
    {
        public void Walk()
        {
            Console.WriteLine("I am walking");
        }

        public virtual void SayHi()
        {
            Console.WriteLine("Hi, I am a dog");
        }
    }

    internal class XibaDog: Dog
    {
        public override void SayHi()
        {
            Console.WriteLine("Hi, I am a Xiba dog");
        }
    }
}
  • 调用

//父类
Dog normalDog = new Dog();
normalDog.SayHi();
normalDog.Walk();

Dog xibaDog = new XibaDog(); 
xibaDog.SayHi();
xibaDog.Walk();
>>
Hi, I am a dog
I am walking
Hi, I am a Xiba dog
I am walking
  • 狗的走路方式都一样,所以子类xiba dog继承了父类的walk()方法,不用写重复代码;但是xiba dog的叫声,不一样,这样他就override了父类的SayHi()方法

总结:当父类的方法,子类都是一样执行的,则直接继承,子类不用写重复代码;当设计类的时候,知道同样的方法名,但是子类和父类会实现的功能不一样的时候,就需要用父virtual,子override来实现。

1.17 抽象类和抽像方法

  • 1.16虽然解决了一些问题,但是,有些功能无法做到
  1. 既然所有的狗都会叫,那么我想让之后新建的子类,都必须有叫的方法,谁没有就报错
  2. 但是我在创建 父类的时候,并不知道下面的其他狗,怎么叫,所以,该方法不能直接写功能
    所以需要引入抽象类
namespace ConsoleApp1
{
    internal  abstract class Dog
    {
        public abstract void SayHi();
    }

    internal class XibaDog: Dog
    {        
        public override void SayHi()
        {
            Console.WriteLine("Hi, I am a Xiba dog");
        }
    }  
}
  • 调用
using ConsoleApp1;

//当设置父类是抽象类时,无法实例化父类,只能实例化子类
//Dog normalDog = new Dog();
//normalDog.SayHi();

Dog xibaDog = new XibaDog();
xibaDog.SayHi();

1.18 接口

上面1.17 抽象类解决了类的使用规范,但是并没有解决方法的问题,所以就需要引入接口这个概念
解决的问题。

类似于企鹅,继承了南极动物这个类,但是南极动物的类里,没有会聊天的动物,但是唯独企鹅后面他会聊天了,所以我们可以让用 会聊天的这个接口来创建企鹅,那么企鹅既可以是南极动物,又可以拥有了聊天的功能。