栈是编译时分配空间,而堆是动态分配(运行时分配空间),所以栈的速度快
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中对索引器设计的一些要求:
索引器概述
|
由上可以看出索引也可以字符串等其它类型。
最后给出一个较为复杂的索引器的例子。(摘自:
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;
}
}
}