No title
No title
John Doe简述装箱拆箱
1 | 装箱是指将值类型(int,float等)转换为对象类型object类型的过程,拆箱是将对象类型转换为原始类型的过程,装箱操可以通过赋值操作自动实现,拆箱操作要强制类型转换,如果转换类型和原类型不匹配会抛出类型转异常。 |
class 和 struct
1 | 结构是值类型,而类是引用类型。 |
类的分类
1 | 1.1 抽象类 |
接口和类的异同
1 | 接口和类不同点: |
C#构造器Constructor是否可以被继承?是否可以被Override?
在C#中,构造器(Constructor)既不是继承的也不是被重写的(Override)。这里有几个关键点需要澄清: 1. **构造器不是继承的**:当你创建一个派生类(子类)时,它不会自动继承基类的构造器。相反,每个类都必须有自己的构造器(除非它是`struct`类型,它默认有一个无参数的构造器,但`struct`不支持继承)。如果基类有构造器,并且你想要在派生类中使用它(比如,你想要初始化基类的一部分状态),你需要在派生类的构造器中使用`base`关键字显式地调用它。但是,这并不是说派生类“继承”了基类的构造器,而是派生类构造器负责调用基类构造器(如果需要的话)。 2. **构造器不能被重写**:在C#中,`override`关键字用于重写基类中的虚方法(virtual methods)、抽象方法(abstract methods)、属性(properties)、索引器(indexers)和事件(events)。然而,构造器不是这些方法、属性、索引器或事件之一,因此它们不能被重写。每个类都有自己的一组构造器,这些构造器是特定于该类的,并且不能通过继承机制来修改或替换。 3. **构造器的调用链**:当你创建派生类的一个实例时,首先会调用派生类的构造器。然后,派生类构造器可以使用`base`关键字来调用基类构造器(这是可选的,但通常是必要的,特别是当基类有非默认构造器时)。这个过程会一直向上追溯到类的继承链的顶部,直到最终调用到`System.Object`的构造器(这是所有C#类的最终基类)。这个调用链确保了基类在派生类之前被正确初始化。
1
2
3
4
5
C#虚方法(virtual )和抽象方法(abstract)的区别?
一:抽象方法仅有声明,而没有任何实现,如abstract someMethod();,虚方法却不能如此
二:子类继承父类,可以对父类中的虚方法进行重写、覆盖、不处理三种处理对抽象方法却必须实现
子类对父类中虚方法的处理有重写(override)和覆盖(new),请说明它们的区别?
有父类ParentClass和子类ChildClass、以及父类的虚方法VirtualMethod。有如下程序段:
ParentClass pc = new ChildClass();
pc.VirtualMethod(…);
如果子类是重写(override)父类的VirtualMethod,则上面的第二行语句将调用子类的该方法
如果子类是覆盖(new)父类的VirtualMethod,则上面的第二行语句将调用父类的该方法
1 |
|
private : 私有成员, 在类的内部才可以访问 ,也就是类内部的函数等成员可以访问。
protected : 保护成员,该类内部和继承类中可以访问。
public : 公共成员,完全公开,没有访问限制。
internal: 当前程序集内可以访问
1 |
|
类之间不支持,接口之间支持。类对接口叫做实现,不叫继承
1 |
|
概念:构造函数的⽅法名与类型相同、没有返回类型
作⽤:完成对类的对象初始化创建⼀个类的新对象时,系统会⾃动调⽤该构造函数初始化新对象, 如果没有写定义,那么系统会⾃动提供⼀个不带任何参数的public 构造函数
1 |
|
1. 封装(Encapsulation)
封装是指将数据(属性)和操作数据的代码(方法)封装在一个对象内部,隐藏对象的属性和实现细节,仅对外提供公共的访问方式(如getter和setter方法)。这样做的目的是提高代码的安全性、可维护性和可重用性。封装使得对象的设计者与使用者分离,使用者只需要通过公共接口与对象交互,而不需要知道对象内部的具体实现细节。
2. 继承(Inheritance)
继承是一种创建新类的方式,新创建的类(称为子类或派生类)可以继承一个或多个已存在的类(称为父类或基类)的属性和方法。子类可以拥有父类的所有属性和方法(除非在子类中进行了重写或隐藏),同时子类还可以添加自己特有的属性和方法。继承提高了代码的重用性和可扩展性,通过继承,我们可以方便地创建出具有层次结构的类体系。
3. 多态(Polymorphism)
多态是指允许不同类的对象对同一消息作出响应,即同一操作作用于不同的对象时,可以产生不同的结果。多态性可以通过方法重写(Override)和方法重载(Overload)来实现。方法重写是子类对父类方法的重新实现,子类对象调用该方法时将执行子类中的实现版本。方法重载是在同一个类中定义多个同名方法,但它们的参数列表不同,这样可以根据传入参数的不同来调用不同的方法。多态性提高了代码的灵活性和可扩展性,使得我们可以编写更加通用和可复用的代码。
1 |
|
不能可以但可以被重载
1 |
|
执⾏顺序:⽗类,⼦类,静态块,静态字段,⾮静态块,⾮静态字段,构造器,⽅法
1 |
|
1.对象:目前在使用new运算符在堆内存中开辟的内存空间称为对象。
2.引用:引用时一个变量,不一定是局部变量,还可能是成员变量。引用保存了内存地址,指向了堆内存当中的对象。
1 |
|
可以在接口中声明但不能初始化,可以声明属性的get,set方法,不能实现。
接口的好处
接⼝是⼀种约束,描述类的公共⽅法/公共属性,不能有任何的实现
好处是:结构清晰,类之间通信简单易懂,扩展性好,提⾼复⽤性。
⾯向interface编程,原意是指⾯向抽象协议编程,实现者在实现时要严格按协议来办
1 |
|
C#中的析构函数是什么?
1 | 在C#中,析构函数(Destructor)是一个特殊的方法,用于在对象被垃圾回收器(Garbage Collector, GC)销毁之前执行清理操作。析构函数不能带任何参数,也不能被显式调用;它是由.NET运行时自动调用的,当垃圾回收器确定对象不再被应用程序中的任何部分引用时。 |
解释C#中什么是命名空间,它是强制性的吗?
1 | 在C#中,命名空间(Namespace)是一种封装命名空间成员(类型、接口、委托、枚举等)的方式,它提供了一个逻辑上的分组和层次结构,帮助组织代码,避免命名冲突,以及使得代码更加模块化。命名空间的使用是可选的,不是强制性的,但它是一个被广泛推荐的最佳实践。 |
阐述什么是C# static关键字?
1 | 我们使用 static 关键字来创建静态类、静态方法或静态属性。当我们创建一个静态类时,该类中只能有静态数据成员和静态方法。静态意味着我们不能创建该类的实例。该类可以像 ClassName.methodName 一样直接使用。 |