切换导航
{{systemName}}
{{info.Title}}
{{menu.Title}}
登录
|
退出
搜索
.Net面试题
作者:ych
#### 1.简述 private、 protected、 public、internal 修饰符的访问权限 ``` private : 私有成员, 在类的内部才可以访问(只能从其声明上下文中进行访问)。 protected : 保护成员,该类内部和从该类派生的类中可以访问。 Friend:友元 ,声明 friend 元素的程序集中的代码可以访问该元素,而不能从程序集外部访问。Protected Friend:在派生类或同一程序集内都可以访问。 public : 公共成员,完全公开,没有访问限制。 internal: 在同一命名空间内可以访问。 (很少用) ``` #### 2.列举ASP.NET页面之间传递值的几种方式 ``` 1.使用QueryString, 如....?id=1; response. Redirect().... 2.使用Session变量 3.使用Server.Transfer 4.使用Application 5.使用Cache 6使用HttpContext的Item属性 7.使用文件 8.使用数据库 9.使用Cookie ``` #### 3.一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少,用递归算法实现 ``` public class MainClass { public static void Main() { Console.WriteLine(Foo(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#中的委托是什么?事件是不是一种委托? ``` 委托可以把一个方法作为参数代入另一个方法。 委托可以理解为指向一个函数的指针。 委托和事件没有可比性,因为委托是类型,事件是对象,下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别。事件的内部是用委托实现的。因为对于事件来讲,外部只能“注册自己 =、注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。事件是用来阉割委托实例的,类比用一个自定义类阉割List。事件只能add、remove自己,不能赋值。事件只能 +=、-=,不能= 。其实:事件内部就是一个private的委托和add、remove两个方法 ``` #### 5.实现多态的过程中 overload 重载 与override 重写的区别 ``` override 重写与 overload 重载的区别。重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要 override 是进行基类中函数的重写。实现多态。 ``` #### 6.请编程实现一个冒泡排序算法? (1)每次比较相邻的两个元素 (2)如果他们的顺序错误就把他们交换位置,将最大的值放在后面 ``` int[] arrsirt = new int[] {} public static Sort(int[] arr) { for(int i=0;i
),并为其提供了简单的 get 和 set 访问器 方法(作为分配和检索值的方法)。Program 类为存储字符串创建了此类的一个实例。 ``` class SampleCollection
{ private T[] arr = new T[100]; public T this[int i] //注意,定义索引器。this 关键字用于定义索引器。 { get { return arr[i]; //访问器采用参数 } set { arr[i] = value; //访问器采用参数 } } } // This class shows how client code uses the indexer class Program { static void Main(string[] args) { SampleCollection
stringCollection = new SampleCollection
(); stringCollection[0] = "Hello, World"; //这里 使用索引器进行引用 System.Console.WriteLine(stringCollection[0]); } } ``` 索引器使得对象可按照与数组相似的方法进行索引。 get 访问器返回值。set 访问器分配值。 this 关键字用于定义索引器。 value 关键字用于定义由 set 索引器分配的值。 索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制。 索引器可被重载。 索引器可以有多个形参,例如当访问二维数组时。 #### 8.用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层? ``` 使用MVC模式分层 一般为3层 数据访问层,业务层,表示层。 数据访问层对数据库进行增删查改。 业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。 表示层为了与用户交互例如用户添加表单。 ``` #### 9.用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层? ``` 优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。 缺点: 增加成本。 ``` #### 10.在下面的例子里 ``` using System; class A { public A() { PrintFields(); } public virtual void PrintFields() { } } class B:A { int x=1; int y; public B() { y=-1; } public override void PrintFields() { Console.WriteLine("x={0},y={1}",x,y); } } ``` 当使用new B()创建B的实例时,产生什么输出? ``` X=1,Y=0; ``` #### 11.什么是装箱和拆箱? 装箱就是隐式的将一个值型转换为引用型对象。拆箱就是将一个引用型对象转换成任意值型。比如: ``` int i=0; Syste.Object obj=i; ``` 这个过程就是装箱!就是将 i 装箱! 比如: ``` int i=0; System.Object obj=i; int j=(int)obj; ``` 这个过程前2句是将 i 装箱,后一句是将 obj 拆箱! #### 12.什么是受管制(托管)的代码? ``` 托管代码是运行.NET 公共语言运行时CLR的代码 unsafe:非托管代码。不经过CLR运行。程序员自行分配和释放内存空间 ``` #### 13.ADO.net中常用的对象有哪些?分别描述一下 `DataSet`:数据集。 `DataCommand`:执行语句命令。 `DataAdapter`:数据的集合,用语填充。 `DataReader`:数据只读器 `Connection` 数据库连接对像 `Command` 数据库命令 #### 14.什么是Code-Behind技术? ``` 代码后置。 ``` #### 15.在.net中,配件的意思是? ``` 程序集。(中间语言,源数据,资源,装配清单) ``` #### 16.常用的调用WebService的方法有哪些? 1.使用`WSDL.exe`命令行工具 2.使用`VS.NET`中的`Add Web Reference`菜单选项 #### 17.在C#中,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别。 ``` string str = null 是不给他分配内存空间,而string str = "" 给它分配长度为空字符串的内存空间。 ``` #### 18.请详述在C#中类(class)与结构(struct)的异同? ``` class可以被实例化,属于引用类型,class可以实现接口和单继承其他类,还可以作为基类型,是分配在内存的堆上的 struct属于值类型,不能作为基类型,但是可以实现接口,是分配在内存的栈上的. ``` #### 19.SQLSERVER服务器中,给定表 table1 中有两个字段 ID、LastUpdateDate,ID表示更新的事务号, LastUpdateDate表示更新时的服务器时间,请使用一句SQL语句获得最后更新的事务号 ``` Select ID FROM table1 Where LastUpdateDate = (Select MAX(LastUpdateDate) FROM table1) ``` #### 20.写出一条Sql语句:取出表A中第31到第40记录(SQLServer,以自动增长的ID作为主键,注意:ID可能不是连续的。 ``` --解1: select top 10 * from A where id not in (select top 30 id from A) --解2: select top 10 * from A where id > (select max(id) from (select top 30 id from A )as A) ``` #### 21.GC是什么? 为什么要有GC? GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一: ``` System.gc() Runtime.getRuntime().gc() ``` #### 22.String s = new String("xyz");创建了几个String Object? ``` 两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。 ``` #### 23.abstract class和interface有什么区别? ``` 声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。 abstract 修饰词可用于类别、方法、属性、索引子 (Indexer) 和事件。在类别宣告里使用 abstract 饰词,表示该类别只是当做其它类别的基底类别而已。成员如果标记为抽象,或是包含在抽象类(Abstract Class) 内,则必须由衍生自此抽象类别的类别实作这个成员。 在静态属性上使用 abstract 修饰词是错误的。 在抽象方法宣告中使用 static 或 virtual 修饰词是错误的。 接口只包含方法、委派或事件的签章。方法的实作 (Implementation) 是在实作接口的类别中完成。 ``` #### 24.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? ``` 会执行,在return前执行。 ``` #### 25.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? ``` Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。 equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。 ``` #### 26.谈谈final, finally, finalize的区别。 ``` final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此 一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中 不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为 final的方法也同样只能使用,不能重载 finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会 执行,然后控制就会进入 finally 块(如果有的话)。 finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理 工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的 ,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 ``` #### 27.如何处理几十万条并发数据? ``` 用存储过程或事务。取得最大标识的时候同时更新..注意主键不是自增量方式这种方法并发的时候是不会有重复主键的..取得最大标识要有一个存储过程来获取。 ``` #### 28.进程和线程的区别? ``` 进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。 ``` #### 29.堆和栈的区别? ``` 栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。 堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。 ``` #### 30.成员变量和成员函数前加static的作用? ``` 它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。 ``` #### 31.请指出GAC的含义? ``` 全局程序集缓存。 ``` #### 32.DataReader与Dataset有什么区别? ``` DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection,在线操作数据库.任何对SqlConnection的操作都会引发DataReader的异常.因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的..因为DataReader的特殊性和高性能.所以DataReader是只进的.你读了第一条后就不能再去读取第一条了. DataSet则是将数据一次性加载在内存中.抛弃数据库连接.读取完毕即放弃数据库连接.因为DataSet将数据全部加载在内存中.所以比较消耗内存.但是确比DataReader要灵活.可以动态的添加行,列,数据.对数据库进行回传更新操作 ``` #### 33.在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using 指令和语句 new 创建实例 new 隐藏基类中方法。 ``` using 引入名称空间或者使用非托管资源,使用完对象后自动执行实现了IDisposable接口的类的Dispose方法 new 新建实例或者隐藏父类方法 ``` #### 34.什么是虚函数?什么是抽象函数? ``` 虚函数:没有实现的,可由子类继承并重写的函数。Virtual CallSomeOne(); 抽象函数:规定其非虚子类必须实现的函数,必须被重写。public abstract void CallSomeOne(); ``` #### 35.什么是SOAP,有哪些应用。 ``` simple object access protocal,简单对象接受协议.以xml为基本编码结构,建立在已有通信协议上(如http,不过据说ms在搞最底层的架构在tcp/ip上的soap)的一种规范Web Service使用的协议。 ``` #### 36.C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里? ``` 在C#中有两个属性,分别为Property和Attribute, Property比较简单,就是我们常用的get和set,主要用于为类中的private和protected变量提供读取和设置的接口。 ttribute用来说明这个事物的各种特征的一种描述。而Attribute就是干这事的。它允许你将信息与你定义的C#类型相关联,作为类型的标注。这些信息是任意的,就是说,它不是由语言本身决定的,你可以随意建立和关联任何类型的任何信息。你可以作用属性定义设计时信息和运行时信息,甚至是运行时的行为特征。关键在于这些信息不仅可以被用户取出来作为一种类型的标注,它更可以被编译器所识别,作为编译时的一种附属条件参加程序的编译。定义属性:属性实际上是一个派生自System.Attribute基类的类。System.Attribute类含有几个用于访问和检查自定义属性的方法。尽管你有权将任何类定义为属性,但是按照惯例来说,从System.Attribute派生类是有意义的。 ``` #### 37.用sealed修饰的类有什么特点? ``` 密封,不能继承。 ``` #### 38.public abstract override void F(); ``` abstract override 是不可以一起修饰。 ``` #### 39.大概描述一下ASP。NET服务器控件的生命周期 ``` 初始化 加载视图状态 处理回发数据 加载 发送回发更改通知 处理回发事件 预呈现 保存状态 呈现 处置 卸载 ``` #### 40.Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? ``` 不能,可以实现接口 ``` #### 41.Static Nested Class 和 Inner Class的不同 ``` Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化。 ``` #### 42.&和&&的区别。 ``` &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)。 ``` #### 43.HashMap和Hashtable的区别 ``` HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable ``` #### 44.<%# %> 和 <% %> 有什么区别? ``` <%# %>表示绑定的数据源 <% %>是服务器端代码块 ``` #### 45.asp.net中web应用程序获取数据的流程 A.Web Page B.Fill C.Sql05 D.Data Sourse E.DataGrid F.DataSet G.Select and Connect Commands H.Sql Data Adapter ``` a,e,d,f,h,g,b,c ``` #### 46.请将字符串"I am a student"按单词逆序输出如"student a am I" ``` string S = "I am a student"; char[] C = new char[] { ' '}; string[] n =S.Split(C); int length = S.Length; for (int i =length-1 ; i >=0; i--) { Console.Write(n[i]); if (i != 0) { Console.Write(" "); } } ``` #### 47.NET和C#有什么区别 ``` .NET一般指 .NET FrameWork框架,它是一种平台,一种技术。 C#是一种编程语言,可以基于.NET平台的应用。 ``` #### 48.求以下表达式的值,写出您想到的一种或几种实现方法:1-2+3-4+……+m ``` int Num = this.TextBox1.Text.ToString() ; int Sum = 0 ; for (int i = 0 ; i < Num + 1 ; i++) { if((i%2) == 1) { Sum += i ; } else { Sum = Sum - I ; } } System.Console.WriteLine(Sum.ToString()); System.Console.ReadLine() ; ``` #### 49.CTS、CLS、CLR分别作何解释? ``` CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。 ``` #### 50.什么是强类型系统? ``` RTTI:类型识别系统。 ``` #### 51..net的Remoting 的工作原理是什么? ``` 服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。 ``` #### 52.面向对象的语言具有________性、_________性、________性 ``` 封装、继承、多态。 ``` 封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部。 继承:子类拥有父类的所有数据和操作。 多态:一个程序中同名的不同方法共存的情况。有两种形式的多态– 重载与重写。 #### 53.启动一个线程是用run()还是start()? ``` 启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。 run()方法可以产生必须退出的标志来停止一个线程。 ``` #### 54.sleep()和 wait() 有什么区别? ``` sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。 这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级 (b)正在运行的线程因为其它原因而阻塞。 wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。 ``` #### 55 .net Remoting 和 Web Service 的区别? >1、Remoting可以灵活的定义其所基于的协议,如果定义为HTTP,则与Web Service就没有什么区别了,一般都喜欢定义为TCP,这样比Web Service稍为高效一些 2、Remoting不是标准,而Web Service是标准; 3、Remoting一般需要通过一个WinForm或是Windows服务进行启动,而Web Service则需要IIS进行启动。 4、在VS.net开发环境中,专门对Web Service的调用进行了封装,用起来比Remoting方便 建议还是采用Web Service好些,对于开发来说更容易控制。 为了能清楚地描述Web Service 和Remoting之间得区别,我打算从他们的体系结构上来说起: Web Service大体上分为5个层次: >>1.Http传输信道 2.XML的数据格式 3.SOAP封装格式 4.WSDL的描述方式 5.UDDI 总体上来讲,.NET 下的 Web Service结构比较简单,也比较容易理解和应用: 一般来讲在.NET结构下的WebService应用都是基于.net Framework以及IIS的架构之下,所以部署(Dispose)起来相对比较容易点。 从实现的角度来讲,首先WebService必须把暴露给客户端的方法所在的类继承于:System.Web.Services.WebService这个基类,其次所暴露的方法前面必须有[WebMethod]或者[WebMethodAttribute] WebService的运行机理(运行过程) 首先客户端从服务器的到WebService的WSDL,同时在客户端声称一个代理类(Proxy Class) 这个代理类负责与WebService服务器进行Request 和Response 当一个数据(XML格式的)被封装成SOAP格式的数据流发送到服务器端的时候,就会生成一个进程对象并且把接收到这个Request的SOAP包进行解析,然后对事物进行处理,处理结束以后再对这个计算结果进行SOAP包装,然后把这个包作为一个Response发送给客户端的代理类(Proxy Class),同样地,这个代理类也对这个SOAP包进行解析处理,继而进行后续操作。 下面对.net Remoting进行概括的阐述: .net Remoting 是在DCOM等基础上发展起来的一种技术,它的主要目的是实现跨平台、跨语言、穿透企业防火墙,这也是他的基本特点,与WebService有所不同的是,它支持HTTP以及TCP信道,而且它不仅能传输XML格式的SOAP包,也可以传输传统意义上的二进制流,这使得它变得效率更高也更加灵活。而且它不依赖于IIS,用户可以自己开发(Development)并部署(Dispose)自己喜欢的宿主服务器,所以从这些方面上来讲WebService其实上是.net Remoting的一种特例。 .net Remoting的特点是 他的优点是用户既可以使用TCP信道方式进行二进制流方式通信,也可以使用HTTP信道进行SOAP格式的性通信 ,效率相对WebService要高不少;但是它的缺点也很明显,.net remoting只能应用于MS 的.net Framework之下。 从性能上来讲Remoting的效率和传统的DCOM、COM+的性能很相近! #### 56.数组有没有length()这个方法? String有没有length()这个方法? ``` 数组没有length()这个方法,有length的属性。String有有length()这个方法。 ``` #### 57.子类对父类中虚方法的处理有重写(override)和覆盖(new),请说明它们的区别? ``` 有父类ParentClass和子类ChildClass、以及父类的虚方法VirtualMethod。有如下程序段: ParentClass pc = new ChildClass();pc.VirtualMethod(...); 如果子类是重写(override)父类的VirtualMethod,则上面的第二行语句将调用子类的该方法 如果子类是覆盖(new)父类的VirtualMethod,则上面的第二行语句将调用父类的该方法 ``` #### 58.写出程序的输出结果 ``` class Class1 { private string str = "Class1.str"; private int i = 0; static void StringConvert(string str) { str = "string being converted."; } static void StringConvert(Class1 c) { c.str = "string being converted."; } static void Add(int i) { i++; } static void AddWithRef(ref int i) { i++; } static void Main() { int i1 = 10; int i2 = 20; string str = "str"; Class1 c = new Class1(); Add(i1); AddWithRef(ref i2); Add(c.i); StringConvert(str); StringConvert(c); Console.WriteLine(i1); Console.WriteLine(i2); Console.WriteLine(c.i); Console.WriteLine(str); Console.WriteLine(c.str); } } ``` 10 21 0 str string being converted. #### 59.写出程序的输出结果 ``` public abstract class A { public A() { Console.WriteLine('A'); } public virtual void Fun() { Console.WriteLine("A.Fun()"); } } public class B: A { public B() { Console.WriteLine('B'); } public new void Fun() { Console.WriteLine("B.Fun()"); } public static void Main() { A a = new B(); a.Fun(); } } ``` A B A.Fun() >解释: 在类实例化时,程序会自动执行类的默认构造函数,因为B继承A,所以先执行类A的默认构造函数,然后是B。用父类实例化子类(A a=new B()),对于(a.Fun)来说,是调用的父类中的Fun函数,如果用(B a=new B()),a.Fun就会调用类B中的Fun函数,输出结果会是B.Fun。 #### 60.写出程序的输出结果 ``` public class A { public virtual void Fun1(int i) { Console.WriteLine(i); } public void Fun2(A a) { a.Fun1(1); Fun1(5); } } public class B : A { public override void Fun1(int i) { base.Fun1 (i + 1); } public static void Main() { B b = new B(); A a = new A(); a.Fun2(b); b.Fun2(a); } } ``` 2 5 1 6 #### 61.值类型和引用类型的区别?写出C#的样例代码 ``` 基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。所有的值类型均隐式派生自 System.ValueType。与引用类型不同,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也可以实现接口。与引用类型不同,值类型不可能包含 null值。然而,可空类型功能允许将 null 赋给值类型。每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。值类型主要由两类组成:结构、枚举,结构分为以下几类:Numeric(数值)类型、整型、浮点型、decimal、bool、用户定义的结构。引用类型的变量又称为对象,可存储对实际数据的引用。声明引用类型的关键字:class、interface、delegate、内置引用类型:object、string ``` #### 62.C#中的接口和类有什么异同。 ``` 异:不能直接实例化接口。接口不包含方法的实现。接口、类和结构可从多个接口继承。但是C# 只支持单继承:类只能从一个基类继承实现。类定义可在不同的源文件之间进行拆分。 同:接口、类和结构可从多个接口继承。接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。接口可以包含事件、索引器、方法和属性。一个类可以实现多个接口。 ``` #### 63.UDP连接和TCP连接的异同。 ``` TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。 ``` #### 64.请解释web.config文件中的重要节点 Web.config文件是一个XML文本文件,它用来储存 ASP.NET Web 应用程序的配置信息(如最常用的设置ASP.NET Web 应用程序的身份验证方式),它可以出现在应用程序的每一个目录中。当你通过VB.NET新建一个Web应用程序后,默认情况下会在根目录自动创建一个默认的Web.config文件,包括默认的配置设置,所有的子目录都继承它的配置设置。如果你想修改子目录的配置设置,你可以在该子目录下新建一个Web.config文件。它可以提供除从父目录继承的配置信息以外的配置信息,也可以重写或修改父目录中定义的设置。 >1、
节作用:配置 ASP.NET 身份验证支持(为Windows、Forms、PassPort、None四种)。该元素只能在计算机、站点或应用程序级别声明。
元素必需与
节配合使用。示例:以下示例为基于窗体(Forms)的身份验证配置站点,当没有登陆的用户访问需要身份验证的网页,网页自动跳转到登陆网页。
其中元素loginUrl表示登陆网页的名称,name表示Cookie名称 2、
节作用:控制对 URL 资源的客户端访问(如允许匿名用户访问)。此元素可以在任何级别(计算机、站点、应用程序、子目录或页)上声明。必需与
节配合使用。 3、
节作用:配置 ASP.NET 使用的所有编译设置。默认的debug属性为“True”.在程序编译完成交付使用之后应将其设为True(Web.config文件中有详细说明,此处省略示例) 4、
作用:为 ASP.NET 应用程序提供有关自定义错误信息的信息。它不适用于 XML Web services 中发生的错误。 5、
节作用:配置 ASP.NET HTTP 运行库设置。该节可以在计算机、站点、应用程序和子目录级别声明。 6、
作用:标识特定于页的配置设置(如是否启用会话状态、视图状态,是否检测用户的输入等)。
可以在计算机、站点、应用程序和子目录级别声明。 7、
作用:为当前应用程序配置会话状态设置(如设置是否启用会话状态,会话状态保存位置)。 8、
作用:配置 ASP.NET 跟踪服务,主要用来程序测试判断哪里出错。 #### 65.您在什么情况下会用到虚方法?它与接口有什么不同? ``` 当在继承类中想重写某一方法时会用到虚方法;虚方法是类的成员函数,接口相当于抽象类 ``` #### 66.维护数据库的完整性、一致性、你喜欢用触发器还是自写业务逻辑?为什么 ``` 尽可能用约束(包括CHECK、主键、唯一键、外键、非空字段)实现,这种方式的效率最好;其次用触发器,这种方式可以保证无论何种业务系统访问数据库都能维持数据库的完整性、一致性;最后再考虑用自写业务逻辑实现,但这种方式效率最低、编程最复杂,当为下下之策。 ``` #### 67.设有关系EMP(ENO,ENAME,SALARY,DNO ),其中各属性的含义依次为职工号、姓名、工资和所在部门号,以及关系DEPT(DNO,DNAME,MANAGER),其中各属性含义依次为部门号、部门名称、部门经理的职工号。试用SQL语句完成以下查询: a) 列出各部门中工资不低于600元的职工的平均工资。 ``` select dno , avg(salary) as average from emp where salary>=600 group by dno ``` b) 查询001号职工所在部门名称。 ``` select DNAME from dept where DNO = (select DNO from emp where eno=’001’) --- 或者 select d.dname from dept as d left jon emp as e on e.dno = d.dno where e.eno=’001’ ``` c)请用SQL语句将“销售部”的那些工资数额低于600的职工的工资上调10%。 ``` update EMP set SALARY =SALARY*(1+0.1) where SALARY<600 and DNO = ( select DNO from dept where dname= ‘销售部’ ) ``` #### 68.以下关于ref和out的描述 ``` 使用ref参数,传递到ref参数的参数必须最先初始化。 使用ref参数,必须将参数作为ref参数显式传递到方法。 ``` #### 69.下面的例子中 ``` using System; class A { public static int X; static A(){ X=B.Y+1; } } class B { public static int Y=A.X+1; static B(){} static void Main(){ Console.WriteLine(“X={0},Y={1}“,A.X,B.Y); } } ``` 产生的输出结果是什么? ``` x=1,y=2 ``` #### 70.字符串拼接 在 C# 中,有几种常见的字符串拼接方式,每种方式都适用于不同的场景。以下是一些常见的字符串拼接方式及其优劣势: 1. **String.Concat 或者 + 运算符:** 这是最基本的字符串拼接方式。你可以使用 `String.Concat` 方法或 `+` 运算符将多个字符串连接起来。 ```csharp string result = string.Concat(str1, str2, str3); // 或者 string result = str1 + str2 + str3; ``` 优势:简单直接。 劣势:对大量的字符串拼接效率较低,因为每次拼接都会创建新的字符串对象。 2. **StringBuilder:** `StringBuilder` 类专门用于高效拼接大量字符串。它提供了 `Append` 方法来不断追加字符串。 ```csharp StringBuilder sb = new StringBuilder(); sb.Append(str1); sb.Append(str2); sb.Append(str3); string result = sb.ToString(); ``` 优势:适用于大量字符串拼接,因为不会创建过多的中间字符串对象,从而提高了性能。 劣势:相对于简单的拼接,代码稍微繁琐。 3. **String.Join:** `string.Join` 方法允许你使用指定的分隔符将字符串数组或集合连接在一起。 ```csharp string[] parts = { str1, str2, str3 }; string result = string.Join("", parts); // 或者使用分隔符 string resultWithSeparator = string.Join(", ", parts); ``` 优势:适用于将多个字符串连接并使用分隔符。 劣势:如果你需要更复杂的拼接逻辑,可能不太方便。 综合考虑,如果你只是需要简单的字符串拼接,使用 `+` 运算符或 `String.Concat` 方法就可以。如果需要处理大量字符串或者需要复杂的拼接逻辑,推荐使用 `StringBuilder`。 `String.Join` 则适用于连接数组或集合,以及添加分隔符的场景。选择适合你场景的方式可以提高代码的可读性和性能。 在可读性方面,使用插值字符串(interpolated strings)和字符串格式化是比较强的拼接方式。它们能够在拼接字符串时更清晰地展示插入的变量,提高代码的可读性。以下是这两种方式的示例: 1. **插值字符串(Interpolated Strings):** 插值字符串是 C# 6.0 引入的特性,允许你在字符串中直接插入变量值。使用 `$` 符号,将变量放在大括号 `{}` 内即可。 ```csharp string name = "Alice"; int age = 30; string message = $"Hello, my name is {name} and I'm {age} years old."; ``` 2. **字符串格式化:** 使用字符串格式化也是一种提高可读性的方式,它使用占位符 `{0}`, `{1}`, 等等,并通过 `string.Format` 方法将变量填充到这些占位符中。 ```csharp string name = "Bob"; int score = 85; string message = string.Format("Player {0} scored {1} points.", name, score); ``` 这两种方式都可以在拼接字符串时提高可读性,特别是当需要插入多个变量值时。你可以根据自己的喜好和项目要求选择其中一种方式。在拼接较多变量的情况下,插值字符串可能更直观,而字符串格式化更适合格式化的需求。无论哪种方式,都可以通过更清晰的代码来提高可读性。
相关推荐
.net 10万+大数据处理方式、应用场景
什么是死锁?死锁产生的原因?如何避免死锁?
B+树为什么快
Redis的优点
详解C#中SqlParameter的作用与用法
单例模式的应用场景
MySQL索引原理
redis缓存穿透、缓存击穿、缓存雪崩原因+解决方案
消息队列使用的场景介绍
ElasticSearch使用场景
redis在项目中的使用
TiDB使用场景
C#二叉树查找法
.net插入日志数据纠错
评论区
先去登录
版权所有:机遇屋在线 Copyright © 2021-2025 jiyuwu Co., Ltd.
鲁ICP备16042261号-1