C#基础篇2(问答)

来源:互联网 发布:中兴编程挑战赛 编辑:程序博客网 时间:2024/05/21 09:42

1.try后面一个finally,try中有一个return,那么finally中的代码会不会运行?如果运行,是在return后还是return前答:会运行,并且在return 后运行。

 

2.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?

答:不能,一个对象的一个synchronized方法只能由一个线程访问。

 

 3.进程和线程的区别?

答:进程是系统进行资源分配和调度的单位;线程是CPU调度和分派的单位,一个进程可以有多个线程,这些线程共享这个进程的资源。

4.堆和栈的区别?

答:栈:由编译器自动分配、释放。在函数体中定义的变量通常在栈上。

    堆:一般由程序员分配释放。用new、malloc等分配内存函数分配得到的就是在堆上。

 

5.启动一个线程是用run()还是start()? 
     启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。


-----------------------------------

1.public/protect/private/internal修饰符的区别

    public:任何类和成员都可以访问

    protect:该类和派生类能访问

    private:只能该类访问

    internal:只能在包含它的程序集中访问

 

2.接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)? 
    接口可以继承接口。

    抽像类可以实现(implements)接口,

    抽像类是可继承实体类,但前提是实体类必须有明确的构造函数。

 

3.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

   都不能。

 

4.成员变量和成员函数前加static的作用? 
它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。

 

5.public static const int A=1;这段代码有错误么?是什么? 
     const成员都是static所以应该去掉static

 

6.谈谈final,finally,finalize的区别
   防止重写,
   try{}catch{}
   在垃圾回收之前,尝试释放资源并执行其他清理操作

 

7.const和static readonly 区别是什么?
   编译时常量
   运行时常量

 

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

答:区别如下

(1)        抽象类可以有抽象成员(无具体实现),也可以有非抽象成员(有具体实现);接口只有抽象成员。

(2)        一个类不能同时继承多个抽象类,一个类可以同时实现多个接口。

如果多个子类中有很多代码是重复的,这时采用抽象类,因为可以将这些代码放到抽象类的非抽象方法中,这样可以达到代码复用。当实现多个接口时因为抽象类不支持,只能使用接口。

 

 

9. struct和class有什么区别

答:两者都可以有成员变量、属性、索引器、事件、函数、构造函数,主要区别如下:

区别点        结构        类

类型        值类型        引用类型

成员变量        在声明时不能赋值        可以赋值也可以不赋值

构造函数        可以不写,系统提供默认构造函数,默认构造函数中会将所有成员值设为0,如果写了构造函数则构造函数必须有参数,且在构造函数中必须为每一个成员赋值。        可以不写,系统提供默认构造函数,写了也没有结构中的限制。

析构函数        不能有析构函数        可以有析构函数

继承性        自定义的结构不能从类继承,但可以实现接口,结构都是密封(sealed),不能从结构继承        类没有限制

 

10. net中什么类不能被继承?

答:如果在类前加上sealed关键字,则表示该类为密封类,密封类不能被继承。

sealed 除了可以应用于类外,还可以应用于实例方法和属性。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed 修饰符必须始终与override一起使用。如:

//下面这个sealed使用正确,表示该类不能继承

public sealed class Test

{

private int myVar;

//下面这个sealed错误,编译不会通过,因为sealed必须和override一起使用

     public sealed int MyProperty

     {

         get { return myVar; }

         set { myVar = value; }

     }

//下面这个sealed使用正确,表示如果该类不是密封类,

//那么在派生类中也不可以重写该方法

public sealed override string ToString()

     {

         return base.ToString();

     }

}

 

 11. 构造函数是否可被override?

答:不能。

 

 

12.    是否可以继承String类?

答:string 是密封类,所以不能被继承。

 

13.如何在C#中实现继承?

在类名后加上一个冒号,再加上基类的名称。

 

14.

C#支持多重继承么?

不支持。可以用接口来实现。

 

15.被protected修饰的属性/方法在何处可以访问?

在继承或间接继承与这个类的子类中可以访问。

 

16.私有成员会被继承么?

会,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了。

 

17.

请描述一下修饰符protected internal。

被protected internal修饰的属性/方法只能在它的在同一个程序集(Assembly)中的子类被访问。

 

18.C#提供一个默认的无参数构造函数,当我实现了另外一个有一个参数的构造函数时候,还想保留这个无参数的构造函数。这样我应该写几个构造函数?

两个,一旦你实现了一个构造函数,C#就不会再提供默认的构造函数了,所以需要手动实现那个无参数构造函数。

 

19.C#中所有对象共同的基类是什么?

System.Object.

 

20.重载和覆写有什么区别?

重载提供了对一个方法签名的不同参数调用的实现。覆写提供了子类中改变父类方法行为的实现。

 

21.在方法定义中,virtual有什么含意?

被virtual修饰的方法可以被子类覆写。

 

22. 能够将非静态的方法覆写成静态方法么?

不能,覆写方法的签名必须与被覆写方法的签名保持一致,除了将virtual改为override。

 

23.可以覆写私有的虚方法么?

不可以,甚至子类中无法访问父类中的私有方法。

 

24.能够阻止某一个类被其他类继承么?

可以,使用关键字sealed。

 

25.能够实现允许某个类被继承,但不允许其中的某个方法被覆写么?

可以,标记这个类为public,并标记这个方法为sealed。

 

26.什么是抽象类(abstract class)?

一种不可以被实例化的类。抽象类中一般含有抽象方法,当然也可有具体实现。继承类只有实现过所有抽象类的抽象方法后才能被实例化。

 

27. 何时必须声明一个类为抽象类?

当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。

 

28.接口(interface)是什么?

只含有共有抽象方法(public abstract method)的类。这些方法必须在子类中被实现。

 

29.为什么不能指定接口中方法的修饰符?

接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。他们默认为公有方法。

 

30.可以继承多个接口么?

当然。

 

31. 那么如果这些接口中有重复的方法名称呢?

这种情况中你可以决定如何实现。当然需要特别得小心。但是在编译环节是没有问题的。

 

32.接口和抽象类的区别是什么?

接口中所有方法必须是抽象的,并且不能指定方法的访问修饰符。抽象类中可以有方法的实现,也可以指定方法的访问修饰符。

 

33.如何区别重载方法?

不同的参数类型,不同的参数个数,不同的参数顺序。

注:同样的函数名但是返回类型不同的话不属于重载,你可能连编译都不能通过(呵呵)

--------------------------------------------

1.String/StringBuilder的异同

    string是一个不可变的数据类型,一旦对字符串对象进行了初始化,该字符串对象就不能改变了。修改字符串内容的方法

    和运算符实际上是创建一个新的字符串.

    stringbuilder分配好内存,对字符串的修改就在赋予stringbuilder实例的存储单元中进行.

     举例:

    string的确是不能修改的:  
    string  str  =  "a";  
    str  =  "b"//str是被赋值了"b"没错,但是str里面原来的string值"a"并没有被修改。  
    string  str  =  "a";  
    string  str1  =  str;  
    str  +=  "b";//此时str  =  "ab",str1  =  "a";  
        
    StringBuilder  str  =  new  StringBuilder(  "a"  );  
    StringBuilder  str1  =  str;  
    str.Append(  "b"  );  
    str.ToString()和str1.ToString()都是"ab"。  

2.解释string str=null/string str=""

    str=null,声明而不分内存空间,str=""声明而分内存空间

 

3..String s = new String("xyz");创建了几个String Object?

   两个对象,一个是“xyx”,一个是指向“xyx”的引用对像s

 

4..是否可以继承String类? 
String类是final类故不可以继承。

 

5.String s=””;string s=string.Empty;有什么区别,哪一种方式更好?

String s=””;先分配一块内存存放””文字常量,s引用该内存,string s=string.Emptys引用string类中的静态变量地址(静态变量开始会被初始化,所以无论引用多少次,只会分配一次内存),两者比较,后者少了一次内存分配,所以效率更高。


原创粉丝点击