C程序员面试必答.doc

上传人:帮**** 文档编号:860521 上传时间:2019-08-08 格式:DOC 页数:28 大小:159.50KB
返回 下载 相关 举报
C程序员面试必答.doc_第1页
第1页 / 共28页
C程序员面试必答.doc_第2页
第2页 / 共28页
点击查看更多>>
资源描述

《C程序员面试必答.doc》由会员分享,可在线阅读,更多相关《C程序员面试必答.doc(28页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、C# 程序员面试必答1.静态变量和非静态变量的区别? 答: 静态变量: 静态变量使用 static 修饰符进行声明 在所属类被装载时创建 通过类进行访问 所属类的所有实例的同一静态变量都是同一个值 非静态变量: 不带有 static 修饰符声明的变量称做非静态变量 在类被实例化时创建 通 过对象进行访问 同一个类的不同实例的同一非静态变量可以是不同的值 示例:using System; using System.Collections.Generic; using System.Text; namespace Example01 class Programclass Class1public

2、static String staticStr = quot;Classquot;public String notstaticStr = quot;Objquot;static void Main(string args)/静态变量通过类进行访问,该类所有实例的同一静态变量都是同一个值Console.WriteLine(quot;Class1s staticStr: 0quot;, Class1.staticStr);Class1 tmpObj1 = new Class1();tmpObj1.notstaticStr = quot;tmpObj1quot;Class1 tmpObj2 = n

3、ew Class1();tmpObj2.notstaticStr = quot;tmpObj2quot;/非静态变量通过对象进行访问,不同对象的同一非静态变量可以有不同的 值Console.WriteLine(quot;tmpObj1s notstaticStr: 0quot;, tmpObj1.notstaticStr);Console.WriteLine(quot;tmpObj2s notstaticStr: 0quot;, tmpObj2.notstaticStr);Console.ReadLine(); 复制代码 结果: Class1s staticStr: Class tmpObj1

4、s notstaticStr: tmpObj1 tmpObj2s notstaticStr: tmpObj2 2.const 和 static readonly 区别? 答: const 用 const 修饰符声明的成员叫常量,是在编 译期初始化并嵌入到客户端程序 static readonly 用 static readonly 修饰符声明的成员依然 是变量,只不过具有和常量类似的使用方法:通过类进行访问、初始化后不可以修改。但 与常量不同的是这种变量是在运行期初始化 示例: 测试类:using System; using System.Collections.Generic; using

5、System.Text; namespace Example02Lib public class Class1public const String strConst = quot;Constquot;public static readonly String strStaticReadonly = quot;StaticReadonlyquot;/public const String strConst = quot;Const Changedquot;/public static readonly String strStaticReadonly = quot;StaticReadonly

6、 Changedquot;/5-1-a-s-p-x 复制代码 客户端代码:using System; using System.Collections.Generic; using System.Text; using Example02Lib; namespace Example02 class Programstatic void Main(string args)/修改 Example02 中 Class1 的 strConst 初始值后,只编译 Example02Lib 项目/然后到资源管理器里把新编译的 Example02Lib.dll 拷贝 Example02.exe 所在 的目录

7、,执行 Example02.exe/切不可在 IDE 里直接调试运行因为这会重新编译整个解决方案!/可以看到 strConst 的输出没有改变,而 strStaticReadonly 的输出已经改变/表明 Const 变量是在编译期初始化并嵌入到客户端程序,而 StaticReadonly 是在运行时初始化的Console.WriteLine(quot;strConst : 0quot;, Class1.strConst);Console.WriteLine(quot;strStaticReadonly : 0quot;, Class1.strStaticReadonly);Console.R

8、eadLine(); 复制代码 结果: strConst : Const strStaticReadonly : StaticReadonly 修改后的示例: 测试类:using System; using System.Collections.Generic; using System.Text; namespace Example02Lib public class Class1/public const String strConst = quot;Constquot;/public static readonly String strStaticReadonly = quot;Stat

9、icReadonlyquot;public const String strConst = quot;Const Changedquot;public static readonly String strStaticReadonly = quot;StaticReadonly Changedquot; 复制代码 结果 strConst : Const strStaticReadonly : StaticReadonly Changed 3.extern 是什么意思? 答: extern 修饰符用于声明由程序集外部实现的成员函数 经常用于系统 API 函数的调用(通 过 DllImport )

10、。注意,和 DllImport 一起使用时要加上 static 修饰符 也可以用于对于同 一程序集不同版本组件的调用(用 extern 声明别名) 不能与 abstract 修饰符同时使用 51aspx 示例:using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace Example03 class Program/注意 DllImport 是一个 Attribute Property,在 System.Runtime.Int

11、eropServices 命名 空间中定义/extern 与 DllImport 一起使用时必须再加上一个 static 修饰符DllImport(quot;User32.dllquot;)public static extern int MessageBox(int Handle, string Message, string Caption, int Type);static int Main()string myString;Console.Write(quot;Enter your message: quot;);myString = Console.ReadLine();return

12、 MessageBox(0, myString, quot;My Message Boxquot;, 0); 复制代码 结果: 4.abstract 是什么意思? 答: abstract 修饰符可以用于类、方法、属性、事件和索 引指示器(indexer) ,表示其为抽象成员 abstract 不可以和 static 、virtual 、override 一 起使用 声明为 abstract 成员可以不包括实现代码,但只有类中还有未实现的抽象成员, 该类就不可以被实例化,通常用于强制继承类必须实现某一成员 示例:using System; using System.Collections.Gen

13、eric; using System.Text; namespace Example04 #region 基类,抽象类public abstract class BaseClass/抽象属性,同时具有 get 和 set 访问器表示继承类必须将该属性实现为可读写public abstract String Attributeget;set;/抽象方法,传入一个字符串参数无返回值public abstract void Function(String value);/抽象事件,类型为系统预定义的代理(delegate):EventHandlerpublic abstract event Even

14、tHandler Event;/抽象索引指示器,只具有 get 访问器表示继承类必须将该索引指示器实现为只读public abstract Char thisint Indexget;#endregion#region 继承类public class DeriveClass : BaseClassprivate String attribute;public override String Attributegetreturn attribute;setattribute = value;public override void Function(String value)attribute

15、= value;if (Event != null)Event(this, new EventArgs();public override event EventHandler Event;public override Char thisint Indexgetreturn attributeIndex;#endregionclass Programstatic void OnFunction(object sender, EventArgs e)for (int i = 0; i B 必须进行强制类型转换(B = (B)A) implicit 表示隐 式转换,如从 B - A 只需直接赋值

16、(A = B) 隐式转换可以让我们的代码看上去更漂亮、 更简洁易懂,所以最好多使用 implicit 运算符。不过!如果对象本身在转换时会损失一些 信息(如精度) ,那么我们只能使用 explicit 运算符,以便在编译期就能警告客户调用端 示例:using System; using System.Collections.Generic; using System.Text; namespace Example23 class Program/本例灵感来源于大话西游经典台词“神仙?妖怪?”-主要是我实在想不出什么 好例子了class Immortalpublic string name;pu

17、blic Immortal(string Name)name = Name;public static implicit operator Monster(Immortal value)return new Monster(value.name + quot;:神仙变妖怪?偷偷下凡即 可。 。 。quot;);class Monsterpublic string name;public Monster(string Name)name = Name;public static explicit operator Immortal(Monster value)return new Immorta

18、l(value.name + quot;:妖怪想当神仙?再去修炼 五百年!quot;);static void Main(string args)Immortal tmpImmortal = new Immortal(quot;紫霞仙子quot;);/隐式转换Monster tmpObj1 = tmpImmortal;Console.WriteLine(tmpObj1.name);Monster tmpMonster = new Monster(quot;孙悟空quot;);/显式转换Immortal tmpObj2 = (Immortal)tmpMonster;Console.WriteLi

19、ne(tmpObj2.name);Console.ReadLine(); 复制代码 结果: 紫霞仙子:神仙变妖怪?偷偷下凡即可。 。 。 孙悟空:妖怪想当神仙?再去修炼五 百年! 24.params 有什么用? 答: params 关键字在方法成员的参数列表中使用,为该方 法提供了参数个数可变的能力 它在只能出现一次并且不能在其后再有参数定义,之前可以 示例:using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 class App/第一个参数必须是整型,但

20、后面的参数个数是可变的。/而且由于定的是 object 数组,所有的数据类型都可以做为参数传入public static void UseParams(int id, params object list)Console.WriteLine(id);for (int i = 0; i list.Length; i+)Console.WriteLine(listi);static void Main()/可变参数部分传入了三个参数,都是字符串类型UseParams(1, quot;aquot;, quot;bquot;, quot;cquot;);/可变参数部分传入了四个参数,分别为字符串、整数

21、、浮点数和双精度浮 点数数组UseParams(2, quot;dquot;, 100, 33.33, new double 1.1, 2.2 );Console.ReadLine(); 复制代码 结果: 1 a b c 2 d 100 33.33 System.Double 25.什么是反射? 答: 反射,Reflection,通过它我们可以在运行时获得各种信息,如程序集、模块、类型、字段、属性、方法和事件 通过对类型动态实例化后,还可以对其执行操作 一般用于插件式框架程序和设计模式的实 现,当然反射是一种手段可以充分发挥其能量来完成你想做的任何事情(前面好象见过一 位高人用反射调用一个官方

22、类库中未说明的函数。 。 。 ) 示例:using System; using System.Collections.Generic; using System.Text; namespace Example25Lib public class Class1private string name;private int age;/如果显式的声明了无参数构造函数,客户端只需要用程序集的 CreateInstance 即 可实例化该类/在此特意不实现,以便在客户调用端体现构造函数的反射实现/public Class1()/public Class1(string Name, int Age)nam

23、e = Name;age = Age;public void ChangeName(string NewName)name = NewName;public void ChangeAge(int NewAge)age = NewAge;public override string ToString()return string.Format(quot;Name: 0, Age: 1quot;, name, age); 复制代码 反射实例化对象并调用其方法,属性和事件的反射调用略去using System; using System.Collections.Generic;using Syste

24、m.Text; /注意添加该反射的命名空间 using System.Reflection; namespace Example25 class Programstatic void Main(string args)/加载程序集Assembly tmpAss = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + quot;Example25Lib.dllquot;);/遍历程序集内所有的类型,并实例化Type tmpTypes = tmpAss.GetTypes();foreach (Type tmpType in tmpTy

25、pes)/获取第一个类型的构造函数信息ConstructorInfo tmpConsInfos = tmpType.GetConstructors();foreach (ConstructorInfo tmpConsInfo in tmpConsInfos)/为构造函数生成调用的参数集合ParameterInfo tmpParamInfos = tmpConsInfo.GetParameters(); object tmpParams = new objecttmpParamInfos.Length;for (int i = 0; i tmpParamInfos.Length; i+)tmpP

26、aramsi = tmpAss.CreateInstance(tmpParamInfosi.ParameterType.FullName);if (tmpParamInfosi.ParameterType.FullName = quot;System.Stringquot;)tmpParamsi = quot;Clarkquot;/实例化对象object tmpObj = tmpConsInfo.Invoke(tmpParams);Console.WriteLine(tmpObj);/获取所有方法并执行foreach (MethodInfo tmpMethod in tmpType.GetMe

27、thods()/为方法的调用创建参数集合tmpParamInfos = tmpMethod.GetParameters();tmpParams = new objecttmpParamInfos.Length;for (int i = 0; i tmpParamInfos.Length; i+)tmpParamsi = tmpAss.CreateInstance(tmpParamInfosi.ParameterType.FullName);if (tmpParamInfosi.ParameterType.FullName = quot;System.Stringquot;)tmpParamsi = quot;Clark Zhengquot;if (tmpParamInfosi.ParameterType.FullName = quot;System.Int32quot;)tmpParamsi = 27;tmpMethod.Invoke(tmpObj, tmpParams);/调用完方法后再次打印对象,比较结果Console.WriteLine(tmpObj);Console.ReadLine(); 复制代码

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文献 > 管理制度

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com