1. 为什么栈比堆快?
栈是编译时分配空间,而堆是动态分配(运行时分配空间),所以栈的速度快
cpu有专门的寄存器(esp,ebp)来操作栈,堆都是使用间接寻址的。栈快点。

2. 接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么?

3.C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?

 

 

internal: 在同一命名空间内可以访问。

C#中方法覆盖时override和new的比较

     C#中override关键字使用在虚函数(virtual method)和抽象函数(abstract method)的覆盖上;

     C#中new关键字使用在派生类覆盖父类的"普通"函数上(也就是说非虚函数非抽象函数的情境下) 

1. override与重载的区别
答 :
                  重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要;

                  override 是进行基类中函数的重写。为了适应需要。

2. C#中的委托是什么?事件是不是一种委托?
答 : 
                  委托可以把一个方法作为参数代入另一个方法。
                  委托可以理解为指向一个函数的引用。
                  是,是一种特殊的委托  

3. 在下面的例子里
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().PrintFields()时,产生什么输出?
答:X=1,Y=0;x= 1 y = -1  

4.什么叫应用程序域?
答:应用程序域可以理解为一种轻量级进程。起到安全的作用。占用资源小。 

5.常用的调用WebService的方法有哪些?
答:1.使用WSDL.exe命令行工具。
                  2.使用VS.NET中的Add Web Reference菜单选项  

6.根据线程安全的相关知识,分析以下代码,当调用test方法时i>10时是否会引起死锁?并简要说明理由。
public void test(int i) 

lock(this) 

if (i>10) 

i--; 
test(i); 


}
答:不会发生死锁,lock锁资源,是以线程为单位来锁的,只是防止别的线程访问某些资源,而将这些资源排他锁定,但是在上面的题目中,即使递归访问了自身,那 也仍然在一个线程的范围之内,当然不存在死锁的问题了!!!

7. 描述一下C#中索引器的实现过程,是否只能根据数字进行索引?

答:MSDN中对索引器的说明:索引器允许类或结构的实例 按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。 下面先看一个简单的索引器:

class SampleCollection<T>

{

private T[] arr = new T[100];

public T this[int i]

{

get

{

return arr[i];

}

set

{

arr[i] = value;

}

}

}

索引器使用方式:

class Program

{

static void Main(string[] args)

{

SampleCollection<string> stringCollection = new SampleCollection<string>();

stringCollection[0] = "Hello, World";

System.Console.WriteLine(stringCollection[0]);

}

}

MSDN中对索引器设计的一些要求:

索引器概述

  • 索引器使得对象 可按照与数组相似的方法进行索引。
  • get 访问器返回值。set 访问器分配值。
  • this 关键字用于定义索引器。
  • value 关键字用于定义由 set 索引器分配的值。
  • 索引器不必根据 整数值进行索引,由您决定如何定义特定的查找机制。
  • 索引器可被重 载。
  • 索引器可以有多 个形参,例如当访问二维数组时。

由上可以看出索引也可以字符串等其它类型

最后给出一个较为复杂的索引器的例子。(摘自:

http://www.cnblogs.com/jiang_jiajia10/archive/2009/03/13/1410798.html

class Program1

{

static void Main(string[] args)

{

ScoreIndex s = new ScoreIndex();

s["张三", 1] = 90;

s["张三", 2] = 100;

s["张三", 3] = 80;

s["李四", 1] = 60;

s["李四", 2] = 70;

s["李四", 3] = 50;

Console.WriteLine("张三课程编号为1的成绩为:" + s["张三", 1]);

Console.WriteLine("张三的所有成绩为:");

ArrayList temp;

temp = s["张三"];

foreach (IndexClass b in temp)

{

Console.WriteLine("姓名:" + b.Name + "课程编号:" + b.CourseID + "分数:" + b.Score);

}

Console.ReadKey();

}

}

class IndexClass

{

private string _name;

private int _courseid;

private int _score;

public IndexClass(string _name, int _courseid, int _score)

{

this._name = _name;

this._courseid = _courseid;

this._score = _score;

}

public string Name

{

get { return _name; }

set { this._name = value; }

}

public int CourseID

{

get { return _courseid; }

set { this._courseid = value; }

}

public int Score

{

get { return _score; }

set { this._score = value; }

}

}

class ScoreIndex

{

private ArrayList arr;

public ScoreIndex()

{

arr = new ArrayList();

}

public int this[string _name, int _courseid]

{

get

{

foreach (IndexClass a in arr)

{

if (a.Name == _name && a.CourseID == _courseid)

{

return a.Score;

}

}

return -1;

}

set

{

arr.Add(new IndexClass(_name, _courseid, value)); //arr["张三",1]=90

}

}

//重载索引器

public ArrayList this[string _name]

{

get

{

ArrayList temp = new ArrayList();

foreach (IndexClass b in arr)

{

if (b.Name == _name)

{

temp.Add(b);

}

}

return temp;

}

}

} 

 

posted on 2010-05-20 18:24  风生水起  阅读(295)  评论(3编辑  收藏  举报