C#笔记(Day6)

1.调式与错误排查

错误(BUG) 代码中难免会出现错误,不管多优秀的程序员都会出错;比如变量写错,导致编译器无法编译(语法错误);但是有的是逻辑错误在某方面有缺陷,也会产生错误,这类错误叫做语义错误(逻辑错误)

// 比如现在要计算两个数字的和,然后把+写成-,这就是逻辑错误
        int a = 15 - 10;

正常模式下运行:正常模式下运行是不会影响后续代码正常运行                                                       1.在VS中使用Console.WriteLine()与Console.Write()方法向控制台输出变量的值,通过这种方法查看变量的值是否到达预期,来调式错误                                                                                              2.中断模式(DeBug)模式下的调式:中断模式是指我们可以暂停程序的执行,然后查看程序的状态,也可以让程序继续执行

如何让程序中断                                                                                                                  1.Console.ReadLine();就可以使程序中断,当程序运行到此处时,会等待用户输入一个内容,等待的过程中下面的代码不会执行,只有用户输入完毕,才会继续执行下面的代码

        Console.ReadLine();
        Console.WriteLine("1");
        Console.WriteLine("2");

2.断点

断点是什么: 断点时源代码自动进入中断模式的一个标记,当遇到断点的时候,程序会进入断点模式,只需在行号前点一下即可;断点可以打在如何位置,但是不能打在空格或者注释行上;打上断点之后程序运行到断点的位置就会停止,只运行断点前的代码;通过局部变量可以查看每个变量的值 中断模式下单步执行代码,断点模式下点击继续运行,会执行到下一个断点位置; 逐语句 逐过程 相同点:都是一条一条的执行代码;不同点:逐语句遇到方法体的时候会执行到方法体内部,逐过程不会 如何插入断点: 1.右键代码行,选择 断点--->插入断点 2.光标定位到代码行选择菜单上的DuByg(调式)--->切换断点 3.光标定位到代码行,摁下F9,再次摁下F9取消断点 4.在需要打断点的行首位置(行号前)鼠标左键单点,再次单点取消

2.异常处理

int[] array = { 1, 2, 3, 4, 5, 6};
            try // 要捕获的代码,可能出现异常的代码,捕获阶段
            {
                int temp = array[8];
            }
            // 要捕获那些异常 IndexOutOfRangeException 声明了一个异常类型的对象 e catch可以捕获多个异常
            catch (IndexOutOfRangeException e) 
            {
                Console.WriteLine("异常");
            }
            // 不管什么情况下都会执行
            finally 
            {
                Console.WriteLine("不管是否出现异常都会执行");
            }
C# 中的异常类

C# 异常是使用类来表示的。C# 中的异常类主要是直接或间接地派生于 System.Exception 类。System.ApplicationExceptionSystem.SystemException 类是派生于 System.Exception 类的异常类。

System.ApplicationException 类支持由应用程序生成的异常。所以程序员定义的异常都应派生自该类。

System.SystemException 类是所有预定义的系统异常的基类。

下表列出了一些派生自 System.SystemException 类的预定义的异常类:

异常类描述
System.IO.IOException处理 I/O 错误。
System.IndexOutOfRangeException处理当方法指向超出范围的数组索引时生成的错误。
System.ArrayTypeMismatchException处理当数组类型不匹配时生成的错误。
System.NullReferenceException处理当依从一个空对象时生成的错误。
System.DivideByZeroException处理当除以零时生成的错误。
System.InvalidCastException处理在类型转换期间生成的错误。
System.OutOfMemoryException处理空闲内存不足生成的错误。
System.StackOverflowException处理栈溢出生成的错误。

3.面向对象

在C#中,你可以使用类来创建对象。类是一种自定义数据类型,它可以包含属性(表示对象的状态)和方法(表示对象能够执行的操作)。你可以通过实例化类(创建对象)来使用类。

C#中的面向对象编程还包括以下概念:

  1. 封装(Encapsulation):将数据和方法组合到一个对象中,并限制对对象内部实现的访问。这样可以隐藏内部实现细节并提供更高的安全性。

  2. 继承(Inheritance):通过定义新的类来继承已经存在的类的属性和方法。这允许新类继承现有类的特性,并且可以在不修改原始类的情况下进行扩展。

  3. 多态(Polymorphism):允许使用一个通用的接口来处理不同类型的对象。多态性使你能够编写更灵活和可重用的代码。

访问修饰符:

  • public:所有对象都可以访问;

  • private:对象本身在对象内部可以访问;

  • protected:只有该类对象及其子类对象可以访问;

  • internal:同一个程序集的对象可以访问;

  • protected internal:访问限于当前程序集或派生自包含类的类型。

// class Program 系统提供的一个类,类的名称和文件的名字相同,一般一个.cs文件就是一个类,但是一个文件里面也可以包含多个类
    internal class Program
    {
        static void Main(string[] args)
        {
            /* 什么是面向对象编程?      模块化 
             * 为什么使用面对对象编程?
             * 为了程序更加清晰,把程序的功能进行模块化划分,每个模块提供特定的功能,而且每个模块都是独立的,这种模块化编程提供了非常大的多样性,大大增加了重用代码的机会;简单来说面对对象编程就是结构化编程,对程序中的变量结果细分,让程序更清晰
             * 
             * 注意:不要从字面意思去理解面向对象编程,把类创建的变量叫做对象
             * 数据成员;方法成员
             * */
             //  使用类
             //  利用类创建对象,c1就是对象的名字 new Customer()实例化对象
             Customer c1 = new Customer(18,"小张",001);
             // 对象是可以有多个的,类只需要一个,可以通过类创建很多对象,类就是一个模版
             Customer c2 = new Customer(20,"小马",002);
             // 访问类中的数据成员信息
             Console.WriteLine(c1.name);
             Console.WriteLine(c2.name);
             // 修改对象中的数据信息,通过对象名.属性,重新赋值即可
             c1.name = "大张";
             Console.WriteLine(c1.name);
             Console.WriteLine(c2.name);
​
             // 如何调用类中的方法?   通过类实例化出的对象.方法名()即可调用
             c1.getAge();
             c1.Show();
             Class1 cl1 = new Class1(20,2023,10);
             Console.WriteLine(cl1.getX());
            // 
            Vehicle v1 = new Vehicle("大众",1.68,1.3,40);
            v1.Run();
            v1.Stop();
            v1.Update();
        }
    }
// 顾客类
    internal class Customer
    {
        // 数据成员
        public int age;
        public int id;
        public string name;
        // 如何创建一个构造函数,如果自己没有创建构造函数,系统会帮我们添加一个默认的无参的构造函数;如果自己写的有系统就不会提供了,就会调用我们自己写的构造函数;
        // 什么是构造函数?就是当我们实例化镀锡的时候(new的时候)就会去调用构造函数,通过构造函数个数据初始化赋值
        // 构造函数的名字与类的名字相同
        static Customer() 
        {
            Console.WriteLine("构造函数");
        }
        // 这个构造函数就可以对数据进行初始化赋值,然后在构造对象的时候,把这些参数所需要的值传递过来,一次性完成赋值
        public Customer(int age,string name,int id)
        {
            // 这里我们通过this指向当前对象,让当前对象中的数据等于构造对象传递过来的参数
            this.age = age;
            this.id = id;
            this.name = name;
        }
        // 方法成员
        public void getAge() 
        {
            Console.WriteLine("东西买好了,付账");
        }
// 汽车类
    internal class Class1
    {
        //  private 设置访问权限,只能在当前类中使用
        private int x; 
        private int y; 
        private int z;
        // 构造函数初始化赋值是按照默认值的; 基本数据类型的默认值是0,值类型的默认值是0,引用数据类型默认值是null;当我们构造一个对象的时候,即使不给它赋值,它的默认值也会是0,但是当我们不想让它是0的时候,就需要一个初始化赋值(通过构造函数)
        public Class1(int x,int y,int z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
        }
        public int getX() 
        { 
            return x; 
        }
        // 如果外界想知道或设置这个私有数据怎么办?
        // 定义一个方法,传递过来一个值或者返回第一个数据
        public void setX(int x)
        {
            this.x = x;
        }
        public int Add()
        {
            return x + y + z;
        }

4.属性

属性(Property)是类(Class)中的成员变量,用于描述类的对象的特征或状态。属性可以存储和表示类的对象的数据,并通过访问器(getter)和设置器(setter)方法来访问和修改属性的值。

属性具有以下几个特点:

  1. 数据封装:属性将数据封装在类的内部,使得属性的具体实现细节对外部代码来说是隐藏的。通过访问器和设置器,可以对属性的访问和修改进行控制,增加了代码的安全性和可维护性。

  2. 访问控制:通过在属性的定义中设置访问修饰符(例如 public、private、protected 等),可以限制属性的访问范围。这样可以确保属性只能通过定义的方法进行访问,实现了对属性的访问控制。

  3. 访问器和设置器:属性一般配备访问器(getter)和设置器(setter)方法,用于获取和修改属性的值。访问器通常用于获取属性的值,设置器用于修改属性的值。通过访问器和设置器,可以在外部代码中通过方法调用的方式来访问和修改属性,实现对属性的封装和控制。

  4. 可计算属性:有些属性的值不是直接存储,而是通过计算得出。这样的属性被称为可计算属性(Computed Property)或虚拟属性(Virtual Property)。可计算属性的值根据其他属性或外部条件的变化而动态计算,通过访问器来获取计算结果。

属性的作用是描述类的对象的特征和状态,它们可以存储和访问对象的数据。通过使用属性,可以将数据封装在类的内部,实现对数据的隐藏和访问的控制。属性的访问和修改通常通过访问器和设置器方法进行,外部代码通过方法调用的方式来操作属性。

使用属性,通过属性设置和访问数据;使用的时候就把他当做一个普通的数据成员一样,并不是调用函数,其方法的背后对应的是两个函数;一个设置set,一个访问get,当年通过属性访问的时候就会调用get函数,设置的时候就会调用set函数

 // 设置
             c1.Age = 10;
            // 访问
             Console.WriteLine(c1.Age);
​
            // 设置
            c1.Name = "小张";
            // 调用属性就是访问,get
            Console.WriteLine(c1.Name);
​
            c1.Str = "Text";
            Console.WriteLine(c1.Str);
internal class Class1
    {
        private string name;
        private int age;
        private string CreateTime;
        private string address;
​
        // 设置
        public void Setname(string name) 
        { 
            this.name = name;
        }
        // 访问
        public string Getname() 
        {
            return this.name; 
        }
​
        // 属性,使用属性,get,set
​
        // 在Class1类中声明了一个具有int类型的返回值的顺序,名字叫Age
        public int Age
        {
            // 相当于一个get函数,又称访问器
            get 
            { 
                return this.age; 
            }
            // 相当于一个set函数,又称设置器
            set // 设置过来的值,有一个value参数,value就是我们要设置的值;把value设置给数据成员就可以了
            {
                Console.WriteLine(value);
                this.age = value;
            }
        }
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                this.name = value;
            }
        }
​
        // 这种情况下,没有给它添加str成员,系统会自动创建public string str这样的数据成员,因为没有这个str这个数据成员,所以访问的时候也需要通过属性访问
        public string Str
        {
            get;set;
        }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值