菜鸟慢慢飞…

一些基本概念

问题引申:引用类型&值类型

1. String是值类型还是引用类型?

    引用类型。证明如下:

  

大家先来看一下下面的代码

using System;
using System.Collections.Generic;

public class MyClass
{
    
public static void Main()
    
{
        
string s="abc";
        
string a=s;
        s
="def";
        Console.WriteLine(
"{0},{1}",a,s);
    }

    
}

输出的是abc,def
我们都知道数组是引用类型的,请看一下段代码:

using System;
class MyClass
{
    
static void Main()
    {
        
int [] Arr1={1,2,3,4,5};
        
int [] Arr2=Arr1;
        Arr1[
1=200;
        
foreach (int i in Arr2)
        Console.WriteLine(i);
    }
}


我们都知道值类型如果附值的时候,是把自己的一个副本附给另一个变量,之后它们互不影响。而引用类型则是把它在堆栈中的地址复制一份给另一个变量,它们的指向仍是一样的,所以当对一个变量进行操作的时候会影响到另外一个变量,所以上例中Arr2[1]=200而不是2。所以我们可以暂且认为string是值类型。
下面的一段代码再一次说明了它具有值类型的特征。

using System;
class MyClass
{
    
static void M(string s)
    {
        s
="abcd";
    }
    
static void Main()
    {
        
string s="efgh";
        M(s);
        Console.WriteLine(s);
    }
}

输出 efgh
但实际上string是引用类型的,引用一下MSDN上的话:“String 对象称为不可变的(只读),因为一旦创建了该对象,就不能修改该对象的值。看来似乎修改了 String 对象的方法实际上是返回一个包含修改内容的新 String 对象。”
大家看了这句话是不是有种恍然大悟的感觉了?让我把它说的更通俗点吧“重新赋值,就是在堆中重新分一块内存给它放新的值即重新NEW了一个对象,而不是覆盖原先的值是.而原先的值将等着CG来回收。
那如果你想定义经常变的字符串,用string类的话,如果CG不能够及时回收,那不是很占用内存吗?
所以MS推荐了另一个类:System.Text.StringBuilder 类.

System.Text.StringBuilder 的存在就是为了证明 string是引用类型。
在泛型中约束 where T : struct 类型必须是一种值类型(struct) 传入string 不可以 也能证明 他是引用类型

所以我个人对string的理解是,它是一个引用类型的,只不过是它拥有了值类型的特征!

  

2. Class和Struct的区别?

    Class是引用类型,是分配在内存的堆上的,可以被实例化可以被继承;

    Struct是值类型,是分配在内存的栈上的。

3. Class和Object区别?

    类是汽车模板,或者用于构建汽车的规划;汽车本身是这些规划的实例,所以可以看作对象。

4. Public,Protect,Private,internal区别?

   public:  对任何类和成员都公开, 无限制访问;
   protected: 仅仅对该类以及该类的派生类公开;
   private: 仅仅对该类公开;
   internal: 只能值包含该类的程序集中访问该类(只是单独的项目,而不是整个解决方案);
   protected internal: 只能在本类,派生类或者包含该类的程序集中访问.

 

5、  面向对象方法中的“类”具有哪些特性:(ABC)

    A、属性;

    B、方法;

    C、事件;

    D、对象;

注:类主要由 “属性、方法、事件” 组成。

6、面向对象技术具有三个基本的特性:(ABC)

    A、封装;

    B、继承;

    C、多态;

    D、关联;

 

7、什么是装箱、拆箱?

    从值类型接口转换到引用类型叫装箱;从引用类型转换到值类型较拆箱。

8、GC是什么?为什么要用GC

     GC是垃圾收集器。程序员不用担心内存管理,因为GC会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:

     System.gc()

     Runtime.getRuntime().gc()

9、什么是SOAP,有哪些应用。
答:SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。这种相互通信采用的是XML格式的消息,具体请看:http://playist.blogchina.com/2521621.html

10、C#中的委托是什么事件是不是一种委托

答 :委托可以把一个方法作为参数代入另一个方法。

委托可以理解为指向一个函数的引用。

是,是一种特殊的委托

11、override与重载的区别

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

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

12、CTS、CLS、CLR分别作何解释?

答:CTS:通用语言系统。CLS:通用语言规范。CLR:公共语言运行库。

 13、启动一个线程是用run()还是start()?

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

14、 数组有没有length()这个方法? String有没有length()这个方法?

答:数组没有length()这个方法,有length的属性。String有有length()这个方法。

15、sleep() 和 wait() 有什么区别?

答:sleep()方法是使线程停止一段时间的方法。在sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级 (b)正在运行的线程因为其它原因而阻塞。

wait()是线程交互时,如果线程对一个同步对象x 发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。

16、谈谈final, finally, finalize的区别。

答: final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中 不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载

finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。

finalize—方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。

17、进程和线程的区别?

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

18、堆和栈的区别?

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

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

19、什么是虚函数?什么是抽象函数?

答:虚函数:没有实现的,可由子类继承并重写的函数。抽象函数:规定其非虚子类必须实现的函数,必须被重写。

20、什么是ASP.net中的用户控件?

答:用户控件一般用在内容多为静态,或者少许会改变的情况下..用的比较大..类似ASP中的include..但是功能要强大的多。

21、ASP。NET与ASP相比,主要有哪些进步?

答:asp解释形,aspx编译型,性能提高,有利于保护源码。

22、请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。

答:session(viewstate) 简单,但易丢失

    application        全局

    cookie             简单,但可能不支持,可能被伪造

    input ttype="hidden"     简单,可能被伪造

    url参数                  简单,显示于地址栏,长度有限

    数据库                   稳定,安全,但性能相对弱

 

 23、在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?using 指令 和语句 new 创建实例 new 隐藏基类中方法。

答:using 引入名称空间或者使用非托管资源

     new 新建实例或者隐藏父类方法

24、当整数a赋值给一个object对象时,整数a将会被?

答:装箱

25、类成员有_____种可访问形式?

答:this.;new Class().Method;

26、委托声明的关键字是______?

答:delegate.

27、 用sealed修饰的类有什么特点?

答:密封,不能继承

28、在.Net托管代码中我们不用担心内存漏洞,这是因为有了______?

答:GC。

29、.net的错误处理机制是什么?

答:.net错误处理机制采用try->catch->finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止。

30、 C# property attribute的区别他们各有什么用处这种机制的好处在哪里

答:attribute:自定义属性的基类;property :类中的属性;一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加性质

31、 C#可否对内存进行直接的操作

答:在.net下,.net引用了垃圾回收(GC)功能,它替代了程序员  不过在C#中,不能直接实现Finalize方法,而是在析构函数中调用基类的Finalize()方法

32、&和&&的区别。

&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and).

33、Overloaded的方法是否可以改变返回值的类型?

答:Overloaded的方法是可以改变返回值的类型。

34、error和exception有什么区别?

答:error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。

exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。

35、 重载与覆盖(重写)的区别?

答:1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系

     2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。

     3、覆盖要求参数列表相同;重载要求参数列表不同。

     4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。

Override和Overload有什么不同?(补充)

方法的重写Overriding和重载Overloading是Java多态性的不同表现。
重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。

如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载 (Overloading)。Overloaded的方法是可以改变返回值的类型。

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

答:不是。可以用任意类型。

37、在C#中,string str = null 与 string str = " " 请尽量使用文字或图象说明其中的区别。

答:null是没有空间引用的;

    " " 是空间为0的字符串;

38、C#中接口和类的异同

接口和类都是类,不同的事,接口只包含方法或属性的声明,不包含具体实现方法的代码,接口可以实现多继承,而类只能是单继承,继承接口的类必须实现接口中声明的方法或属性。接口主要定义一种规范,统一调用方法,在大型项目中接口正发挥日益重要的作用。

39、.net(C# or vb.net)如何启动另一个程序。

答案:process

40、DataReader和DataSet的异同

DataReader和DataSet最大的区别在于,DataReader使用时始终占用SqlConnection,在线操作数据库..任何对SqlConnection的操作都会引发DataReader的异常..因为DataReader每次只在内存中加载一条数据,所以占用的内存是很小的..因为DataReader的特殊性和高性能.所以DataReader是只进的..你读了第一条后就不能再去读取第一条了..

DataSet则是将数据一次性加载在内存中.抛弃数据库连接..读取完毕即放弃数据库连接..因为DataSet将数据全部加载在内存中.所以比较消耗内存...但是确比DataReader要灵活..可以动态的添加行,列,数据.对数据库进行回传更新操作...

41、ADONET相对于ADO等主要有什么改进

答:1:ado.net不依赖于ole db提供程序,而是使用.net托管提供的程序,2:不使用com3:不在支持动态游标和服务器端游 4:,可以断开connection而保留当前数据集可用 5:强类型转换 6:xml支持

42、62-63=1 等式不成立,请移动一个数字(不可以移动减号和等于号),使得等式成立,如何移动?

答案:62移动成2的6次方

43、.net(C# or vb.net)Appplication.Exit 还是 Form.Close有什么不同

答:一个是退出整个应用程序,一个是关闭其中一个form。

44、在.Net中所有可序列化的类都被标记为_____? 

答:[serializable]

45、XML 与 HTML 的主要区别

答:1. XML是区分大小写字母的,HTML不区分。 

    2. 在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略</p>或者</li>之类的结束标记。在XML中,绝对不能省略掉结束标记。 

    3. 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为结尾。这样分析器就知道不用查找结束标记了。 

    4. 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。 

    5. 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。

46、什么是code-Behind技术。

答:代码后植。ASPX,RESX和CS三个后缀的文件,这个就是代码分离.实现了HTML代码和服务器代码分离.方便代码编写和整理. 代码分离,这是个明智的东西,像ASP这样混成一堆很不爽.或者可以理解成HTML代码写在前台,C#代码写在后台.当然前台也有脚本,类的调用等,其实写在一起也是可以的.

47、ADO.net中常用的对象有哪些?分别描述一下。

答:Connection 数据库连接对象

    Command 数据库命令

    DataReader 数据读取器

    DataSet 数据集

48、什么是XML?

答:XML即可扩展标记语言。eXtensible Markup Language.标记是指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。如何定义这些标记,即可以选择国际通用的标记语言,比如HTML,也可以使用象XML这样由相关人士自由决定的标记语言,这就是语言的可扩展性。XML是从SGML中简化修改出来的。它主要用到的有XML、XSL和XPath等。

49、DataReader与Dataset有什么区别?

答:一个是只能向前的只读游标,一个是内存中的表

50、向服务器发送请求有几种方式?

答:get,post。get一般为链接方式,post一般为按钮方式。

51、软件开发过程一般有几个阶段?每个阶段的作用?

答:需求分析,架构设计,代码编写,QA,部署

52、请指出GAC的含义?

答:全局程序集缓存。

53、如何处理几十万条并发数据?

答:用存储过程或事务。取得最大标识的时候同时更新..注意主键不是自增量方式这种方法并发的时候是不会有重复主键的..取得最大标识要有一个存储过程来获取.

 

54、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

答:Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。

equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

55、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?

答:会执行,在return前执行

56、是否可以继承String类?

答:String类是final类故不可以继承。

57、构造器Constructor是否可被override?

答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。

58、启动一个线程是用run()还是start()?

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

 59、在.net中,配件的意思是?

答:程序集。(中间语言,源数据,资源,装配清单)

60、net中读写数据库需要用到那些类?他们的作用?

答:DataSet:数据存储器。

    DataCommand:执行语句命令。

    DataAdapter:数据的集合,用语填充。

61、用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层?

答:一般为3层

        数据访问层,业务层,表示层。

数据访问层对数据库进行增删查改。

业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。

表示层为了与用户交互例如用户添加表单。

优点:  分工明确,条理清晰,易于调试,而且具有可扩展性。

缺点:  增加成本。

62、UDP连接和TCP连接的异同。
答:前者只管传,不管数据到不到,无须建立连接.后者保证传输的数据准确,须要连结.

63、如何理解委托?
答:据说相当于函数指针,定义了委托就可以在不调用原方法名称的情况下调用那个方法.
msdn2005中是这样解释的:
委托具有以下特点:
委托类似于 C++ 函数指针,但它是类型安全的。
委托允许将方法作为参数进行传递。
委托可用于定义回调方法。
委托可以链接在一起;例如,可以对一个事件调用多个方法。
方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。
C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。

64、什么是ASP.net中的用户控件
答:用户控件就是.ascx扩展名的东西喽,可以拖到不同的页面中调用,以节省代码.比如登陆可能在多个页面上有,就可以做成用户控件,但是有一个问题就是用户控件拖到不同级别的目录下后里面的图片等的相对路径会变得不准确,需要自已写方法调整.

65、new有几种用法

 第一种:new Class();
 第二种:覆盖方法
public new XXXX(){}
 第三种:new 约束指定泛型类声明中的任何类型参数都必须有公共的无参数构造函数。 

66、概述反射和序列化 

反射:程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性

序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。

 

参考:http://www.cnblogs.com/huikof/archive/2009/02/28/960939.html

http://www.cnblogs.com/weihai2003/archive/2008/10/24/1319003.html

posted @ 2010-08-05 17:04  AnnieBy  阅读(316)  评论(0编辑  收藏  举报