日常问题总结 一
#堆和栈的区别
栈是编译期间就分配好的空间,因此在代码中必须就栈的大小有明确的定义。局部值类型变量、值类型参数等都在栈内存中。堆是程序运行期间动态分配的内存空间,可以根据程序的运行情况调整分配的堆内存大小。
#下面程序的执行结果?
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
)