日常问题总结 一

#堆和栈的区别

栈是编译期间就分配好的空间,因此在代码中必须就栈的大小有明确的定义。局部值类型变量、值类型参数等都在栈内存中。堆是程序运行期间动态分配的内存空间,可以根据程序的运行情况调整分配的堆内存大小。

 

#下面程序的执行结果?

inti = 10;

Console.WriteLine(i++);=>10 

Console.WriteLine(++i);=>12

i++表达式的值为i自增之前的值,所以打印10,执行完成后i变成11,执行++i的时候表达式的值为自增以后的值12。

#在dotnet中类(class)与结构(struct)的异同?

Class可以被实例化,属于引用类型,是分配在内存的堆上的,引用传递。Struct属于值类型,是分配在内存的栈上的,复制传递。Int32、Boolean等都属于结构体。

 

#请叙述属性与索引器的区别   

属性通过名称标识。索引器通过签名标识。属性通过简单名称或成员访问来访问。索引器通过元素访问来访问。属性可以为静态成员或实例成员。索引器必须为实例成员。属性的get访问器没有参数。 索引器的get访问器具有与索引器相同的形参表。属性的set访问器包含隐式value参数。除了value参数外,索引器的set访问器还具有与索引器相同的形参表。

 

# C#中的接口和类有什么异同

实例化、继承、成员方面

 

# 抽象类和接口的异同

相同点: 都不能被直接实例化,都可以通过继承实现其抽象方法。

不同点: 接口支持多继承;抽象类不能实现多继承。接口只能定义行为;抽象类既可以定义行为,还可能提供实现。 接口只包含方法(Method)、属性(Property)、索引器(Index)、事件(Event)的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。 

#虚方法的使用场合、与接口的区别

子类重新定义父类的某一个方法时,必须把父类的方法定义为virtual。在定义接口中不能有方法体,虚方法可以。实现时,子类可以不重新定义虚方法,但如果一个类继承接口,那必须实现这个接口。

 

#C#中的委托是什么,事件和委托的关系。

委托可以理解为函数指针。委托和事件没有可比性,因为委托是类型,事件是对象,下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。事件的内部是用委托实现的。因为对于事件来讲,外部只能“注册自己+=、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。事件是用来阉割委托实例的,类比用一个自定义类阉割List。事件只能add、remove自己,不能赋值,事件内部就是一个private的委托和add、remove两个方法

 

#能用foreach遍历访问的对象的要求

需要实现IEnumerable接口或声明GetEnumerator方法的类型。

 

#using关键字有什么用?什么是IDisposable?

using可以声明namespace的引入,还可以实现非托管资源的释放。实现了IDisposiable的类在using中创建,using结束后会自动调用该对象的Dispose方法,释放资源。using用于资源释放时,等价于try……finally。

 

#WebService基本概念

WebService解决的三个问题:接口的自我描述;采用Http协议等常规协议,不用写原始的Socket;基于Web服务器,不占用80端口之外的端口。

UDDI(Universal Description Discovery and Integration)用来自动发现WebService的协议。

WSDL(WebService Defination Language)是对WebService上的方法名、参数进行描述的协议。对接口的自描述。

SOAP(Simple Object Access Protocol)是对参数、返回值以什么样的格式进行传递进行描述的协议,是对报文的格式规范。

SOAP和HTTP的关系:SOAP基于Http协议的,和普通网页不同的是网页返回HTML,SOAP则是符合SOAP协议的XML数据。

 

#横纵表转换

纵表结构 TableA 

Name

Course

Grade

张三

语文

75

张三

数学

80

张三

英语

90

李四

语文

95

李四

数学

55

 横表结构 TableB

Name

语文

数学

英语

张三

75

80

90

李四

95

55

0

 

纵表转横表:

selectName,

sum(caseCourse when '语文' then Grade else 0 end) as Chinese,

sum(caseCourse when '数学' then Grade else 0 end) as Math,

sum(caseCourse when '英语' then Grade else 0 end) as English

fromTableA

groupby Name

横表转纵表:

select* from

(

       select Name,Course='语文',Grade=Chinese fromTableB

       union

       select Name,Course='数学',Grade=Math fromTableB

       union

       select Name,Course='英语',Grade=English fromTableB

) awhere grade!=0

orderby Name,Grade desc

#删除姓名、年龄重复的记录,只保留ID最大的一条

1     tom       18   3000

2     tom       18   3300

3     gal  28   2000

4     tim  28   2200

5     gal  28   2020

select* from T_Duplicate where ID in

(

       select MAX(id) from T_Duplicate

       group by name,age

)

posted @ 2017-07-20 22:26  zhixin9001  阅读(135)  评论(0编辑  收藏  举报