- string str; string str=””; string str=null;三者之间有什么区别,最好能用图形表示。
答:区别如下:
- string str;如果str是局部变量,编译时会忽略该变量,所以不会分配任何内存空间,如下图。如果是类的成员变量,会被赋null空值,所以等于str=null;
- string str=””;堆和栈中都分配了空间,栈中保存堆中的地址,堆中为空字符串。
(3)string str=null;只在栈中分配了指针,但该指针为空(指针的值为0)
- string 和StringBuilder有什么区别,在什么情况下使用StringBuilder?
答:区别如下:
string是一个不可变的字符串,如以下语句中
sring a=”abcd”;
a=”eftg”;
语句1中a代表了栈区的指针,指向堆区的空间,堆区存放的是”abcd”这个字符串,string的不可变性体现在堆区中的值是不可变的,也就是说不能把堆区中的”abcd”改为别的值。在第二条语句中给a重新赋值,实质是重新在堆区分配新的内存,其中的值为新的值”eftg”,并将a指向这个新的地址,也就是说第一条语句的a和第二条语句的a其实是不同的地址。
在做大量的类似于a+=”abcdd”;这样的操作时string会频繁分配内存,因此速度慢。
StringBulider通过StringBuilder str=new StringBuilder(“abcd”);这种语句初始化,并且会预留一些空间给将来追加字符串时使用。上面的语句用StringBuilder替换如下:
StringBuilder a=new StringBuilder(“abcd”);
a.Append(“eftg”);
两行代码中的a在栈区的值也保持了不变(也就是说堆区的地址相同),而且在预留空间足够的情况下也不会重新分配内存,因此速度会快很多,这是一种用空间换时间的用法。
StringBuilder一般在频繁改变字符串内容时使用。
- GC是什么? 为什么要有GC?
答:GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管理。当引用类型在栈区的所有指针释放造成没有任何指针指向堆区的地址时,堆区的内存会被回收。
public void Test()
{
object a=new object();
}
Test();
当调用Test函数进入Test函数内部时,内存如下:
当函数运行完成后,变量a的作用域已过,a因为位于栈区,会被自动弹出,此时内存如下:
此时a已不存在,但堆区分配的内存还被占用,该内存没有任何指针指向它,这就是内存中的垃圾。当GC启动时,会对堆区进行扫描,扫描到该内存区域时会将其销毁。
- const和readonly有什么区别?
答:const可以用于类的成员常量和局部常量,必须在声明时赋值,之后不可以对常量进行赋值。而readonly只能用于类的成员变量不能用于局部变量,在声明时可以不赋值,除了在构造函数中可以再次赋值外,其它的地方和const一样也不能赋值。
- 接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么?答
答:区别如下
- 抽象类可以有抽象成员(无具体实现),也可以有非抽象成员(有具体实现);接口只有抽象成员。
- 一个类不能同时继承多个抽象类,一个类可以同时实现多个接口。
如果多个子类中有很多代码是重复的,这时采用抽象类,因为可以将这些代码放到抽象类的非抽象方法中,这样可以达到代码复用。当实现多个接口时因为抽象类不支持,只能使用接口。
- struct和class有什么区别
答:两者都可以有成员变量、属性、索引器s、事件、函数、构造函数,主要区别如下:
区别点 |
结构 |
类 |
类型 |
值类型 |
引用类型 |
成员变量 |
在声明时不能赋值 |
可以赋值也可以不赋值 |
构造函数 |
可以不写,系统提供默认构造函数,默认构造函数中会将所有成员值设为0,如果写了构造函数则构造函数必须有参数,且在构造函数中必须为每一个成员赋值。 |
可以不写,系统提供默认构造函数,写了也没有结构中的限制。 |
析构函数 |
不能有析构函数 |
可以有析构函数 |
继承性 |
自定义的结构不能从类继承,但可以实现接口,结构都是密封(sealed),不能从结构继承 |
类没有限制 |
- try后面一个finally,try中有一个return,那么finally中的代码会不会运行?如果运行,是在return后还是return前。
答:会运行,并且在return 后运行。如下代码:调用Test();该函数中的i=100会运行,但最终返回值为10。
privateint Test()
{
int i = 10;
try
{
return i;
}
finally
{
i = 100;
}
}
int b =Test();
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
答:该题解题思路有很多,主要是看运行效率如何,下面提供一种方法。
int[] array = new int[100];
int count=0;
Random rand = new Random();
while (count < 100)
{
int index = rand.Next(1,101);
if (!array.Contains(index))
{
array[count] = index;
count++;
}
}
for (int i = 0; i < array.Length; i++)
{
Console.WriteLine(array[i].ToString());
}
- C#中要使一个类支持foreach遍历,实现过程怎样?
答:必须实现IEnumerable,IEnumerator这两个接口,如下:
publicclassMyList : IEnumerable,IEnumerator
{
privateint position = -1;
string[] array = newstring[4];
public MyList()
{
array[0] = "a";
array[1] = "b";
array[2] = "c";
array[3] = "d";
}
#region IEnumerable 成员
//每次使用foreach时都会调用它得到一个枚举器
publicIEnumerator GetEnumerator()
{
Reset();
return (thisasIEnumerator);
}
#endregion
#region IEnumerator 成员
//遍历时通过这个属性得到值
publicobject Current
{
get { return array[position]; }
}
//访问下一个元素时使用MoveNext移动位置
publicbool MoveNext()
{
if (position < array.Length-1)
{
position++;
returntrue;
}
else
returnfalse;
}
//遍历前要使位置归位
publicvoid Reset()
{
position = -1;
}
#endregion
}
以下不用foreach遍历集合
MyList list=new MyList();
While(list.MoveNext())
{
Object o=list.Current;
}
- 以下程序有什么错?
public class TestClass
{
private int count;
private static int y;
public static void setvalue ()
{
count=1;
y=1;
}
}
答:在静态函数中只能访问静态成员变量;以上代码访问了实例成员。
- net中什么类不能被继承?
答:如果在类前加上sealed关键字,则表示该类为密封类,密封类不能被继承。
sealed 除了可以应用于类外,还可以应用于实例方法和属性。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed 修饰符必须始终与override一起使用。如:
//下面这个sealed使用正确,表示该类不能继承
public sealedclassTest
{
privateint myVar;
//下面这个sealed错误,编译不会通过,因为sealed必须和override一起使用
public sealedint MyProperty
{
get { return myVar; }
set { myVar = value; }
}
//下面这个sealed使用正确,表示如果该类不是密封类,
//那么在派生类中也不可以重写该方法
publicsealedoverridestring ToString()
{
returnbase.ToString();
}
}
- is 和as 有什么区别?
答:is用来判断一个实例是否属于某个类。如:
Dog d=new Dog();
If(d is Dog)
{
Console.WriteLine(“d是一只狗”);
}
以上语句Console.WriteLine(“d是一只狗”);会运行,因为d is Dog返回true,如果Dog从Animal类继承并实现了IPet接口,则d is Animal和d is IPet都会返回true;
as用于在兼容的引用类型之间执行转换,如果转换失败则返回null,它等价于如下语句:
expression is type ? (type)expression : (type)null
- net中函数传递参数有那些方式?有什么区别?
答:传值和传引用,传引用又两种方式,ref和out,ref要求变量在传参前赋值,out可以不赋值。传引用必须是一个地址,传值是指将栈中的值拷贝到函数的参数,传引用表示传入的变量和接收参数是同一个变量
publicclassTest
{
publicint myVar;
publicint MyProperty
{
get { return myVar; }
set { myVar = value; }
}
}
以上这个类中有字段和属性
privatevoid F(refint i)
{
i = 100;
}
有一个方法传递引用,调用方式如下:
Test t = newTest();
F(ref t. MyProperty);
以上代码编译不能通过,因为属性不是变量,其实质是函数,如下则可通过
Test t = newTest();
F(ref t. myVar);
因为字段是变量
- 一列数的规则如下: 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 <= 2)
return 1;
else
return Foo(i -1) + Foo(i - 2);
}
}
- C#中的委托是什么?事件是不是一种委托?
答:委托封装了函数指针的集合,它可以指向一组函数。
事件也是委托,是一种特殊的委托。
- 请编程实现一个冒泡排序算法?
答:
int [] array = new int [*] ;
int temp = 0 ;
for (int i = 0 ; i < array.Length - 1 ; i++)
{
for (int j = i + 1 ; j < array.Length ; j++)
{
if (array[j] < array[i])
{
temp = array[i] ;
array[i] = array[j] ;
array[j] = temp ;
}
}
}
- 在下面的例子里
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
当使用New创建B的实例时,因为B继承了A类,A的构造函数首先会被运行,但应当注意的是,虽然运行的是A的构造函数,但在A的构造函数中调用的函数首先是在B类中查找,因为PrintFields已被重写,所以最终运行B类中的PrintFields函数。
- CTS、CLS、CLR分别作何解释?
答:
CTS:通用类型系统。一个所有.NET语言都支持的数据类型的集合,确保这些语言可以相互传送数据,体现了.NET语言的互操作性。
CLS:共公语言规范。一组定义了一种语言的边界的标准,或者说是一种语言(与CLS兼容的)必须支持或遵循的一系列语言功能,从而使得其可以与其他的.NET语言互操作。
CLR:公共语言运行库。CLR处理在.NET Framework 内部运行的代码(称之为托管代码),并负责管理用于执行应用程序的进程和线程。
- 什么是装箱和拆箱?
答:从值类型接口转换到引用类型装箱。从引用类型转换到值类型拆箱。
- net Remoting 的工作原理是什么?
答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。
- 求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m
答:
int m = Convert.ToInt32(this.TextBox1.Text) ;
int sum = 0 ;
for (int i = 0 ; i < m + 1 ; i++)
{
if((i%2) == 1)
{
sum += i ;
}
Else
{
sum = Sum - I ;
}
}
System.Console.WriteLine(sum.ToString());
System.Console.ReadLine() ;
其实还有一个很简单的方式,上面的表达式,把它分成1-2、3-4、5-6……可以看出,如果m是偶数,那么结果就是m/2*(-1),如果m是奇数,结果就是m-m/2
- 列举ASP.NET 页面之间传递值的几种方式。
答. (1)使用QueryString, 如....?id=1; 该方式只能传递字符串,而且有长度限制
(2)使用Session变量,可以传任何数据,但需要消耗服务端内存
- 使用Server.Transfer,只能上下页间传递
- Application,所有用户共享
- 使用按钮的PostBackUrl,只能上下页传递,而且只能访问上一页的服务端控件
- 使用Cookie,在客户端传递,但如果客户端禁用Cookie,则不能传递
- 使用数据库
- 请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
答:在页面中调用下面的函数,SetTextBox(this);
public void SetTextBox(Control ctrl)
{
if (ctrl is TextBox)
{
(ctrl as TextBox).Text=string.Empty;
}
else
{
foreach (Control child in ctrl.Controls)
{
SetTextBox(ctrl);
}
}
}
- 根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。
Class A
{
public void Test(int i)
{
lock(this)
{
if (i>10)
{
i--;
Test(i);
}
}
}
}
答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生)
- 简要谈一下您对微软.NET 构架下remoting和webservice两项技术的理解以及实际中的应用。
答:WebSevice使用HTTP协议,因此可以穿透防火墙。而Remoting使用TCP/IP,二进制传送提高效率。
remoting是.net中用来跨越machine, process, appdomain进行方法调用的技术,对于三层结构的程序,就可以使用remoting技术来构建.它是分布应用的基础技术.相当于以前的DCOM;Web Service是一种构建应用程序的普通模型,并能在所有支持internet网通讯的操作系统上实施。Web Service令基于组件的开发和web的结合达到最佳,基于组件的对象模型
- 公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达到以下的特殊功能:点击ListView各列列头时,能按照点击列的每行值进行重排视图中的所有行 (排序的方式如DataGrid相似)。根据您的知识,请简要谈一下您的思路
答:根据点击的列头,包该列的ID取出,按照该ID排序后,在绑定到ListView中。
- 给定以下XML文件,完成算法流程图。
<FileSystem>
< DriverC >
<Dir DirName=”MSDOS622”>
<File FileName =” Command.com” ></File>
</Dir>
<File FileName =”MSDOS.SYS” ></File>
<File FileName =” IO.SYS” ></File>
</DriverC>
</FileSystem>
请画出遍历所有文件名(FileName)的流程图(请使用递归算法)。
答:
void FindFile( Directory d )
{
FileOrFolders = d.GetFileOrFolders();
foreach( FileOrFolder fof in FileOrFolders )
{
if( fof is File )
You Found a file;
else if ( fof is Directory )
FindFile( fof );
}
}
- String s = new String("xyz");创建了几个String Object?
答:两个对象,一个是“xyx”字符串常量,一个是值为“xyx”的引用对像s。
- String s=””;和string s=string.Empty;有什么区别,哪一种方式更好?
String s=””;先分配一块内存存放””文字常量,s引用该内存,string s=string.Empty;s引用string类中的静态变量地址(静态变量开始会被初始化,所以无论引用多少次,只会分配一次内存),两者比较,后者少了一次内存分配,所以效率更高。
- 构造函数是否可被override?
答:不能。
- 是否可以继承String类?
答:string 是密封类,所以不能被继承。
- Session有什么重大BUG,微软提出了什么方法加以解决?
答:是iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sate server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件。
- 进程和线程的区别?
答:进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。
- 堆和栈的区别?
答:栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小
- 成员变量和成员函数前加static的作用?
答:它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。
ASP。NET与ASP相比,主要有哪些进步?
答:asp解释型,aspx编译型,性能提高,可以跟美工的工作分开进行,更有利于团队开发。
- 在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?
using:
- 引入名称空间
- 放入实现了IDisposable接口的对象,在作用域过后会自动调用该对象的Dispose方法。
new :
- 新建实例
- 覆盖父类方法
- 对泛型类型进行约束,规定该类型必须具有无参的公共构造函数
- 需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个.
答:string inputStr=" xx xx ";
inputStr=inputStr.Trim();
inputStr=Regex.Replace(inputStr.Trim()," {2,}"," ");
注:Replace的第二个参数的”{2,}”前有一个空格,第三个参数是一个空格,表示,出现了2个或多个空格时将其替换成1个空格。
- 下面这段代码输出什么?为什么?
int i=5;
int j=5;
if (Object.ReferenceEquals(i,j))
Console.WriteLine("Equal");
else
Console.WriteLine("Not Equal");
答:不相等,因为比较的是装箱后堆中的地址;
- 什么叫做SQL注入,如何防止?请举例说明。
答:利用sql语言漏洞获得合法身份登陆系统。如身份验证的程序设计成:
SqlCommand com=new SqlCommand("Select * from users where username=‘"+t_name.text+"‘ and pwd=‘"+t_pwd.text+"‘");
object obj=com.ExcuteScale();
if(obj!=null)
{
//通过验证
}
这段代码容易被sql注入。如用户在t_name中随便输入,在t_pwd中输入abc‘ or ‘1’=‘1 就可以进入系统了。可以使用参数方式解决这个问题。
- 什么是反射?
答:动态获取程序集、类型等的信息,并可根据这些信息动态的加载程序集、创建类型、动态调用方法,访问类型的成员等。
- 如何写Singleton设计模式
答:static属性里面new ,构造函数private
public class Singleton
{
private static Singleton singleton;
private Singleton()
{
}
public static Singleton CreateInstance()
{
if(singleton==null)
singleton=new Singleton();
return singleton;
}
}
- 什么是Application Pool?
答:Web应用,类似Thread Pool,提高并发性能。
- 什么是虚函数?什么是抽像函数?
答:虚函数:可由子类继承并重写的函数。抽像函数:规定其非虚子类必须实现的函数,必须被重写。
- 什么是XML?
答:XML即可扩展标记语言。eXtensible Markup Language.标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,即可以选择国际通用的标记语言,比如HTML,也可以使用象XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从SGML中简化修改出来的。它主要用到的有XML、XSL和XPath等。
- 什么是ASP.net中的用户控件?
答:用户控件一般用在内容多为静态,或者少许会改变的情况下..用的比较大..类似ASP中的include..但是功能要强大的多。
- 列举一下你所了解的XML技术及其应用
答:xml用于配置,用于保存静态数据类型.接触XML最多的是web Services..和config - ADO.net中常用的对象有哪些?分别描述一下。
答:Connection 数据库连接对像
Command 数据库命令
DataReader 数据读取器
DataAdapterf 数据适配器,用于填充DataSet
DataSet 数据集
- 什么是code-Behind技术。
答:ASPX,RESX和CS三个后缀的文件,这个就是代码分离.实现了HTML代码和服务器代码分离.方便代码编写和整理.
- 什么是SOAP,有哪些应用。
答:SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息。
SOAP也被称作XMLP,为两个程序交换信息提供了一种标准的工作机制。在各类机构之间通过电子方式相互协作的情况下完全有必要为此制定相应的标准。
SOAP描述了把消息捆绑为XML的工作方式。它还说明了发送消息的发送方、消息的内容和地址以及发送消息的时间。SOAP是Web Service的基本通信协议。SOAP规范还定义了怎样用XML来描述程序数据(Program Data),怎样执行RPC(Remote Procedure Call)。大多数SOAP解决方案都支持RPC-style应用程序。SOAP还支持 Document-style应用程序(SOAP消息只包含XML文本信息)。
最后SOAP规范还定义了HTTP消息是怎样传输SOAP消息的。MSMQ、SMTP、TCP/IP都可以做SOAP的传输协议。
SOAP 是一种轻量级协议,用于在分散型、分布式环境中交换结构化信息。 SOAP 利用 XML 技术定义一种可扩展的消息处理框架,它提供了一种可通过多种底层协议进行交换的消息结构。这种框架的设计思想是要独立于任何一种特定的编程模型和其他特定实现的语义。
SOAP 定义了一种方法以便将 XML 消息从 A 点传送到 B 点。为此,它提供了一种基于 XML 且具有以下特性的消息处理框架: 1) 可扩展, 2) 可通过多种底层网络协议使用, 3) 独立于编程模型。
- XML 与 HTML 的主要区别
答:1. XML是区分大小写字母的,HTML不区分。
2. 在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>之类的结束标记。在XML中,绝对不能省略掉结束标记。
3. 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为结尾。这样分析器就知道不用查找结束标记了。
4. 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。
5. 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。
- public static const int A=1;这段代码有错误么?是什么?
答:const不能用static修饰。
- float f=-123.567F; int i=(int)f;i的值现在是_____?
答:-123。
- 在Asp.net中所有的自定义用户控件都必须继承自________?
答:Control。
- 在.Net中所有可序列化的类都被标记为_____?
答:[serializable]
- 在.Net托管代码中我们不用担心内存漏洞,这是因为有了______?
答:GC。
- 下面的代码中有什么错误吗?_______
using System;
class A
{
public virtual void F()
{
Console.WriteLine("A.F");
}
}
abstract class B:A
{
public abstract override void F(); 答:abstract override 是不可以一起修饰.
} // new public abstract void F();
- 当类T只声明了私有实例构造函数时,则在T的程序文本外部,___(可以 or 不可以)从T派生出新的类,____(可以 or 不可以)直接创建T的任何实例。
答:不可以,不可以。
- 下面这段代码有错误么?
switch (i){
case(): 答://case()条件不能为空
CaseZero();
break;
case 1:
CaseOne();
break;
case 2:
dufault; 答://wrong,格式不正确
CaseTwo();
break;
}
- 在.Net中,类System.Web.UI.Page 可以被继承么?
答:可以。
- net的错误处理机制是什么?
答:.net错误处理机制采用try->catch->finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止。
- 利用operator声明且仅声明了==,有什么错误么?
答:要同时修改Equale和GetHash() ? 重载了"==" 就必须重载 "!="
publicclassStudent
{
privateint age;
publicint Age
{
get { return age; }
set { age = value; }
}
publicstaticbooloperator ==(Student x, Student y)
{
return x.Age == y.Age;
}
publicstaticbooloperator !=(Student x, Student y)
{
return x.Age != y.Age;
}
}
- 某一密码仅使用K、L、M、N、O共5个字母,密码中的单词从左向右排列,密码单词必须遵循如下规则:
(1)密码单词的最小长度是两个字母,可以相同,也可以不同
(2) K不可能是单词的第一个字母
(3)如果L出现,则出现次数不止一次
(4) M不能使最后一个也不能是倒数第二个字母
(5) K出现,则N就一定出现
(6) O如果是最后一个字母,则L一定出现
问题一:下列哪一个字母可以放在LO中的O后面,形成一个3个字母的密码单词?
A) K B)L C) M D) N
答案:B
问题二:如果能得到的字母是K、L、M,那么能够形成的两个字母长的密码单词的总数是多少?
A)1个 B)3个 C)6个 D)9个
答案:A
问题三:下列哪一个是单词密码?
A) KLLN B) LOML C) MLLO D)NMKO
答案:C
- 62-63=1 等式不成立,请移动一个数字(不可以移动减号和等于号),使得等式成立,如何移动?
答案:62移动成2的6次方
- 对于这样的一个枚举类型:
enum Color:byte
{
Red,
Green,
Blue,
Orange
}
答:string[] ss=Enum.GetNames(typeof(Color));
byte[] bb=Enum.GetValues(typeof(Color));
- 写一个HTML页面,实现以下功能,左键点击页面时显示“您好”,右键点击时显示“禁止右键”。并在2分钟后自动关闭页面。
答:<script ***script>
setTimeout(‘window.close();‘,3000);
function show()
{
if (window.event.button == 1)
{
alert("左");
}
else if (window.event.button == 2)
{
alert("右");
}
}
</script>
- 大概描述一下ASP。NET服务器控件的生命周期
答:初始化(Init)加载视图状态(Load) 处理回发数据(IPostDataHandler ) 加载(获取表单数据并赋给控件属性) 发送回发更改通知处理回发事件预呈现(PreRender)保存状态呈现(Render) 处置卸载(UnLoad)
- &和&&的区别。
&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and).
- <%# %> 和 <% %> 有什么区别?
答:<%# %>表示绑定的数据源
<% %>是服务器端代码块
- 你觉得ASP.NET 2.0(VS2005)和你以前使用的开发工具(.Net 1.0或其他)有什么最大的区别?你在以前的平台上使用的哪些开发思想(pattern / architecture)可以移植到ASP.NET 2.0上 (或者已经内嵌在ASP.NET 2.0中)
答:1 ASP.NET 2.0 把一些代码进行了封装打包,所以相比1.0相同功能减少了很多代码.
2 同时支持代码分离和页面嵌入服务器端代码两种模式,以前1.0版本,.NET提示帮助只有在分离的代码文件,无法在页面嵌入服务器端代码获得帮助提示,
3 代码和设计界面切换的时候,2.0支持光标定位.这个我比较喜欢
4 在绑定数据,做表的分页.UPDATE,DELETE,等操作都可以可视化操作,方便了初学者
5 在ASP.NET中增加了40多个新的控件,减少了工作量 - 重载与覆盖的区别?
答:1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系
2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。
3、覆盖要求参数列表相同;重载要求参数列表不同。
4、覆盖关系中,调用那个方法体,是根据对象的类型(对像对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。
- 分析以下代码。
public static void test(string ConnectString)
{
System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection();
conn.ConnectionString = ConnectString;
try
{
conn.Open();
…….
}
catch(Exception Ex)
{
MessageBox.Show(Ex.ToString());
}
finally
{
if (!conn.State.Equals(ConnectionState.Closed))
conn.Close();
}
}
请问
1)以上代码可以正确使用连接池吗?
答:如果传入的connectionString是一模一样的话,可以正确使用连接池。不过一模一样的意思是,连字符的空格数,顺序完全一致。
- 在下面的例子里
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
- 下面的例子中
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
int?:表示可空类型,就是一种特殊的值类型,它的值可以为null
用于给变量设初值得时候,给变量(int类型)赋值为null,而不是0
int??:用于判断并赋值,先判断当前变量是否为null,如果是就可以赋役个新值,否则跳过
题目:
有三个桶,两个大桶分别可装8斤的水,一个小桶可装3斤的水。现在有2个8斤的桶全部装满了水,3斤的小桶空着。
要求:
如何把这16斤水平均分给4个人,每人4斤水。注意:不能使用其他任何工具,4人自备容器,分出去的水不可再要回来
1). 880——853:将3斤给第一个人,变为850(此时4人分别有水3-0-0-0)
2). 850——823:将2斤给第二个人,变为803(此时4人分别有水3-2-0-0)
3). 803——830——533——560——263——281:将1斤给第一个人,变为280(此时4人分别有水4-2-0-0)
4). 280——253——703——730——433——460——163:将1斤给第3个人,变为063(此时4人分别有水4-2-1-0)
5). 063——081:将1斤给第4个人,变为080(此时4人分别有水4-2-1-1)
6). 080——053——350——323:将2斤给第2个人,将2个3斤分别给第3/4个人(此时4人分别有水4-4-4-4)
25匹马通过赛跑来决出前三名,每轮最多5匹马参赛,求最少需要几轮?
条件:
1、最多5匹马一组,可以决出本组比赛的次序。
2、没有计时工具,假设马每轮的速度相同。
每次都排除不能争夺前三名的马是关键
7轮就可以了
1。小组比赛
5个一组进行比赛,25匹马需要5轮。纪录5轮比赛的各组比赛结果(每小组内的排名顺序)
2。冠军赛
选择每组比赛的第一名进行比赛,纪录比赛结果,最快的马就是25匹马中的No.1
3。亚季军赛(这个比较难理解)
选择冠军马所在的小组里的2,3名
冠军赛里第2名马所在小组的1,2名
冠军赛里第3名马所在小组的第1名共5匹马进行比赛
第1名就是亚军,第2名是季军
本人用C#2.0实现了二叉树的定义,怎么构造一颗已知的二叉树,用几种常规的算法(先序,中序,后序,层次)遍历二叉树。希望能给有需要人带来帮助,也希望能得到大家的指点。有关C#数据结构的书在书店里找到,网上也是极少,如果你有好的学习资源别忘了告诉我。先谢了。数据结构对一个程序员来说,现在是太重要了,数据结构学得好的人,逻辑思维一定很强,在程序设计的时候,就不会觉得太费劲了。而且是在设计多层应用程序的时候,真是让人绞尽脑汁啊。趁自己还年轻,赶紧练练脑子。哈哈,咱们尽快进入主题吧。
本程序中将用到一棵已知的二叉树如图(二叉树图)所示。
下面简单介绍一下几种算法和思路:
先序遍历:
1. 访问根结点
2. 按先序遍历左子树;
3. 按先序遍历右子树;
4. 例如:遍历已知二叉树结果为:A->B->D->G->H->C->E->F
中序遍历:
1. 按中序遍历左子树;
2. 访问根结点;
3. 按中序遍历右子树;
4. 例如遍历已知二叉树的结果:B->G->D->H->A->E->C->F
后序遍历:
1. 按后序遍历左子树;
2. 按后序遍历右子树;
3. 访问根结点;
4. 例如遍历已知二叉树的结果:G->H->D->B->E->F->C->A
层次遍历:
1. 从上到下,从左到右遍历二叉树的各个结点(实现时需要借辅助容器);
2. 例如遍历已知二叉树的结果:A->B->C->D->E->F->G->H