C# 面试题集 (19道)

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

   A propertyattribute汉语都称之为属性。不过property是指类向外提供的数据区域。而attribute则是描述对象在编译时或运行时属性的。这两者是有本质区别的。参考资料

 

2、讲一讲你理解的web service,dot net framework中,怎么很好的结合xml?(讲概念就行了)

    从表面上看,Web Service就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web调用来实现某个功能的应用程序。从深层次上看,Web Service是一种新的Web应用程序分支,它们是自包含、自描述、模块化的应用,可以在网络(通常为Web)中被描述、发布、查找以及通过Web来调用。可扩展的标记语言XMLWeb Service平台中表示数据的基本格式。除了易于建立和易于分析外,XML主要的优点在于它既与平台无关,又与厂商无关。XML是由万维网协会(W3C)创建,W3C制定的XML SchemaXSD定义了一套标准的数据类型,并给出了一种语言来扩展这套数据类型。Web Service平台是用XSD来作为数据类型系统的。当你用某种语言如VB.NETC#来构造一个Web Service时,为了符合Web Service标准,所有你使用的数据类型都必须被转换为XSD类型。如想让它使用在不同平台和不同软件的不同组织间传递,还需要用某种东西将它包装起来。这种东西就是一种协议,如 SOAP

 3. C#, Java c++的特点,有什么相同的地方,不同的地方, C#分别从c++java中吸取了他们那些优点?

A:    C#看起来与Java有着惊人的相似;它包括了诸如单一继承,界面,Java几乎同样的语法,和编译成中间代码再运行的过程.但是C#Java有着明显的不同,它借鉴了Delphi的一个特点,COM(组件对象模型)是直接集成。
微软c#语言定义主要是从CC++继承而来的,而且语言中的许多元素也反映了这一点.C#在设计者从C++继承的可选选项方面比Java要广泛一些(比如说 structs),它还增加了自己新的特点(比方说源代码版本定义).

C#
Java继承而来的特点

:C#中类的申明与Java很相似。特点看起来与Java相比没有变化.布尔运算:条件表达式的结果是布尔数据类型,布尔数据类型是这种语言中独立的一种数据类型.从布尔类型到其他类型没有直接的转换过程.布尔常量truefalseC#中的关键字.错误处理:Java中那样,通过抛出和捕捉异常对象来管理错误处理过程.内存管理:底层.NET框架进行自动内存垃圾回收.

C#
CC++继承的特点

编译:程序直接编译成标准的二进制可执行形式.

结构体:一个C#的结构体与C++的结构体是相似的,因为它能够包含数据申明和方法.但是,不象C++,C#结构体与类是不同的而且不支持继承.但是,Java相同的是,一个结构体可以实现界面.
预编译:C#中存在预编译指令支持条件编译,警告,错误报告和编译行控制. #error

C#
独有的特点
中间代码:微软在用户选择何时MSIL应该编译成机器码的时候是留了很大的余地.微软公司很小心的声称MSIL不是解释性的,而是被编译成了机器码.它也明白许多--如果不是大多数的话--程序员认为Java程序要不可避免的比C编写的任何东西都要慢.而这种实现方式决定了基于MSIL的程序(指的是用 C#,Visual Basic,"Managed C++"--C++的一个符合CLS的版本--等语言编写的程序)将在性能上超过"解释性的"Java代码.当然,这一点还需要得到事实证明,因为C#其他生成MSIL的编译器还没有发布.但是Java JIT编译器的普遍存在使得JavaC#在性能上相对相同."C#是编译语言而Java是解释性的,"之类的声明只是商业技巧.Java的中间代码和 MSIL都是中间的汇编形式的语言,它们在运行时或其它的时候被编译成机器代码.

命名空间中的申明:当你创建一个程序的时候,你在一个命名空间里创建了一个或多个类.同在这个命名空间里(在类的外面)你还有可能声明界面,枚举类型和结构体.必须使用using关键字来引用其他命名空间的内容.
基本的数据类型:C#拥有比C,C++或者Java更广泛的数据类型.这些类型是bool, byte, ubyte, short, ushort, int, uint, long, ulong, float, double,decimal.Java一样,所有这些类型都有一个固定的大小.又象CC++一样,每个数据类型都有有符号和无符号两种类型. Java相同的是,一个字符变量包含的是一个16位的Unicode字符.C#新的数据类型是decimal数据类型,对于货币数据,它能存放2810 进制数字.

两个基本类:一个名叫object的类是所有其他类的基类.而一个名叫string的类也象object一样是这个语言的一部分.作为语言的一部分存在意味着编译器有可能使用它--无论何时你在程序中写入一句带引号的字符串,编译器会创建一个string对象来保存它.
参数传递:方法可以被声明接受可变数目的参数.缺省的参数传递方法是对基本数据类型进行值传递.ref关键字可以用来强迫一个变量通过引用传递,这使得一个变量可以接受一个返回值.out关键字也能声明引用传递过程,ref不同的地方是,它指明这个参数并不需要初始值.
COM 的集成:C#Windows程序最大的卖点可能就是它与COM的无缝集成了,COM就是微软的Win32组件技术.实际上,最终有可能在任何.NET语言里编写COM客户和服务器端.C#编写的类可以子类化一个以存在的COM组件;生成的类也能被作为一个COM组件使用,然后又能使用,比方说, JScript语言子类化它从而得到第三个COM组件.这种现象的结果是导致了一个运行环境的产生,在这个环境里的组件是网络服务,可用用任何.NET言子类化.
索引下标:一个索引与属性除了不使用属性名来引用类成员而是用一个方括号中的数字来匿名引用(就象用数组下标一样)以外是相似的.
代理和反馈:一个代理对象包括了访问一个特定对象的特定方法所需的信息.只要把它当成一个聪明的方法指针就行了.代理对象可以被移动到另一个地方,然后可以通过访问它来对已存在的方法进行类型安全的调用.一个反馈方法是代理的特例.event关键字用在将在事件发生的时候被当成代理调用的方法声明中.

4. C#可否对内存进行直接的操作?(这可是个难点哦?要注意!)

A:C#Unsafe 模式下可以使用指针对内存进行操作, 但在托管模式下不可以使用指针。
【详细资料】
1.在 Visual Studio 开发环境中设置/unsafe(启用不安全模式)编译器选项
打开项目的“属性”页。
单击“生成”属性页。
选中“允许不安全代码”复选框。

2.unsafe关键字表示不安全上下文,该上下文是任何涉及指针的操作所必需的。
可以在类型或成员的声明中使用 unsafe修饰符。
因此,类型或成员的整个正文范围均被视为不安全上下文。例如,以下是用 unsafe 修饰符声明的方法:
unsafe static void FastCopy(byte[] src, byte[] dst, int count)
{
    // Unsafe context: can use pointers here.
}
不安全上下文的范围从参数列表扩展到方法的结尾,因此指针在以下参数列表中也可以使用:
unsafe static void FastCopy ( byte* ps, byte* pd, int count ) {...}

还可以使用不安全块从而能够使用该块内的不安全代码。例如:
unsafe
{
    // Unsafe context: can use pointers here.
}
若要编译不安全代码,必须指定 /unsafe编译器选项。
无法通过公共语言运行库验证不安全代码。

示例

ContractedBlock.gif ExpandedBlockStart.gif Code
None.gif// cs_unsafe_keyword.cs
None.gif
// compile with: /unsafe
None.gif
using System;
None.gif
class UnsafeTest
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
// Unsafe method: takes pointer to int:
InBlock.gif
    unsafe static void SquarePtrParam(int* p)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
**= *p;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
unsafe static void Main()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
int i = 5;
InBlock.gif        
// Unsafe method: uses address-of operator (&):
InBlock.gif
        SquarePtrParam(&i);
InBlock.gif        Console.WriteLine(i);
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif

 

5. Visual C++ 6.0编写的代码(unmanaged code),如何在CLR下和其他dot net component结合?

A:net Com 互操作 .net中可以通过添加引用的方式将COM 加载在CLR下,将原有的COM中的类型相应变化为.Net 下可识别的类型

 

6. C#实现以下功能
   a 
产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
   b 
对上面生成的数组排序,需要支持升序、降序两种顺序

A a:

using System;

public class MainEntry

{

    public static void Main()

    {

             int[] arrayint=new int[100];

             Random random=new Random(1);

             for(int i=1;i<=100;i++)

             {  

                  int index=random.Next(0,100);

                  if(arrayint[index]==0)

                           arrayint[index]=i;

                  else

                           i--;

             }

             foreach(int i in arrayint)

             {

                  Console.Write(i);

                  Console.Write(""t");

             }  

    }

}


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

1查询字符串。

优点:简单易用;资源占用比较少。

缺点:传递数据大小有限制,只能传递基本类型的数据,安全性差

2页面提交(POST

优点安全性高,简单易用,资源占用多

缺点:只适合在HTML页面中使用,传递数据多,不能传递对象。

3 Server.Trantfer()

优点安全性高灵活性强能传递复杂的对象

缺点资源消耗大

4 Session

优点安全性高灵活性强能传递复杂的对象

缺点资源消耗大

5 Appliction

优点安全性高灵活性强能传递复杂的对象

缺点资源消耗大

6 Cookie

缺点大小有限制不能超过4KB 不恩能够存储复杂对面


8。请说明.net中的错误处理机制,并举例

Try

{

   //……//

}

Catch()

{

 Throw e;

}

Finally

{

 Conn.Close();

}


9。请说出强名的含义

对程序集,进行公钥/私钥对签名。称为强名 ,用名称,版本,文化,公钥唯一确定程序集。

【详细资料】
    强名称是由程序集的标识加上公钥和数字签名组成的。其中,程序集的标识包括简单文本名称、版本号和区域性信息(如果提供的话)。强名称是使用相应的私钥,通过程序集文件(包含程序集清单的文件,并因而也包含构成该程序集的所有文件的名称和散列)生成的。Microsoft® Visual Studio® .NET 和在 .NET Framework SDK 中提供的其他开发工具能够将强名称分配给一个程序集。强名称相同的程序集应该是相同的。

通过签发具有强名称的程序集,您可以确保名称的全局唯一性。强名称还特别满足以下要求:

  • 强名称依赖于唯一的密钥对来确保名称的唯一性。任何人都不会生成与您生成的相同的程序集名称,因为用一个私钥生成的程序集的名称与用其他私钥生成的程序集的名称不相同。

  • 强名称保护程序集的版本沿袭。强名称可以确保没有人能够生成您的程序集的后续版本。用户可以确信,他们所加载的程序集的版本出自创建该版本(应用程序是用该版本生成的)的同一个发行者。

  • 强名称提供可靠的完整性检查。通过 .NET Framework 安全检查后,即可确信程序集的内容在生成后未被更改过。但请注意,强名称中或强名称本身并不暗含信任级别,例如由数字签名和支持证书提供的信任。

在引用具有强名称的程序集时,您应该能够从中受益,例如版本控制和命名保护。如果此具有强名称的程序集以后引用了具有简单名称的程序集(后者没有这些好处),则您将失去使用具有强名称的程序集所带来的好处,并依旧会产生 DLL 冲突。因此,具有强名称的程序集只能引用其他具有强名称的程序集。


10。请列出c#中几种循环的方法,并指出他们的不同

A:4:

For :使用于确定次数的循环

Foreach:使用于遍历的元素只读

Dowhile: 次数不确定条件随机变化但至少要保证能被执行一次

While:次数不确定条件随机变化

 

11。请指出.net中所有类型的基类

A: object

 

12。请指出GAC的含义

A: 全局程序集缓存Global Assembly Cache)存放共享程序集的文件夹 GAC 中的程序集可被任何项目使用.
【详细资料】

    安装有公共语言运行库的每台计算机都具有称为全局程序集缓存的计算机范围内的代码缓存。全局程序集缓存中存储了专门指定给由计算机中若干应用程序共享的程序集。
    应当仅在需要时才将程序集安装到全局程序集缓存中以进行共享。一般原则是:程序集依赖项保持专用,并在应用程序目录中定位程序集,除非明确要求共享程序集。另外,不必为了使 COM interop 或非托管代码可以访问程序集而将程序集安装到全局程序集缓存。

有若干方法可以将程序集部署到全局程序集缓存中:

  • 使用专用于全局程序集缓存的安装程序。该方法是将程序集安装到全局程序集缓存的首选方法。

  • 使用 .NET Framework SDK 所提供的名为<?XML:NAMESPACE PREFIX = MSHelp NS = "http://msdn.microsoft.com/mshelp" /> 的开发人员工具。

  • 使用 Windows 资源管理器将程序集拖到缓存中。

在全局程序集缓存中部署的程序集必须具有强名称。将一个程序集添加到全局程序集缓存时,必须对构成该程序集的所有文件执行完整性检查。缓存执行这些完整性检查以确保程序集未被篡改(例如,当文件已更改但清单未反映此更改时)。

 

13SQL SREVER中,向一个表中插入了新数据,如何快捷的得到自增量字段的当前值

A:Insert tableName values()

Select @@IDENTITY           多种方法比较

 

14. 您在什么情况下会用到虚方法或抽象类?它与接口有什么不同?

A: 如果某个方法可能性在派生类中会被重写。这时就将该方法写为虚方法。

抽象类:是一个类型,与派生类之间的关系是一个“ISA”的关系。用来做基类

语法:抽象类不能创建对象,类中包括抽象方法和实例方法。

接口:设计:接口是一个规范,描述了Can do ;与实现类之间是中”LINE A 的关系

语法接口可以多实现 C#中接口不能包含字段访问修饰符。
    接口和类的区别是本质的,类是负责功能的实现,而接口则是负责功能的定义,项目中可以通过实现接口来规范类,操作类,抽象类的概念,从而达到高度的抽象,你也可以称接口为一个没有功能的类.

 

15: Override与重载有什么区别?

A: override 是方法重写,而overload是方法重载.

Override 发生在基类与派生类之间,派生类中的方法用override 修饰表示重写基类中同名的方法,派生类的重写方法与基类中方法签名一致,并只能重写基类中声明为 abstact , virtual override 的方法。

Overload 发生在同一作用域中,如类域,表示类中的方法的不同版本,实现重载的方法必须方法名称相同,方法参数列表不同,

【override修饰符,覆写一个基类中的方法...重载则是将同名方法重新写过,达到同名的函数实现不同的功能.从而实现了一个方法有不同的版本.override与重载的本质区别是,加入了override的修饰符的方法,此方法始终只有一个被你使用的方法】

16:值类型与引用类型有什么区别?

C# 支持两种类型:“值类型引用类型
值类型(如
charintfloat)、枚举类型和结构类型。
引用类型包括类 (Class) 类型、接口类型、委托类型和数组类型。
<?XML:NAMESPACE PREFIX = O />

值类型与引用类型的区别在于值类型的变量直接包含其数据而引用类型的变量则存储对象引用。对于引用类型,两个变量可能引用同一个对象,因此对一个变量的操作可能影响另一个变量所引用的对象。对于值类型,每个变量都有自己的数据副本,对一个变量的操作不可能影响另一个变量。


示例



ContractedBlock.gif ExpandedBlockStart.gif Code
None.gifusing System; 
None.gif
None.gif
class Class1 
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
InBlock.gif
InBlock.gif     
public int Value = 0
InBlock.gif
ExpandedBlockEnd.gif}
 
None.gif
None.gif
class Test 
None.gif
ExpandedBlockStart.gifContractedBlock.gif
dot.gif
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif     
static void Main() dot.gif
InBlock.gif
InBlock.gif         
int val1 = 0
InBlock.gif
InBlock.gif         
int val2 = val1; 
InBlock.gif
InBlock.gif         val2 
= 123
InBlock.gif
InBlock.gif         Class1 ref1 
= new Class1(); 
InBlock.gif
InBlock.gif         Class1 ref2 
= ref1; 
InBlock.gif
InBlock.gif         ref2.Value 
= 123
InBlock.gif
InBlock.gif         Console.WriteLine(
"Values: {0}, {1}", val1, val2); 
InBlock.gif
InBlock.gif         Console.WriteLine(
"Refs: {0}, {1}", ref1.Value, ref2.Value); 
InBlock.gif
ExpandedSubBlockEnd.gif     }
 
InBlock.gif
ExpandedBlockEnd.gif}
 
None.gif
None.gif

显示了这种区别。运行该程序

可见下列输出

Values: 0, 123

Refs: 123, 123

 

17:怎样理解静态变量?

A:静态变量属于类,而不属于对象,并对所有对象所享,静态成员在加类的时候就被加载。

【静态成员变量是和类相关联的,可以作为类中"共"有的变量(是一个共性的表现),他不依赖特定对象的存在,访问的时候通过类名加点操作符加变量名来访问.】详细

 

18:向服务器发送请求有几种方式?

APOST GET   SOAP    比较

 

19DataReaderDataset有什么区别?

ADataReader:是只读的读取器,在读取过程中需要与数据源保持连接状态无缓存

Dataset:将数据院中的数据缓存在对象中,然后在短开连接可进行读取与写入操作
【参考资料】



转载于:https://www.cnblogs.com/jdmei520/articles/1257464.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值