2019-03-28
1、简述private、protected、friend、public、internal修饰符的访问权限
答案:private:私有成员,在类的内部才可以访问,只能从其声明上下文中进行访问。
protected:保护成员,该类内部和从该类派生的类中可以访问
friend:友元,声明friend元素的程序集中的代码可以访问该元素,而不能从程序集外部访问。
protected friend:在派生类或同一程序集内都可以访问。
public:公共成员,完全公开,没有访问限制。
internal:在同一命名空间内可以访问。(用的较少)
2、列举ASP.NET页面之间传递值的几种方式
1)使用QueryString,如:http://www.abc.com?id=1;response,Redirect()....
2)Session变量
3)Server.Transfer
4)Application
5)Cache
6)使用HttpContext的Item属性
7)使用文件
8)数据库
9)Cookie
Server.Transfer 和 Response.Redirect 用法区别
asp.net中,后台传值方式目前大多数都是用Response.Redirect("页面地址")来重定向页面的,但是现在还有一种方式可以达到重定向页面的作用,而且在某时刻会起到一种很棒的效果,那就是使用Server.Transfer("页面地址")来重定向地址。
Respinse.Redirect:会将地址输出到浏览器,执行重定向操作。但是请注意,在程序执行到Response.Redirect("页面地址")语句时,会立即中断当前页面的生命周期,直接向客户端返回信息,让客户端进行重定向操作。这个时候,页面URL将会显示重定向后的地址。
Server.Transfer:是一个很奇特的方法。当使用Server.Transfer方法重定向页面时,虽然页面也会被重定向至指定页,但是并不会在浏览器的URL上体现出来,并且若重定向的页面后有参数,也不会显示在浏览器的URL上。
事实上,传统的 Response.Redirect 会在程序运行至该语句时,强制中断该页面的生命周期,重定向至新的指定页面上去。而 Server.Transfer 并不会终止该页面,而是将当前页面响应的输出流终止。
Server.Transfer优缺点:
Server.Transfer因为浏览器URL上并没有看到有重定向痕迹,因此并不会占用较多的 HTTP 请求,因此这可以减轻服务器的压力,使你的服务器运行更快。不过,请注意,由于 "transfer" 只能在同一服务器端的同一站点间运行,所以你不能用 Server.Transfer 将用户重定向到另一服务器上的站点。要重定向到服务器以外的站点,只有 Response.Redirect 能办到。 其次,Server.Transfer 保留浏览器端的 URL 地址。这对流线型的数据输入很有帮助,不过这也增加了调试的复杂度。
3、一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少,用递归算法实现。
答案:
public static int Foo(int i)
{
if (i <= 0)
{
return 0;
}else if(i > 0 && i <= 2)
{
return 1;
}
else
{
return Foo(i - 1) + Foo(i - 2);
}
}
4、C#中的委托是什么?事件是不是一种委托?
答案:委托是将一种方法作为参数带入到另一种方法。
事件是一种特殊的委托。比如:onclick事件中的参数就是一种方法。
5、实现多态的过程中 overload 重载 与override 重写的区别
答案:区别:voerload重载是方法的名称相同,参数或者参数类型不同,进行多次重以适应不同的需要。
override是进行基类中函数的重写,实现多态。
6、请编程实现一个冒泡排序算法?(从大到小排序)
public static int[] Sort(int[] arr)
{
for (int i = 0; i < arr.Length-1; i++)
{
for (int j = i; j < arr.Length-1; j++)
{
if(arr[i] < arr[j + 1])
{
int temp = arr[i];
arr[i] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
7、描述一下C#中索引器的实现过程,是否只能根据数字进行索引
答案:C#通过提供索引器,可以象处理数组一样处理对象。特别是属性,每一个元素都以一个get或set方法暴露。索引器不单能索引数字(数组下标),还能索引一些HASHMAP的字符串,所以,通常来说,C#中类的索引器通常只有一个,就是THIS,但也可以有无数个,只要你的参数列表不同就可以了索引器和返回值无关, 索引器最大的好处是使代码看上去更自然,更符合实际的思考模式。
8、用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?
答案:
使用MVC模式分层
一般为3层
数据访问层,业务层,表示层。
数据访问层对数据库进行增删查改。
业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。
表示层为了与用户交互例如用户添加表单。
应用三层架构的优点
三层结构适合群体开发,每人可以有不同的分工,协同工作使效率倍增;各做各的模块,降低开发人员能力要求;方便系统功能的扩展以及后期的维护工作;最大优点是它的安全性。用户端只能通过逻辑层来访问数据层,减少了入口点,把很多危险的系统功能都屏蔽了。可以更好的支持分布式计算环境。逻辑层的应用程序可以有多个机器上运行,充分利用网络的计算功能。分布式计算的潜力巨大,远比升级CPU有效。
B/S工作原理:https://www.jianshu.com/p/2efc65e3c204
9、什么是装箱和拆箱?
答案:装箱就是隐式的将一个值型转换为引用型对象。
拆箱就是将一个引用型对象转换成任意值型。
比如:
int i=0;
Syste.Object obj=i;
这个过程就是装箱!就是将 i 装箱!
比如:
int i=0;
System.Object obj=i;
int j=(int)obj;
这个过程前2句是将 i 装箱,后一句是将 obj 拆箱!
10、在C#中,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别。
答案:string str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间。
11、请详述在C#中类(class)与结构(struct)的异同?
答案:class可以被实例化,属于引用类型,class可以实现接口和单继承其他类,还可以作为基类型,是分配在内存的堆上的。
struct属于值类型,不能作为基类型,但是可以实现接口,是分配在内存的栈上的。
12、GC是什么? 为什么要有GC?
答案:GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:
System.gc()
Runtime.getRuntime().gc()
13、ADO.Net中常用的对象有哪些?分别描述一下。
答案:
DataSet:数据集
DataCommand:执行语句命令
DataAdapter:数据的集合,用语填充
DataReader:数据只读器
Connection:数据库连接对象
Command:数据库命令
14、String s = new String("xyz");创建了几个String Object?
答案:两个对象,一个是“xyz”,一个是指向“xyz”的引用对象
15、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
答案:会执行,在return前执行。
16、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
答案:Set里的元素是不能重复的,那么用iterator()方法来区分是否重复。equals()是用来判断两个Set是否相等。
17、如何处理几十万条并发数据?
答案:加锁
18、进程和线程的区别?
答案:进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。
详细说明:https://www.jianshu.com/p/40cd449e7f94
19、堆和栈的区别?
答案:栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。
堆:一般由程序员分配释放。用new、malloc等分配内存函数,分配得到的就是在堆上。
详细说明:https://www.jianshu.com/p/4cbb81fea902
20、成员变量和成员函数前加static的作用?
答案:它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状况。比如:类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。
21、DataReader与Dataset有什么区别?
答案:DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection,在线操作数据库.任何对SqlConnection的操作都会引发DataReader的异常.因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的..因为DataReader的特殊性和高性能.所以DataReader是只进的.你读了第一条后就不能再去读取第一条了. DataSet则是将数据一次性加载在内存中.抛弃数据库连接.读取完毕即放弃数据库连接.因为DataSet将数据全部加载在内存中.所以比较消耗内存.但是确比DataReader要灵活.可以动态的添加行,列,数据.对数据库进行回传更新操作
22、在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using 指令和语句 new 创建实例 new 隐藏基类中方法。
答案:using 引入名称空间或者使用非托管资源,使用完对象后自动执行实现了IDisposable接口的类的Dispose方法
new 新建实例或者隐藏父类方法
23、大概描述一下ASP.NET服务器控件的生命周期。
答案:初始化——加载试图状态——处理回发数据——加载——发送回发更改通知——处理回发事件——预呈现——保存状态——呈现——处置——卸载
24、HashMap和Hashtable的区别
答案:HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
HashMap不能保证随着时间的推移Map中的元素次序是不变的。
详细内容:https://www.jianshu.com/p/16fdcf43f358
25、<%# %> 和 <% %> 有什么区别?
答案:
<%# %>表示绑定的数据源
<% %>是服务器端代码块
26、.NET和C#有什么区别
.NET一般指 .NET FrameWork框架,它是一种平台,一种技术。
C#是一种编程语言,可以基于.NET平台的应用。
27、面向对象的语言具有什么特性
答案:封装、继承、多态
详细内容:https://www.jianshu.com/p/6ea33903d42c
28、sleep()和 wait() 有什么区别?
答案:sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。
这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级
(b)正在运行的线程因为其它原因而阻塞。
wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。
29、数组有没有length()这个方法? String有没有length()这个方法?
答案:数组没有length()方法,但有length属性。
String有length()方法。
30、子类对父类中虚方法的处理有重写(override)和覆盖(new),请说明它们的区别?
答案:有父类ParentClass和子类ChildClass、以及父类的虚方法VirtualMethod。有如下程序段:
ParentClass pc = new ChildClass();pc.VirtualMethod(...);
如果子类是重写(override)父类的VirtualMethod,则上面的第二行语句将调用子类的该方法
如果子类是覆盖(new)父类的VirtualMethod,则上面的第二行语句将调用父类的该方法
31、值类型和引用类型的区别?
答案:
类型图
值类型
C#的所有值类型均隐式派生自System.ValueType:
结构体:struct(直接派生于System.ValueType);
数值类型:
整型:sbyte(System.SByte的别名),short(System.Int16),int(System.Int32),long(System.Int64),byte(System.Byte),ushort(System.UInt16),uint(System.UInt32),ulong(System.UInt64),char(System.Char);浮点型:float(System.Single),double(System.Double);用于财务计算的高精度decimal型:decimal(System.Decimal)。bool型:bool(System.Boolean的别名);用户定义的结构体(派生于System.ValueType)。枚举:enum(派生于System.Enum);可空类型(派生于System.Nullable<T>泛型结构体,T?实际上是System.Nullable<T>的别名)。
引用类型
C#有以下一些引用类型:
数组(派生于System.Array)用户用定义的以下类型:
类:class(派生于System.Object);接口:interface(接口不是一个“东西”,所以不存在派生于何处的问题。Anders在《C#
Programming Language》中说,接口只是表示一种约定[contract]);委托:delegate(派生于System.Delegate)。object(System.Object的别名);字符串:string(System.String的别名)。
可以看出:
引用类型与值类型相同的是,结构体也可以实现接口;引用类型可以派生出新的类型,而值类型不能;引用类型可以包含null值,值类型不能(可空类型功能允许将 null 赋给值类型);引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。
32、UDP连接和TCP连接的异同
答案:
TCP——传输控制协议,提供的是面向连接、可靠地字节流服务。当客户和服务彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP——用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能够到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
33、.NET中GC的运行机制是怎样的?
答案:垃圾回收机制:是指收集释放托管堆 上不再被使用的对象内存。其过程基本包括:通过算法找到不再使用的对象、移动对象使所有仍被使用的对象紧靠托管堆的一边和调整各个状态变量。
垃圾回收的成本较高,对性能的影响较大。程序员在编写.NET代码时,应该避免不必要的内存分配,尽量减少或避免使GC.Collect来执行垃圾回收。
34、简述C#中重写、重载和隐藏的概念
重写:是指用override关键字重新实现基类中的虚方法,在运行过程中,无论通过那个类型的引用,真正对象类型的方法将被调用。
隐藏:是指用new关键字重新实现基类中的方法,在运行的过程中通过引用的类型判断应该调用那个类型的方法。
重载:是指多个方法共享同一个名字并且拥有相同的返回值,但是却可以拥有不同的参数列表。
35、.NET有哪几种定时器类型?
System.Windows.Forms.Timer
System.Threading.Timer
System.Timers.Timer
36、请解释委托的基本原理
答案:委托是一类继承自System.Delegate的类型,每个委托对象至少包含了一个指向某个方法的指针,该方法可以是实例方法,也可以是静态方法。
委托实现了回调方法的机制,能够帮助程序员设计更加简洁优美的面向对象程序。
37、委托回调静态方法和实例方法有何区别?
答案:当委托绑定静态方法时,内部的对象成员变量:_target将会被设置成null,而当委托绑定实例方法时,_target将会设置成指向该实例方法所属类型的一个实例对象,当委托被执行时,该对象实例将被用来调用实例方法。
38、什么是链式委托?
答案:链式委托指:一个由委托串成的链表,当链表上的一个委托被回调时,所有链表上该委托的后续委托将会被顺序执行。
39、Get请求和Post请求有何区别?
HTTP协议里有两种常用的请求:Get请求和Post请求。
Get请求把表单的数据显示地放在URL中,并且对长度和数据值编码有所限制。
Post请求把表单数据放到HTTP请求体中,并且没有长度限制。
40、介绍ASP.NET的页面生存周期
大致分为四类:
1.初始化
2.加载数据和页面
3.出发事件
4.保存状态并呈现页面
1.初始化:初始化包含PreInit、Init、和InitComplete三个步骤,其功能包含了初始化类对象、初始化主题主页面等特性,判断是否是第一次访问页面等初始功能。
2.加载数据和页面
这一类型包含了 LoadSate、ProcessPostDate、PreLoad、Load、ProcessPostData(第二次)等步骤。 首先从页面回传的数据加载入 ViewState对象,所有的数据都会以 Base64 编码随页面传入服务器。然后开始处理回传的数据,也就是把表单中的键/值对存入对象之中。随后就开始加载页面,程序员通常会在这里做一些初始化的编程,例如在 OnLoad 事件中编写页面初始化代码。最后会再次执行ProcessPostData,以处理 Load时候新添加的数据。
说明:两次执行 ProcessPostData通常会让程序员感到困惑,事实上这两次数据处理都是必须的。第一次处理保证了在执行页面加载之前,所有的数据从页面上被读入,这样页面加载时就可以访问这些数据。而第二次ProcessPostData则是为了使页面加载时新建立的控件中的数据能够得到处理。这两次处理缺一不可。
3.触发事件
触发事件包含了 ChangedEvents和PostBackEvent步骤。这里首先会比较ViewState中的数据和页面上一次回传的数据,觉得有哪些事件需要被触发,这里事件是逐一被触发的,但其顺序将无法确定。然后会查看是否触发Post Back 事件,该事件也就是页面提交的事件。
4.保存状态并呈现页面
这里会包含SaveState、SaveStateComplete、Render步骤。首先页面会编码保存所有的 ViewState 数据,然后将其嵌入到页面的一个隐藏控件中。接着转换所有的控件标签并生成页面 HTML,并且发送回客户端。
注意:上述分类并没有包含最终的 Unload 步骤,这是因为这个步骤虽然重要,但从不需要程序员关心,ASP.NET 会负责释放所有对象的资源。
41、举例几种实现页面跳转的方法
答案:Response.Redirect
Server.Transger
Server.Execute
javascript脚本
超链接