.NET面试题解析(04)-类型、方法与继承

常见面试题目:

1. 所有类型都继承System.Object吗?

2. 解释virtual、sealed、override和abstract的区别

3. 接口和类有什么异同?

4. 抽象类和接口有什么区别?使用时有什么需要注意的吗?

5. 重载与覆盖的区别?

6. 在继承中new和override相同点和区别?看下面的代码,有一个基类A,B1和B2都继承自A,并且使用不同的方式改变了父类方法Print()的行为。测试代码输出什么?为什么?

public void DoTest()
{
    B1 b1 = new B1(); B2 b2 = new B2(); b1.Print(); b2.Print(); //按预期应该输出 B1、B2  A ab1 = new B1(); A ab2 = new B2(); ab1.Print(); ab2.Print(); //这里应该输出什么呢? } public class A { public virtual void Print() { Console.WriteLine("A"); } } public class B1 : A { public override void Print() { Console.WriteLine("B1"); } } public class B2 : A { public new void Print() { Console.WriteLine("B2"); } }

7. 下面代码中,变量a、b都是int类型,代码输出结果是什么?

复制代码
int a = 123;
int b = 20; var atype = a.GetType(); var btype = b.GetType(); Console.WriteLine(System.Object.Equals(atype,btype)); Console.WriteLine(System.Object.ReferenceEquals(atype,btype));
复制代码

8.class中定义的静态字段是存储在内存中的哪个地方?为什么会说她不会被GC回收?

  类型基础知识梳理

微笑 类型Type简述

通过本系列前面几篇文章,基本了解了值类型和引用类型,及其相互关系。如下图,.NET中主要的类型就是值类型和引用类型,所有类型的基类就是System.Object,也就是说我们使用FCL提供的各种类型的、自定义的所有类型都最终派生自System.Object,因此他们也都继承了System.Object提供的基本方法。

System.Object可以说是.NET中的万物之源,如果非要较真的话,好像只有接口不继承她了。接口是一个特殊的类型,可以理解为接口是普通类型的约束、规范,她不可以实例化。(实际编码中,接口可以用object表示,只是一种语法支持,此看法不知是否准确,欢迎交流)

在.NET代码中,我们可以很方便的创建各种类型,一个简单的数据模型、复杂的聚合对象类型、或是对客观世界实体的抽象。类 (class) 是最基础的 C# 类型(注意:本文主要探讨的就是引用类型,文中所述类型如没注明都为引用类型),支持继承与多态。一个c# 类Class主要包含两种基本成员:

  • 状态(字段、常量、属性等)
  • 操作(方法、事件、索引器、构造函数等)

利用创建的类型(或者系统提供的),可以很容易的创建对象的实例。使用 new 运算符创建,该运算符为新的实例分配内存,调用构造函数初始化该实例,并返回对该实例的引用,如下面的语法形式:

<类名>  <实例名> = new <类名>([构造函数的参数])

创建后的实例对象,是一个存储在内存上(在线程栈或托管堆上)的一个对象,那可以创造实例的类型在内存中又是一个什么样的存在呢?她就是类型对象(Type Object)

微笑 类型对象(Type Object)

看看下面的代码:

int a = 123;                                                           // 创建int类型实例a
int b = 20; // 创建int类型实例b var atype = a.GetType(); // 获取对象实例a的类型Type var btype = b.GetType(); // 获取对象实例b的类型Type Console.WriteLine(System.Object.Equals(atype,btype)); //输出:True Console.WriteLine(System.Object.ReferenceEquals(atype, btype));        //输出:True

任何对象都有一个GetType()方法(基类System.Object提供的),该方法返回一个对象的类型,类型上面包含了对象内部的详细信息,如字段、属性、方法、基类、事件等等(通过反射可以获取)。在上面的代码中两个不同的int变量的类型(int.GetType())是同一个Type,说明int在内存中有唯一一个(类似静态的)Systen.Int32类型。

上面获取到的Type对象(Systen.Int32)就是一个类型对象,她同其他引用类型一样,也是一个引用对象,这个对象中存储了int32类型的所有信息(类型的所有元数据信息)。

关于类型类型对象(Object Type):

>每一个类型(如System.Int32)在内存中都会有一个唯一的类型对象,通过(int)a.GetType()可以获取该对象;

>类型对象(Object Type)存储在内存中一个独立的区域,叫加载堆(Load Heap),加载堆是在进程创建的时候创建的,不受GC垃圾回收管制,因此类型对象一经创建就不会被释放的,他的生命周期从AppDomain创建到结束;

>前问说过,每个引用对象都包含两个附加成员:TypeHandle和同步索引块,其中TypeHandle就指向该对象对应的类型对象;

>类型对象的加载由class loader负责,在第一次使用前加载;

>类型中的静态字段就是存储在这里的(加载堆上的类型对象),所以说静态字段是全局的,而且不会释放;

可以参考下面的图,第一幅图描述了对象在内存中的一个关系, 第二幅图更复杂,更准确、全面的描述了内存的结构分布。

  图片来源

image

生气 方法表

类型对象内部的主要的结构是怎么样的呢?其中最重要的就是方法表,包含了是类型内部的所有方法入口,关于具体的细节和原理这里不多赘述(太多了,可以参考文末给的参考资料),本文只是初步介绍一下,主要目的是为了解决第6题。

public class A
{
    public virtual void Print() { Console.WriteLine("A"); } } public class B1 : A { public override void Print() { Console.WriteLine("B1"); } } public class B2 : A { public new void Print() { Console.WriteLine("B2"); } }

还是以第6题的代码为例,上面的代码中,定义两个简单的类,一个基类A,,B1和B2继承自A,然后使用不同的方式改变了父类方法的行为。当定义了b1、b2两个变量后,内存结构示意图如下:

B1 b1 = new B1();
B2 b2 = new B2();

image

方法表的加载

  • 方法表的加载时父类在前子类在后的,首先加载的是固定的4个来自System.Object的虚方法:ToString, Equals, GetHashCode, and Finalize;
  • 然后加载父类A的虚方法;
  • 加载自己的方法;
  • 最后是构造方法:静态构造函数.cctor(),对象构造函数.ctor();

方法表中的方法入口(方法表槽 )还有很多其他的信息,比如会关联方法的IL代码以及对应的本地机器码等。其实类型对象本身也是一个引用类型对象,其内部同样也包含两个附件成员:同步索引块和类型对象指针TypeHandel,具体细节、原理有兴趣的可以自己深入了解。

方法的调用:当执行代码b1.Print()时(此处只关注方法调用,忽略方法的继承等因素),通过b1的TypeHandel找到对应类型对象,然后找到方法表槽,然后是对应的IL代码,第一次执行的时候,JIT编译器需要把IL代码编译为本地机器码,第一次执行完成后机器码会保留,下一次执行就不需要JIT编译了。这也是为什么说.NET程序启动需要预热的原因。

眨眼 .NET中的继承本质

方法表的创建过程是从父类到子类自上而下的,这是.NET中继承的很好体现,当发现有覆写父类虚方法会覆盖同名的父方法,所有类型的加载都会递归到System.Object类。

  • 继承是可传递的,子类是对父类的扩展,必须继承父类方法,同时可以添加新方法。
  • 子类可以调用父类方法和字段,而父类不能调用子类方法和字段。 
  • 子类不光继承父类的公有成员,也继承了私有成员,只是不可直接访问。
  • new关键字在虚方法继承中的阻断作用,中断某一虚方法的继承传递。

因此类型B1、B2的类型对象进一步的结构示意图如下:

  • 在加载B1类型对象时,当加载override B1.Print(“B1”)时,发现有覆写override的方法,会覆盖父类的同名虚方法Print(“A”),就是下面的示意图,简单来说就是在B1中Print只有一个实现版本;
  • 加载B2类型对象时,new关键字表示要隐藏基类的虚方法,此时B2中的Print(“B2”)就不是虚方法了,她是B2中的新方法了,简单来说就是在B2类型对象中Print有2个实现版本;

image

 

B1 b1 = new B1();

B2 b2 = new B2();
b1.Print(); b2.Print();      //按预期应该输出 B1、B2

A ab1 = new B1(); 
A ab2 = new B2();
ab1.Print(); ab2.Print();   //这里应该输出什么呢?

上面代码中红色高亮的两行代码,用基类(A)和用本身B1声明到底有什么区别呢?类似这种代码在实际编码中是很常见的,简单的概括一下:

  • 无论用什么做引用声明,哪怕是object,等号右边的[ = new 类型()]都是没有区别的,也就说说对象的创建不受影响的,b1和ab1对象在内存结构上是一致的;
  • 他们的的差别就在引用指针的类型不同,这种不同在编码中智能提示就直观的反应出来了,在实际方法调用上也与引用指针类型有直接关系;
  • 综合来说,不同引用指针类型对于对象的创建(new操作)不影响;但对于对象的使用(如方法调用)有影响,这一点在上面代码的执行结果中体现出来了!

上面调用的IL代码:

image

对于虚方法的调用,在IL中都是使用指令callvirt,该指令主要意思就是具体的方法在运行时动态确定的:

callvirt使用虚拟调度,也就是根据引用类型的动态类型来调度方法,callvirt指令根据引用变量指向的对象类型来调用方法,在运行时动态绑定,主要用于调用虚方法。

不同的类型指针在虚拟方法表中有不同的附加信息作为标志来区别其访问的地址区域,称为offset。不同类型的指针只能在其特定地址区域内进行执行。编译器在方法调用时还有一个原则:

执行就近原则:对于同名字段或者方法,编译器是按照其顺序查找来引用的,也就是首先访问离它创建最近的字段或者方法。

因此执行以下代码时,引用指针类型的offset指向子类,如下图,,按照就近查找执行原则,正常输出B1、B2

B1 b1 = new B1();

 B2 b2 = new B2();
b1.Print(); b2.Print();      //按预期应该输出 B1、B2

image

而当执行以下代码时,引用指针类型都为父类A,引用指针类型的offset指向父类,如下图,按照就近查找执行原则,输出B1、A。

A ab1 = new B1(); 
A ab2 = new B2();
ab1.Print(); ab2.Print();   //这里应该输出什么呢?

image

  .NET中的继承

大笑 什么是抽象类

抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,也不能被密封。

基本特点:

  • 抽象类使用Abstract声明,抽象方法也是用Abstract标示;
  • 抽象类不能被实例化;
  • 抽象方法必须定义在抽象类中;
  • 抽象类可以继承一个抽象类;
  • 抽象类不能被密封(不能使用sealed);
  • 同类Class一样,只支持单继承;

一个简单的抽象类代码:

public abstract class AbstractUser
{
    public int Age { get; set; } public abstract void SetName(string name); }

IL代码如下,类和方法都使用abstract修饰:

image

大笑 什么是接口?

接口简单理解就是一种规范、契约,使得实现接口的类或结构在形式上保持一致。实现接口的类或结构必须实现接口定义中所有接口成员,以及该接口从其他接口中继承的所有接口成员。

基本特点:

  • 接口使用interface声明;
  • 接口类似于抽象基类,不能直接实例化接口;
  • 接口中的方法都是抽象方法,不能有实现代码,实现接口的任何非抽象类型都必须实现接口的所有成员:
  • 接口成员是自动公开的,且不能包含任何访问修饰符。
  • 接口自身可从多个接口继承,类和结构可继承多个接口,但接口不能继承类。

下面一个简单的接口定义:

public interface IUser
{
    int Age { get; set; } void SetName(string name); }

下面是IUser接口定义的IL代码,看上去是不是和上面的抽象类AbstractUser的IL代码差不多!接口也是使用.Class ~ abstract标记,方法定义同抽象类中的方法一样使用abstract virtual标记。因此可以把接口看做是一种特殊的抽象类,该类只提供定义,没有实现。

image

另外一个小细节,上面说到接口是一个特殊的类型,不继承System.Object,通过IL代码其实可以证实这一点。无论是自定义的任何类型还是抽象类,都会隐式继承System.Object,AbstractUser的IL代码中就有“extends [mscorlib]System.Object”,而接口的IL代码并没有这一段代码。

大笑 关于继承

关于继承,太概念性了,就不细说了,主要还是在平时的搬砖过程中多思考、多总结、多体会。在.NET中继承的主要两种方式就是类继承和接口继承,两者的主要思想是不一样的:

  • 类继承强调父子关系,是一个“IS A”的关系,因此只能单继承(就像一个人只能有一个Father);
  • 接口继承强调的是一种规范、约束,是一个“CAN DO”的关系,支持多继承,是实现多态一种重要方式。

更准确的说,类可以叫继承,接口叫“实现”更合适。更多的概念和区别,可以直接看后面的答案,更多的还是要自己理解。

  题目答案解析:

1. 所有类型都继承System.Object吗?

基本上是的,所有值类型和引用类型都继承自System.Object,接口是一个特殊的类型,不继承自System.Object。

2. 解释virtual、sealed、override和abstract的区别

  • virtual申明虚方法的关键字,说明该方法可以被重写
  • sealed说明该类不可被继承
  • override重写基类的方法
  • abstract申明抽象类和抽象方法的关键字,抽象方法不提供实现,由子类实现,抽象类不可实例化。

3. 接口和类有什么异同?

不同点:

1、接口不能直接实例化。

2、接口只包含方法或属性的声明,不包含方法的实现。

3、接口可以多继承,类只能单继承。

4、类有分部类的概念,定义可在不同的源文件之间进行拆分,而接口没有。(这个地方确实不对,接口也可以分部,谢谢@xclin163的指正)

5、表达的含义不同,接口主要定义一种规范,统一调用方法,也就是规范类,约束类,类是方法功能的实现和集合

相同点:

1、接口、类和结构都可以从多个接口继承。

2、接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。

3、接口和类都可以包含事件、索引器、方法和属性。

4. 抽象类和接口有什么区别?

1、继承:接口支持多继承;抽象类不能实现多继承。

2、表达的概念:接口用于规范,更强调契约,抽象类用于共性,强调父子。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于"Is A"的关系;而接口是定义行为规范,强调“Can Do”的关系,因此对于实现接口的子类来说,相对于接口来说,是"行为需要按照接口来完成"。

3、方法实现:对抽象类中的方法,即可以给出实现部分,也可以不给出;而接口的方法(抽象规则)都不能给出实现部分,接口中方法不能加修饰符。

4、子类重写:继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须重写,给出相应的方法和属性实现。

5、新增方法的影响:在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。

6、接口可以作用于值类型(枚举可以实现接口)和引用类型;抽象类只能作用于引用类型。

7、接口不能包含字段和已实现的方法,接口只包含方法、属性、索引器、事件的签名;抽象类可以定义字段、属性、包含有实现的方法。

5. 重载与覆盖的区别?

重载:当类包含两个名称相同但签名不同(方法名相同,参数列表不相同)的方法时发生方法重载。用方法重载来提供在语义上完成相同而功能不同的方法。

覆写:在类的继承中使用,通过覆写子类方法可以改变父类虚方法的实现。

主要区别

1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系。
2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。
3、覆盖要求参数列表相同;重载要求参数列表不同。
4、覆盖关系中,调用那个方法体,是根据对象的类型来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。

6. 在继承中new和override相同点和区别?看下面的代码,有一个基类A,B1和B2都继承自A,并且使用不同的方式改变了父类方法Print()的行为。测试代码输出什么?为什么?

public void DoTest()
{
    B1 b1 = new B1(); B2 b2 = new B2(); b1.Print(); b2.Print(); //按预期应该输出 B1、B2  A ab1 = new B1(); A ab2 = new B2(); ab1.Print(); ab2.Print(); //这里应该输出什么呢?输出B1、A } public class A { public virtual void Print() { Console.WriteLine("A"); } } public class B1 : A { public override void Print() { Console.WriteLine("B1"); } } public class B2 : A { public new void Print() { Console.WriteLine("B2"); } }

7. 下面代码中,变量a、b都是int类型,代码输出结果是什么?

int a = 123;
int b = 20; var atype = a.GetType(); var btype = b.GetType(); Console.WriteLine(System.Object.Equals(atype,btype)); //输出True Console.WriteLine(System.Object.ReferenceEquals(atype,btype)); //输出True

8.class中定义的静态字段是存储在内存中的哪个地方?为什么会说她不会被GC回收?

随类型对象存储在内存的加载堆上,因为加载堆不受GC管理,其生命周期随AppDomain,不会被GC回收。

posted on 2019-12-11 11:08  不灬赖  阅读( ...)  评论( ...)  编辑 收藏
问·道
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.NET面试题解析(01)-值类型与引用类型
LJianDong的博客
11-30 170
常见面试题目: 1. 值类型和引用类型的区别? 2. 结构和类的区别? 3. delegate是引用类型还是值类型?enum、int[]和string呢? 4. 堆和栈的区别? 5. 什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗? 6.“结构”对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的吗? 7. 理解参数按值传递?以及按引用传递? 8. out 和 re...
.net 面试题
05-30
### .NET面试题 #### 介绍 .NET面试题旨在评估应聘者对.NET框架的理解和实际应用能力。这些面试题不仅考察了应聘者的理论知识,还涉及到了实际开发中的常见问题和解决方案。 #### 第一章:基础知识 1. **.NET ...
.Net开发2020年最新面试题
02-15
总结了过去几年企业最常见的问题,可以作为参考,有没有价值你说了算,正所谓面试造火箭,上班拧螺丝。 (.Net开发最新面试题库,C#行业面试高频出现的问题。)
.net面试题系列文章七(附答案)
aao84421的博客
02-23 110
内容正文: 1.简述 private、 protected、 public、 internal 修饰符的访问权限。 private : 私有成员, 在类的内部才可以访问。protected : 保护成员,该类内部和继承类中可以访问。public : 公共成员,完全公开,没有访问限制。internal: 在同一命名空间内可以访问。 2.写出一条Sql语句: 取出表A中第31到第40...
.Net 面试题 汇总(六)
weixin_30872733的博客
04-18 1027
一.填空题 1.面向对象的语言具有(继承)性、(多态)性、(封装)性。 2.能用foreach遍历访问的对象需要实现 (IEnumberable)接口或声明(GetEnumberator)方法类型。 3.列举ADO.net中的五个主要对象(Command)、(Connection)、(DataReader)、(DataSet)、(DataAdapter)。 4.C#中的三元运算符是__(...
.net 面试题系列文章六(附答案)
weixin_34326429的博客
12-19 74
    1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 private : 私有成员, 在类的内部才可以访问。protected : 保护成员,该类内部和继承类中可以访问。public : 公共成员,完全公开,没有访问限制。internal: 在同一命名空间内可以访问。   2.写出一条Sql语句: 取出表A中第31到第40记...
ASP.NET面试题解析:访问权限、页面间值传递与递归算法
在ASP.NET的面试过程中,面试官可能会考察应聘者对基础概念和技术的掌握程度。以下是一些关键知识点的详细解析: 1. **访问修饰符**: `private`、`protected`、`public` 和 `internal` 是C#中用于定义类成员访问...
.NET笔试必备:ASP.NET面试题解析
“这是一份关于.NET笔试题的资料,包含了ASP.NET面试题和一些常见的编程问题,旨在帮助求职者准备.NET相关的工作面试。” 在这份.NET笔试题中,我们可以看到一系列针对.NET开发者的重要知识点,包括访问修饰符的...
.net面试题能力测试.doc
01-08
### .NET 面试题能力测试知识点解析 #### 1. 填空题知识点解析 **1. C#中的三元运算符:** C#中的三元运算符是一种简洁的方式来表达条件语句,它的语法格式为 `条件 ? 表达式1 : 表达式2`。如果条件为真,则执行...
C#面试基础题(几个基本的面试题 但很多人不是很清楚)
03-27
c#基本概念 但是一些学校都不讲 我们学校就没讲 但是很重要 是理解c#的基础
c#面试基础题
03-24
这是网上的一份关于c#面试的基础题,文档中标注了来源,做成文档方便打印学习
C#中的基本知识点(面试时经常被问到)
10-28
委托 接口与抽象类的区别 装箱和拆箱 结构与类的区别 static构造函数 序列化 等等
C#(基础)常见面试题目及部分答案
03-17
这些题目是常见的一些题目,是C#的基础,虽然不简单,但是也不是很难,很有用的东西。
C#.NET面试题基础篇答案
08-09
C#.NET面试题基础篇答案
.net面试题6
CrazyMax_zh的博客
11-27 115
C#中的多线程通过使用Thread类、Task类、ThreadPool等机制实现,可以执行各种并发操作,如异步I/O、并行计算、异步等待等。并发编程是一种复杂的编程模型,需要程序员了解线程同步、锁机制、死锁处理、并发安全、线程池等知识,以保证程序的正确性和性能。通过使用事件,可以实现松耦合和分离关注点,方便应对程序的变化和扩展。C#中的并行编程主要使用Parallel类、Task Parallel Library (TPL)、async/await等机制实现,允许程序员编写高性能、高效和易于扩展的代码。
c#.Net经典面试题目(6)_.Net编程_网络编程
石桥上的傻瓜
08-16 448
<br />51.数组有没有length()这个方法? String有没有length()这个方法.net 面试题 广州 找工作<br />答:数组没有length()这个方法,有length的属性。String有有length()这个方法。<br />52.sleep() 和 wait() 有什么区别?<br />答:sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的
.NET常见面试题汇总
最新发布
m0_65664914的博客
01-13 2120
首先,汇总一共分为三部分:一是关于.NET技术的面试问题,二是关于.NET项目中的实际问题,三是历年出现过一些面试题汇总。
JavaRedis面试试连环问,快看看你能走到哪一步 -net6面试题
Java进阶营的博客
04-11 578
1、Redis 有哪几种数据淘汰策略? 答: noeviction:返回错误当内存限制达到,并且客户端尝试执行会让更多内存被使用的命令。 allkeys-LRU: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。 volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。 allkeys-random: 回收随机的键使得新添加的数据有空间存放。 volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键.
写文章

热门文章

  • Android studio如何用真机调试,只需两步 57373
  • QTableWidget的动态添加基本用法 36534
  • C语言中-条件编译#ifdef的妙用详解_透彻 28392
  • Win10如何使用win7的照片查看器 13894
  • Qt 将TableWidget表格数据保存到Excle详细介绍 9583

分类专栏

  • 设计模式
  • 正则表达式 1篇
  • 3D图像 1篇
  • 设计原则 1篇
  • Innosetup 3篇
  • qt 7篇
  • C语言 5篇
  • C++ 6篇
  • Oracle 3篇
  • Android Studio 1篇
  • Ubuntu 5篇
  • 服务器 2篇
  • 数据库 2篇
  • C ++ 1篇
  • 算法
  • c# 14篇
  • mysql
  • WPF 2篇

最新评论

  • InnoSetup 根据选择的安装语言显示不同语言的(协议)License和更新说明

    m0_60740693: 很好的文章,使我旋转,完美解决表情包

  • WPF自定义控件与样式(7)-列表控件DataGrid与ListView自定义样式

    云上游@: 代码都不全呢

  • InnoSetup 根据选择的安装语言显示不同语言的(协议)License和更新说明

    顾白白baibai: 中文许可协议乱码怎么解决呢

  • C语言中-条件编译#ifdef的妙用详解_透彻

    薯可: 引用「# if (define (DBG)) || (define (DBG1))」 第六点:这是个错误啊,要使用#if (defined (DBG)) || (defined (DBG1)) 一字之差谬之千里

  • QT运行显示QOCI driver not loaded等数据库驱动问题解决办法

    嵌入式_GG: 1985658560@qq.com 求求了

大家在看

  • HTML 进阶指南
  • Linux 命令行参数 实现自定义选项和参数实现读取时间各个值得功能 187
  • JavaScript 网页设计案例
  • socks代理自述优缺点
  • C语言:N个数找最大和最小 68

最新文章

  • WPF自定义控件与样式(7)-列表控件DataGrid与ListView自定义样式
  • WPF自定义控件与样式(6)-ScrollViewer与ListBox自定义样式
  • WPF自定义控件与样式(14)-轻量MVVM模式实践
2022年13篇
2020年32篇
2019年70篇
2018年30篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家玻璃钢蔬菜雕塑生产厂家莆田手糊法玻璃钢雕塑生产运动商场美陈雪梨玻璃钢卡通雕塑设计铜陵景观玻璃钢雕塑价位玻璃钢园林景观雕塑吉首玻璃钢雕塑设计公司哪家好玻璃钢人物雕塑怎么算价格西宁彩色玻璃钢雕塑定做商场美陈亮化定制新绛玻璃钢花盆花器深圳走廊商场美陈厂家直销盐城户外玻璃钢雕塑肖像校园玻璃钢雕塑生产厂家平凉人物玻璃钢雕塑定制定西景区玻璃钢雕塑哪家好玻璃钢花盆与陶瓷花盆哪个好秋季商场美陈元素宁波汕头玻璃钢雕塑樟树玻璃钢景观雕塑敦化玻璃钢雕塑施工池州玻璃钢雕塑销售电话溧阳春节商场美陈玄武商场美陈布展玻璃钢雕塑修补德州花朵玻璃钢仿铜雕塑公司技能培训玻璃钢雕塑运城玻璃钢浮雕抽象景观雕塑杭州户外景观玻璃钢雕塑许昌玻璃钢艺术雕塑厂家哪家好香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化