C#重要概念
1. OOP部分
CTS、CLS、CLR分别作何解释?
答:CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。
.NET和C#有什么区别
NET一般指 .NET FrameWork框架,它是一种平台,一种技术。
C#是一种编程语言,可以基于.NET平台的应用。
.NET可以跨平台吗
可以,使用Mono、unity、.net core 可以使.net程序运行在Linux、Android、IOS、Mac等环境
using的作用
(1)引入命名空间。
(2)在程序代码过中,使用using,可以在using结束时,回收所有using段内的内存。
接口与类的区别
1.接口中只能包含方法。(方法、属性、索引器、事件)
2.接口中的方法不能有任何实现
3.接口中的成员不能有任何访问修饰符(哪怕是public)
4.接口不能被实例化
5.实现接口的类,必须实现接口的所有成员(这里跟抽象类一样)
6.类不能多继承,所以在某些情况下,只能用接口来代替。接口可以多实现(一个类可以继承多个接口,而只能继承一个类)
7.接口的主要目的就是为了实现多态
8.当一个类,同时继承了某个类,并且也实现了某些接口的时候,必须要将继承的类写在第一个(如果一个类同时继承了父类和接口的时候,要把父类写在最前面)
9.当多个类,都具有某个或某几个功能时(方法),但是这几个类型又不属于相同的系列(这几个类型没有共同的父类,就不能用抽象类。),所以这时,为了实现多态就可以考虑把这几个类型共有的方法提取到一个接口中,让这几个类型分别实现该接口
10.当父类实现接口,子类继承父类。那么 接口就可以引用子类
11.不要在一个接口中写过多的方法,避免造成接口污染。可编写多个接口,在每个接口中,分别定义方法
12.实现接口方法的时候,不要有override关键字,直接跟平常定义一样
13.接口方法的显示实现,如果多个接口里有相同的方法名。那么第一个方法名默认的引用的是排在最前面的接口,如果要使用后面接口的方法,就要显示实现:接口名.方法名。访问修饰符是private
字段与属性有什么异同?
属性提供了更为强大的,灵活的功能来操作字段
出于面向对象的封装性,字段一般不设计为Public
属性允许在set和get中编写代码
属性允许控制set和get的可访问性,从而提供只读或者可读写的功能 (逻辑上只写是没有意义的)
属性可以使用override 和 new
静态成员和非静态成员的区别?
静态变量使用 static 修饰符进行声明,静态成员在加类的时候就被加载(上一篇中提到过,静态字段是随类型对象存放在Load Heap上的),通过类进行访问。
不带有static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问 。
一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值 。
静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等。
构造函数的特点
1.构造函数的命名必须和类名完全相同;
2.构造函数的功能主要用于在类的对象创建时定义初始化的状态.它没有返回值,也不能用void来修饰.这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择.而其他方法都有返回值.即使是void返回值,尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的.
3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用,一般方法在程序执行到它的时候被调用.
4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的.而一般方法不存在这一特点
5当一个类只定义了私有的构造函数,将无法通过new关键字来创建其对象,当一个类没有定义任何构造函数,C#编译器会为其自动生成一个默认的无参的构造函数.
重写与重载的区别
重写:当一个子类继承一父类,而子类中的方法与父类中的方法的名称,参数个数、类型都完全一致时,就称子类中的这个方法重写了父类中的方法。
重载:一个类中的方法与另一个方法同名,但是参数表不同,这种方法称之为重载方法。
抽象方法与虚拟方法
1.抽象方法:使用abstract关键字
虚方法 :使用virtual关键字
2.虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。
3.抽象方法只能在抽象类中声明,虚方法不是。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。
4.抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。
什么是装箱和拆箱?
从值类型转换到引用类型是装箱。从引用类型转换到值类型是拆箱。
什么是非托管代码?
unsafe:非托管代码。不经过CLR运行。
多态的实现方式
多态:同一个操作,作用于不同的对象时,会有不同的结果。符合依赖于抽象,不依赖于具体的设计原则
C#的多态包括:接口多态,继承多态,其中继承多态又包括通过虚拟方法实现的多态和通过抽象方法实现的多态性
静态类的特点
它们仅包含静态成员
它们不能被实例化。
它们是密封的。编译器编译时自动生成sealed标记
它们不能包含实例构造函数。
简述一个引用对象的生命周期?
new创建对象并分配内存
对象初始化
对象操作、使用
资源清理(非托管资源)
GC垃圾回收
一个变量如果在其生存期内的某一时刻已经不再被引用,那么,这个对象就有可能成为垃圾
GC是什么,简述一下GC的工作方式?
GC是垃圾回收(Garbage Collect)的缩写,是.NET核心机制的重要部分。她的基本工作原理就是遍历托管堆中的对象,标记哪些被使用对象(哪些没人使用的就是所谓的垃圾),然后把可达对象转移到一个连续的地址空间(也叫压缩),其余的所有没用的对象内存被回收掉。
GC垃圾回收时的主要流程是?
① 标记:先假设所有对象都是垃圾,根据应用程序根Root遍历堆上的每一个引用对象,生成可达对象图,对于还在使用的对象(可达对象)进行标记(其实就是在对象同步索引块中开启一个标示位)。
② 清除:针对所有不可达对象进行清除操作,针对普通对象直接回收内存,而对于实现了终结器的对象(实现了析构函数的对象)需要单独回收处理。清除之后,内存就会变得不连续了,就是步骤3的工作了。
③ 压缩:把剩下的对象转移到一个连续的内存,因为这些对象地址变了,还需要把那些Root跟指针的地址修改为移动后的新地址。
GC在哪些情况下回收工作?
内存不足溢出时(0代对象充满时)
Windwos报告内存不足时,CLR会强制执行垃圾回收
CLR卸载AppDomian,GC回收所有
调用GC.Collect
其它情况,如主机拒绝分配内存,物理内存不足,超出短期存活代的存段门限
解释一下C#里的析构函数
C#里的析构函数其实就是终结器Finalize,因为长得像C++里的析构函数而已。
有些编程建议里不推荐使用析构函数要原因在于:第一是Finalize本身性能并不好;其次很多人搞不清楚Finalize的原理,可能会滥用,导致内存泄露,因此就干脆别用了
Finalize() 和 Dispose() 之间的区别?
Finalize() 和 Dispose()都是.NET中提供释放非托管资源的方式,他们的主要区别在于执行者和执行时间不同:
finalize由垃圾回收器调用;dispose由对象调用。
finalize无需担心因为没有调用finalize而使非托管资源得不到释放,而dispose必须手动调用。
finalize不能保证立即释放非托管资源,Finalizer被执行的时间是在对象不再被引用后的某个不确定的时间;而dispose一调用便释放非托管资源。
只有class类型才能重写finalize,而结构不能;类和结构都能实现IDispose。
另外一个重点区别就是终结器会导致对象复活一次,也就说会被GC回收两次才最终完成回收工作,这也是有些人不建议开发人员使用终结器的主要原因。
Dispose和Finalize方法在何时被调用?
Dispose一调用便释放非托管资源;
Finalize不能保证立即释放非托管资源,Finalizer被执行的时间是在对象不再被引用后的某个不确定的时间;
.NET中的托管堆中是否可能出现内存泄露的现象?
是的,可能会。比如:
不正确的使用静态字段,导致大量数据无法被GC释放;
没有正确执行Dispose(),非托管资源没有得到释放;
不正确的使用终结器Finalize(),导致无法正常释放资源;
其他不正确的引用,导致大量托管对象无法被GC释放;
在托管堆上创建新对象有哪几种常见方式?
new一个对象;
字符串赋值,如string s1=”abc”;
值类型装箱;
常量与只读的区别
const关键字用来声明编译时常量,readonly用来声明运行时常量。都可以标识一个常量,主要有以下区别:
1、初始化位置不同。const必须在声明的同时赋值;readonly即可以在声明处赋值,也可以在构造方法里赋值。
2、修饰对象不同。const即可以修饰类的字段,也可以修饰局部变量;readonly只能修饰类的字段 。
3、const是编译时常量,在编译时确定该值,且值在编译时被内联到代码中;readonly是运行时常量,在运行时确定该值。
4、const默认是静态的;而readonly如果设置成静态需要显示声明 。
5、支持的类型时不同,const只能修饰基元类型或值为null的其他引用类型;readonly可以是任何类型。
哪些类型可以定义为常量?常量const有什么风险?
基元类型或值为null的其他引用类型,常量的风险就是不支持跨程序集版本更新,常量值更新后,所有使用该常量的代码都必须重新编译。
值类型和引用类型的区别?
值类型包括简单类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等。
1、赋值方式:将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对象的引用(即内存地址,类似C++中的指针),而不复制对象本身。
2、继承:值类型不可能派生出新的类型,所有的值类型均隐式派生自 System.ValueType。但与引用类型相同的是,结构也可以实现接口。
3、null:与引用类型不同,值类型不可能包含 null 值。然而,可空类型允许将 null 赋给值类型(他其实只是一种语法形式,在clr底层做了特殊处理)。
4、每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值,值类型初始会默认为0,引用类型默认为null。
5、值类型存储在栈中,引用类型存储在托管堆中。
方法参数:值传递与引用传递的区别
值传递时,系统首先为被调用方法的形参分配内存空间,并将实参的值按位置一一对应复制给形参,此后,被调用方法中形参值得任何改变都不会影响到相应的实参;
引用传递时,系统不是将实参本身的值复制后传递给形参,而是将其引用值(即地址值)传递给形参,因此,形参所引用的该地址上的变量与传递的实参相同,方法体内相应形参值得任何改变都将影响到作为引用传递的实参。
堆和栈的区别?
线程堆栈:简称栈 Stack
托管堆: 简称堆 Heap
值类型大多分配在栈上,引用类型都分配在堆上;
栈由操作系统管理,栈上的变量在其作用域完成后就被释放,效率较高,但空间有限。堆受CLR的GC控制;
栈是基于线程的,每个线程都有自己的线程栈,初始大小为1M。堆是基于进程的,一个进程分配一个堆,堆的大小由GC根据运行情况动态控制;
.“结构”对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的吗?
结构是值类型,有两种情况会分配在对上面:
结构作为class的一个字段或属性,会随class一起分配在堆上面;
装箱后会在堆中存储,尽量避免值类型的装箱,值类型的拆箱和装箱都有性能损失,下一篇会重点关注;
C#支持哪几个预定义的值类型?C#支持哪些预定义的引用类型?
值类型:整数、浮点数、字符、bool和decimal
引用类型:Object,String
有几种方法可以判定值类型和引用类型?
简单来说,继承自System.ValueType的是值类型,反之是引用类型。
说说值类型和引用类型的生命周期?
值类型在作用域结束后释放。
引用类型由GC垃圾回收期回收。这个答案可能太简单了,更详细的答案在后面的文章会说到。
静态成员与实例成员的区别
静态成员:变量是和类相关联的,可以作为类中"共"有的变量(是一个共性的表现),不依赖特定对象的存在,访问的时候通过类名加点操作符加变量名来访问.
实例成员:实例成员变量是和对象相关联的,访问实例成员变量依赖于实例的存在.
区别:
(1)语法区别:静态成员有关键字static,非静态成员无static修饰;
(2)存储区别: 静态成员变量存储位于程序的全局变量存储区,其作用域限制为类内部,并且在整个程序运行期间只在内存中拥有一个存储位置,不会拷贝不会复制,只是一个;非静态成员变量存储位于对象的变量存储区,多个对象拥有多个变量的存储,只隶属于自己的的对象
(3)归属区别:静态成员隶属于类,无论对一个类创建多少个实例,它的静态成员都只有一个副本,在各个地方的改变都会改变其值;非静态成员隶属于它的对象,各自对象同一个非静态成员值的改变都不互相影响,有多少实例就有多少副本;
(4)生存周期区别: 知道了存储位置的区别也就不难理解生存周期的差异了,静态成员只要分配了空间则在整个程序运行期间,它都是存在的,只有程序关闭之后,它的内存才会被GC回收器收回,不过作用域仍然只限制于类的内部,在类外部调用时需要使用类类的非静态成员的生存周期跟随于隶属于对象的生存周期,对象消亡则非静态成员就会被回收;
(5)初始化顺序的区别:初始化都是最先初始化类的静态成员,然后才是非静态数据成员。
方法参数:ref与out的区别
当使用rel关键字时,表示是用引用的方式传递参数。实参和形参引用的都是同一个对象,改变其中一个的引用值,另一个也会改变。主要用在值类型按引用传递的情况
out修饰符与ref修饰符非常相似,除了以下两点:
1.在调用函数时不需要赋值。
2.在函数退出前必须赋值。
三层的优点
在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构.
微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(或为领域层)、表示层.
优点
1、开发人员可以只关注整个结构中的其中某一层;
2、可以很容易的用新的实现来替换原有层次的实现;
3、可以降低层与层之间的依赖;
4、有利于标准化;
5、利于各层逻辑的复用.
概括来说,分层式设计可以达至如下目标:分散关注、松散耦合、逻辑复用、标准定义.
简述 private、 protected、 public、internal 修饰符
private : 私有成员, 在类的内部才可以访问。
protected: 保护成员,该类内部和继承类中可以访问。
public: 公共成员,完全公开,没有访问限制。
internal:在同一命名空间内可以访问。
结构体与类的区别
1.结构体是一种值类型,而类是引用类型。值类型用于存储数据的值,引用类型用于存储对实际数据的引用。那么结构体就是当成值来使用的,类则通过引用来对实际数据操作。
2.结构体的定义是:有些数据既是相互关联的,又共同描述一个完整事物,如:一个学生的整体信息,学号、姓名、性别等。而类则使用在需要比较有层次的数据上面。
3.类是反映现实事物的一种抽象,而结构体的作用只是一种包含了具体不同类别数据的一种包装,结构体不具备类的继承多态特性
4.构造函数是为了初始化类的字段而存在的,而结构体并不需要初始化就能使用,因此,结构体中并不存在默认的构造函数。
结构:
没有默认的构造函数,但是可以添加构造函数
没有析构函数
没有 abstract 和 sealed(因为不能继承)
不能有protected 修饰符
可以不使用new 初始化
在结构中初始化实例字段是错误的
类:
有默认的构造函数
有析构函数
可以使用 abstract 和 sealed
有protected 修饰符
必须使用 new 初始化
匿名委托与lambda表达式的关系
委托与lambda是为了简化代码的编写量 和 方法传值
如:
delegate void mydel(int x); // 声明一个委托 或 调用系统委托
mydel del = delegate(int x){return x+1;} // 匿名方法
mydel del = (int x)=>{return +1;} // lambda表达式
C#中的委托是什么?事件是不是一种委托?
委托可以把一个方法作为参数代入另一个方法。
委托可以理解为指向一个函数的引用。
事件是委托,是一种特殊的委托
property 与 attribute的区别
一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加性质
class中定义的静态字段是存储在内存中的哪个地方?为什么会说不会被GC回收?
随类型对象存储在内存的加载堆上,因为加载堆不受GC管理,其生命周期随AppDomain,不会被GC回收。
.net的错误处理机制是什么?
.net错误处理机制采用try->catch->finally结构,发生错误时,层层上抛
,直到找到匹配的Catch为止。
利用operator声明且仅声明了==,有什么错误么?
要同时修改Equale和GetHash() ? 重载了"==" 就必须重载 "!="
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式
转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正
确。
所有类型都继承System.Object吗?
基本上是的,所有值类型和引用类型都继承自System.Object,接口是一个特殊的类型,不继承自System.Object。
解释virtual、sealed、override和abstract的区别
virtual申明虚方法的关键字,说明该方法可以被重写
sealed说明该类不可被继承
override重写基类的方法
abstract申明抽象类和抽象方法的关键字,抽象方法不提供实现,由子类实现,抽象类不可实例化。
线程与进程的区别?
一个应用程序实例是一个进程,一个进程内包含一个或多个线程,线程是进程的一部分;
进程之间是相互独立的,他们有各自的私有内存空间和资源,进程内的线程可以共享其所属进程的所有资源;
为什么GUI不支持跨线程访问控件?一般如何解决这个问题?
因为GUI应用程序引入了一个特殊的线程处理模型,为了保证UI控件的线程安全,这个线程处理模型不允许其他子线程跨线程访问UI元素。解决方法还是比较多的,如:
利用UI控件提供的方法,Winform是控件的Invoke方法,WPF中是控件的Dispatcher.Invoke方法;
使用BackgroundWorker;
使用GUI线程处理模型的同步上下文SynchronizationContext来提交UI更新操作
上面几个方式在文中已详细给出。
简述后台线程和前台线程的区别?
应用程序必须运行完所有的前台线程才可以退出,或者主动结束前台线程,不管后台线程是否还在运行,应用程序都会结束;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。
通过将 Thread.IsBackground 设置为 true,就可以将线程指定为后台线程,主线程就是一个前台线程。
说说常用的锁,lock是一种什么样的锁?
常用的如如SemaphoreSlim、ManualResetEventSlim、Monitor、ReadWriteLockSlim,lock是一个混合锁,其实质是Monitor。
lock为什么要锁定一个参数,可不可锁定一个值类型?这个参数有什么要求?
lock的锁对象要求为一个引用类型。她可以锁定值类型,但值类型会被装箱,每次装箱后的对象都不一样,会导致锁定无效。
对于lock锁,锁定的这个对象参数才是关键,这个参数的同步索引块指针会指向一个真正的锁(同步块),这个锁(同步块)会被复用。
多线程和异步有什么关系和区别?
多线程是实现异步的主要方式之一,异步并不等同于多线程。实现异步的方式还有很多,比如利用硬件的特性、使用进程或纤程等。在.NET中就有很多的异步编程支持,比如很多地方都有Begin***、End***的方法,就是一种异步编程支持,她内部有些是利用多线程,有些是利用硬件的特性来实现的异步编程。
线程池的优点有哪些?又有哪些不足?
优点:减小线程创建和销毁的开销,可以复用线程;也从而减少了线程上下文切换的性能损失;在GC回收时,较少的线程更有利于GC的回收效率。
缺点:线程池无法对一个线程有更多的精确的控制,如了解其运行状态等;不能设置线程的优先级;加入到线程池的任务(方法)不能有返回值;对于需要长期运行的任务就不适合线程池。
Mutex和lock有何不同?一般用哪一个作为锁使用更好?
Mutex是一个基于内核模式的互斥锁,支持锁的递归调用,而Lock是一个混合锁,一般建议使用Lock更好,因为lock的性能更好。
下面的代码,调用方法DeadLockTest(20),是否会引起死锁?并说明理由。
public void DeadLockTest(int i)
{
lock (this) //或者lock一个静态object变量
{
if (i > 10)
{
Console.WriteLine(i--);
DeadLockTest(i);
}
}
}
不会的,因为lock是一个混合锁,支持锁的递归调用,如果你使用一个ManualResetEvent或AutoResetEvent可能就会发生死锁。
用双检锁实现一个单例模式Singleton。
public static class Singleton<T> where T : class,new()
{
private static T _Instance;
private static object _lockObj = new object();
/// <summary>
/// 获取单例对象的实例
/// </summary>
public static T GetInstance()
{
if (_Instance != null) return _Instance;
lock (_lockObj)
{
if (_Instance == null)
{
var temp = Activator.CreateInstance<T>();
System.Threading.Interlocked.Exchange(ref _Instance, temp);
}
}
return _Instance;
}
}
下面代码输出结果是什么?为什么?
int a = 0;
System.Threading.Tasks.Parallel.For(0, 100000, (i) =>
{
a++;
});
Console.Write(a);
输出结果不稳定,小于等于100000。因为多线程访问,没有使用锁机制,会导致有更新丢失。
Ado.net的五大对象
1.Connection 连接对象
2.Command 命令对象,指示要执行的命令和存储过程!
3.DataReader是一个向前的只读的数据流。
4.DataAdapter是功能强大的适配合器,支持增删改查的功能
5.DataSet是一个数据集对象,相当于内存中的一张表或多张表!
2. webForm部分
B/S和C/S区别
C/S模式有以下特点:
1.C/S模式将应用与服务分离,系统具有稳定性和灵活性
2.C/S模式配备的是点对点的结构模式,适用于局域网,有可靠的安全性
3.由于客户端实现与服务器端的直接连接,没有中间环节,因此响应速度快
4.在C/S模式中,作为客户机的计算机都要安装客户机程序,一旦软件系统升级,每台客户机都要安装客户机程序,系统升级和维护较为复杂
B/S模式有以下特点:
1.系统开发、维护、升级方便
每当服务器应用程序升级时,只要在服务器上升级服务应用程序即可,用户计算机上的浏览器软件不需要修改,系统开发和升级维护方便
2.B/S模式具有很强的开放性
在B/S模式下,用户通过通用的浏览器进行访问,系统开放性好
3.B/S模式的结构易于扩展
由于Web的平台无关性,B/S模式的结构可以任意扩展,可以从包含一台服务器和几个用户的小型系统扩展成为拥有成千上万个用户的大型系统
4.用户使用方便
B/S模式的应用软件都是基于Web浏览器的,而Web浏览器的界面是类似的。对于无用户交换功能的页面。用户接触的界面都是一致的,用户使用方便
table的行列合并如何实现
colspan是“column span(跨列)”的缩写。colspan属性用在td标签中,用来指定单元格横向跨越的列数:
rowspan的作用是指定单元格纵向跨越的行数。
form表单的属性有哪些
method属性:规定用于发送 form-data 的 HTTP 方法。实际上就是请求的方式。
name属性:表单的名称。
action属性:指定表单请求的路径
target属性:指定action的Url在哪里打开
get传值与post区别
1.GET方式:最常见的提交方式,也就是将请求的参数直接拼接在请求路径的后面。这样的方式会把参数暴露在地址栏,不安全,而且有长度的限制。
2.POST方式:也比较常见。这种请求方式将参数保存在请求体中,地址栏不会出现请求的参数。相对安全。
JQ的$符号的作用
1.作为jQuery包装器,利用选择器来选择DOM元素(这个也是最强大的功能)
2.实用工具函数,作为几个通用的实用工具函数的命名空间的前缀
例如:$.trim(someString)
3.文档就绪处理程序,相当于$(document).ready(...)
例如:$(function(){...}); 里面的函数会在DOM树加载完之后执行
4.创建DOM元素
5.扩展jQuery
6.使用jQuery和其它库
正则表达式符号有哪些
\s :空白
\S :非空白
\w :数字、字母、_
\W :\w反向内容
\d :数字
\D :非数字
{n,m} :前面内容出现的次数,从n~m
[n-m] :出现一个n~m的内容
+ :至少出现一次
* :任意多个
?:最多出现一次
WebForm的页面周期
OnPreInit: 用来检查IsPostBack属性、生成控件ID、加载Theme、应用母版页、初始化控件和控件的值
OnInit:发生在所有控件被初始化,所有皮肤被应用以后,用于读取或者初始化控件属性,添加控件事件。
InitComplete:用于处理所有在Init处理完成之后的任务。
PreLoad:用于加载ViewState和所有的控件,处理包含在Request实例里面的的postback数据。
Load:递归的调用子控件的On_Load事件直到页面和所有的子控件被加载完成。主要用来设置控件属性。
Validation:用于表单数据验证。
Control Events:表单控件的事件。
LoadComplete:用来加载样式表等在页面Load完成之后的操作。
PreRender:预渲染。
SaveViewState:保存ViewState。
Render:渲染页面,生成页面控件。
UnLoad:页面从服务器端卸载。
WebForm的Repeater控件的模板
有五大模板
ItemTemplate :有多少条数据,执行多少遍
AlternatingItemTemplate : 对交替数据项进行格式设置
SeparatorTemplate : 对分隔符进行格式设置
HeaderTemplate : 对页眉进行格式设置 ,在加载开始执行一遍
FooterTemplate : 对页脚进行格式设置,在加载最后执行一遍
WebForm的回发是什么
就是PostBack,执行服务器控件注册的服务器端事件就是回发。
页面加载的时候,Page_Load方法会重复执行,这时候Page.IsPostBack属性就指示页面是初始加载还是回发。
最常用回发事件有Button/LinkButton.OnClick、DropDownList.OnSelectedIndexChanged等等。
WebForm跳转页面方法的区别
1. response.redirect 这个跳转页面的方法跳转的速度不快,因为它要走2个来回(2次postback),但可以跳转到任何页面,没有站点页面限制,同时不能跳过登录保护。redirect跳转机制:首先是发送一个http请求到客户端,通知需要跳转到新页面,然后客户端在发送跳转请求到服务器端。需要注意的是跳转后内部空间保存的所有数据信息将会丢失,所以需要用到session。
2. server.transfer 速度快,只需要一次postback ,但是必须是在同一个站点下,因为它是server的一个方法。另外,能跳过登录保护。这个方法的重定向请求是发生在服务器端,所以浏览器的url地址仍然保留的是原页面的地址!
3.sever.execute 这个方法主要是用在页面设计上面,而且必须是跳转同一站点下的页面。这个方法是需要将一个页面的输出结果插入到另一个aspx页面的时候使用,大部分是在表格中,将某一个页面类似于嵌套的方式存在于另一页面。
.<%# %> 和 <% %> 有什么区别?
<%# %>表示绑定的数据源
<% %>是服务器端代码块
asp.net内置对象有哪些
1.Response对象:通过该对象的属性和方法可以控制如何将服务器端的数据发送到客户端浏览器。
2. Request对象:当客户发出请求执行ASP.NET程序时,客户端的请求信息会包装在Request对象中,这些请求信息包括请求报头(Header)、客户端的机器信息,客户端浏览器信息,请求方法(如POST、GET)、提交的窗体信息等。
3.Server对象:反映了Web服务器的各种信息,它提供了服务器可以提供的各种服务。
4. Application对象:一个集合对象,并在整个ASP.NET网站内可用,不同的用户在不同的时间都可以访问Application对象的变量。由于它是一个内置对象,所以使用它的时候与使用Response对象和Request对象类似,不需要进行任何对象的实例化,就可以直接使用。
5.Session对象:负责存储、读取和改变一个特定用户的会话信息。对于每个用户的每次访问Session对象是唯一的。
6. Cookie对象:在Web程序设计中,它表示一个长度不超过4K的一个普通的文本文件。这个文件在用户的硬盘上,可以由Web浏览器进行访问。
7.Cache对象 :对于每个应用程序域均创建该类的一个实例,并且只要对应的应用程序域保持活动,该实例便保持有效。有关此类实例的信息通过HttpContext对象的Cache属性或Page对象的Cache属性来提供。
Session与Cookie的区别
cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
cookie :
1.不安全
2.可以被禁用
3.存储的数据量 4k 大小
4.cookie 默认不可以存储中文 URLEncoder URLDecoder编解码处理
5 不同的浏览器 cookie在操作系统中存放的位置不同。
不能把核心功能交给cookie完成,cookie完成一些辅助性功能
区别:
session
存储在服务器端
可以存储任意类型的数据
通过sessionId,来区分不同用户的数据,保证不同用户的数据不会混乱
cookie
存储在客户端
由于存储在本地,所以不建议存储敏感信息
asp.net的身份验证功能需要依赖cookie实现
cookie只支持存储string类型的数据
Session有什么重大BUG,微软提出了什么方法加以解决?
是iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sate server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件。
ViewState特点
ViewState是“客户端”状态保持的一种方案,ViewState是.net中特有的
Http协议是无状态的,ViewStatic可以保存视图状态。
至于与Session的区别,Session是保存在服务器端的,可以跨页面访问。
ViewStatic保存在客户端,不可跨页面访问。
因为ViewStatic是保存在客户端所以用户每次与服务器端交互都要额外的传递ViewStatic里的信息,这样就加大了服务器的流量
viewState是存储在隐藏域中的session是存在在服务器端的,一般情况下都会设置session过期的时间,而viewState不会过期的
什么是反射?
动态获取程序集信息
什么是ASP.net中的用户控件?
用户控件一般用在内容多为静态,或者少许会改变的情况下.
什么是HttpHandler和HttpModule:
ASP.NET 请求处理过程是基于管道模型的,这个管道模型是由多个HttpModule和HttpHandler组成,ASP.NET 把http请求依次传递给管道中各个HttpModule,最终被HttpHandler处理,处理完成后,再次经过管道中的HTTP模块,把结果返回给客户端。我们可以在每个HttpModule中都可以干预请求的处理过程。在http请求的处理过程中,只能调用一个HttpHandler,但可以调用多个HttpModule。
HttpHandler是HTTP请求的处理中心,真正对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。
HttpModule是类似于过滤器的作用,可以没有,也可以有任意个,每一个都可以订阅管道事件中的任意个事件,在每个订阅的事件中可自定义功能实现。
当请求到达HttpModule的时候,系统还没有对这个请求真正处理,但是我们可以在这个请求传递到处理中心(HttpHandler)之前附加一些其它信息,或者截获的这个请求并作一些额外的工作,也或者终止请求等。在HttpHandler处理完请求之后,我们可以再在相应的HttpModule中把请求处理的结果再次加工返回客户端。
经常用到的HttpHanlder有哪些?
1. aspx页面。响应aspx的请求,输出HTML结果
2. asmx服务文件。响应服务调用
3. ashx文件(一般处理程序)。实现简单的AJAX响应
4. 实现IHttpHandler接口的自定义类型。响应相应扩展名的请求
AJAX的优点与缺点
AJAX即 异步JavaScript和XML,是指一种创建交互式网页应用的网页开发技术
Ajax其核心有JavaScript、XMLHTTPRequest、DOM对象组成
优点
1.无刷新更新数据。
2.异步与服务器通信。
3.前端和后端负载平衡。
4.基于标准被广泛支持。
5.界面与应用分离。
缺点
1.AJAX没有Back和History功能,即对浏览器机制的破坏。
2.AJAX的安全问题。
3.对搜索引擎支持较弱
4.破坏程序的异常处理机制。
5.AJAX不能很好支持移动设备
什么是code-Behind技术。
ASPX,RESX和CS三个后缀的文件,这个就是代码分离.实现了HTML代码和服务器代码分离.方便代码编写和整理.
什么是SOAP,有哪些应用。
simple object access protocal,简单对象接受协议.以xml为基本编码结构,建立在已有通信协议上(如http,不过据说ms在搞最底层的架构在tcp/ip上的soap)的一种规范WebService使用的协议..
什么是ApplicationPool?
Web应用,类似Thread Pool,提高并发性能。
什么是WebService?UDDI?
Web Service便是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其它兼容的组件进行互操作。
UDDI的目标是为电子商务建立标准 ; UDDI是一套基于Web的、分布式的、为WebService提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。
浙公网安备 33010602011771号