1、C# 程序员面试必答1.静态变量和非静态变量的区别? 答: 静态变量: 静态变量使用 static 修饰符进行声明 在所属类被装载时创建 通过类进行访问 所属类的所有实例的同一静态变量都是同一个值 非静态变量: 不带有 static 修饰符声明的变量称做非静态变量 在类被实例化时创建 通过对象进行访问 同一个类的不同实例的同一非静态变量可以是不同的值 示例:using System;using System.Collections.Generic;using System.Text;namespace Example01class Programclass Class1public stati
2、c 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 = new Cl
3、ass1();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 tmpObj1s notsta
4、ticStr: tmpObj1 tmpObj2s notstaticStr: tmpObj2 2.const 和 static readonly 区别? 答: const 用 const 修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序 static readonly 用 static readonly 修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法:通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行期初始化 示例: 测试类:using System;using System.Collections.Generic;using System.Text;n
5、amespace Example02Libpublic 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 Changedquot;/5
6、-1-a-s-p-x复制代码客户端代码:using System;using System.Collections.Generic;using System.Text;using Example02Lib;namespace Example02class Programstatic void Main(string args)/修改 Example02 中 Class1 的 strConst 初始值后,只编译 Example02Lib 项目/然后到资源管理器里把新编译的 Example02Lib.dll 拷贝 Example02.exe 所在的目录,执行 Example02.exe/切不可在
7、IDE 里直接调试运行因为这会重新编译整个解决方案!/可以看到 strConst 的输出没有改变,而 strStaticReadonly 的输出已经改变/表明 Const 变量是在编译期初始化并嵌入到客户端程序,而 StaticReadonly是在运行时初始化的Console.WriteLine(quot;strConst : 0quot;, Class1.strConst);Console.WriteLine(quot;strStaticReadonly : 0quot;, Class1.strStaticReadonly);Console.ReadLine();复制代码结果: strCon
8、st : Const strStaticReadonly : StaticReadonly 修改后的示例: 测试类:using System;using System.Collections.Generic;using System.Text;namespace Example02Libpublic class Class1/public const String strConst = quot;Constquot;/public static readonly String strStaticReadonly = quot;StaticReadonlyquot;public const St
9、ring strConst = quot;Const Changedquot;public static readonly String strStaticReadonly = quot;StaticReadonly Changedquot;复制代码结果 strConst : Const strStaticReadonly : StaticReadonly Changed 3.extern 是什么意思? 答: extern 修饰符用于声明由程序集外部实现的成员函数 经常用于系统 API 函数的调用(通过 DllImport ) 。注意,和 DllImport 一起使用时要加上 static 修
10、饰符 也可以用于对于同一程序集不同版本组件的调用(用 extern 声明别名) 不能与 abstract 修饰符同时使用51aspx 示例:using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;namespace Example03class Program/注意 DllImport 是一个 Attribute Property,在 System.Runtime.InteropServices 命名空间中定义/extern 与 DllImport
11、一起使用时必须再加上一个 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 MessageBox(0, myString, quot;My Message
12、Boxquot;, 0);复制代码结果: 4.abstract 是什么意思? 答: abstract 修饰符可以用于类、方法、属性、事件和索引指示器(indexer) ,表示其为抽象成员 abstract 不可以和 static 、virtual 、override 一起使用 声明为 abstract 成员可以不包括实现代码,但只有类中还有未实现的抽象成员,该类就不可以被实例化,通常用于强制继承类必须实现某一成员 示例:using System;using System.Collections.Generic;using System.Text;namespace Example04#regi
13、on 基类,抽象类public abstract class BaseClass/抽象属性,同时具有 get 和 set 访问器表示继承类必须将该属性实现为可读写public abstract String Attributeget;set;/抽象方法,传入一个字符串参数无返回值public abstract void Function(String value);/抽象事件,类型为系统预定义的代理(delegate):EventHandlerpublic abstract event EventHandler Event;/抽象索引指示器,只具有 get 访问器表示继承类必须将该索引指示器实
14、现为只读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 = value;if (Event != null)Event(this, new EventArg
15、s();public override event EventHandler Event;public override Char thisint Indexgetreturn attributeIndex;#endregionclass Programstatic void OnFunction(object sender, EventArgs e)for (int i = 0; i (DeriveClass)sender).Attribute.Length; i+)Console.WriteLine(DeriveClass)sender)i);static void Main(string
16、 args)DeriveClass tmpObj = new DeriveClass();tmpObj.Attribute = quot;1234567quot;Console.WriteLine(tmpObj.Attribute);/将静态函数 OnFunction 与 tmpObj 对象的 Event 事件进行关联tmpObj.Event += new EventHandler(OnFunction);tmpObj.Function(quot;7654321quot;);Console.ReadLine();复制代码结果: 1234567 7 6 5 4 3 2 1 5.internal
17、修饰符起什么作用? 答: internal 修饰符可以用于类型或成员,使用该修饰符声明的类型或成员只能在同一程集内访问 接口的成员不能使用 internal 修饰符 示例 Example05Lib 项目的 Class1using System;using System.Collections.Generic;using System.Text;namespace Example05Libpublic class Class1internal String strInternal = null;public String strPublic;复制代码结果 Example05Lib 项目的 Cla
18、ss2 类可以访问到 Class1 的 strInternal 成员 Example05 项目的 Program 类无法访问到 Class1 的 strInternal 成员 6.sealed 修饰符是干什么的? 答: sealed 修饰符表示密封 用于类时,表示该类不能再被继承,不能和 abstract 同时使用,因为这两个修饰符在含义上互相排斥 用于方法和属性时,表示该方法或属性不能再被继承,必须和 override 关键字一起使用,因为使用 sealed 修饰符的方法或属性肯定是基类中相应的虚成员 通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结
19、构体系混乱 恰当的利用 sealed 修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员 示例:using System;using System.Collections.Generic;using System.Text;namespace Example06class Programclass Apublic virtual void F()Console.WriteLine(quot;A.Fquot;);public virtual void G()Console.WriteLine(quot;A.Gquot;);class B : Apublic sealed overri
20、de void F()Console.WriteLine(quot;B.Fquot;);public override void G()Console.WriteLine(quot;B.Gquot;);class C : Bpublic override void G()Console.WriteLine(quot;C.Gquot;);static void Main(string args)new A().F();new A().G();new B().F();new B().G();new C().F();new C().G();Console.ReadLine();复制代码结果: 类 B
21、 在继承类 A 时可以重写两个虚函数,如图所示: 由于类 B 中对 F 方法进行了密封, 类 C 在继承类 B 时只能重写一个函数,如图所示: 控制台输出结果,类 C 的方法 F 只能是输出 类 B 中对该方法的实现: A.F A.G B.F B.G B.F C.G 7.override 和 overload 的区别? 答: override 表示重写,用于继承类对基类中虚成员的实现 overload 表示重载,用于同一个类中同名方法不同参数(包括类型不同或个数不同)的实现 示例:using System;using System.Collections.Generic;using Syste
22、m.Text;namespace Example07class Programclass BaseClasspublic virtual void F()Console.WriteLine(quot;BaseClass.Fquot;);class DeriveClass : BaseClasspublic override void F()base.F();Console.WriteLine(quot;DeriveClass.Fquot;);public void Add(int Left, int Right)Console.WriteLine(quot;Add for Int: 0quot
23、;, Left + Right);public void Add(double Left, double Right)Console.WriteLine(quot;Add for int: 0quot;, Left + Right);static void Main(string args)DeriveClass tmpObj = new DeriveClass();tmpObj.F();tmpObj.Add(1, 2);tmpObj.Add(1.1, 2.2);Console.ReadLine();复制代码结果: BaseClass.F DeriveClass.F Add for Int:
24、3 Add for int: 3.3 8.什么是索引指示器? 答: 实现索引指示器(indexer)的类可以象数组那样使用其实例后的对象,但与数组不同的是索引指示器的参数类型不仅限于 int 简单来说,其本质就是一个含参数属性 示例:using System;using System.Collections.Generic;using System.Text;namespace Example08public class Pointprivate double x, y;public Point(double X, double Y)x = X;y = Y;/重写 ToString 方法方便输
25、出public override string ToString()return String.Format(quot;X: 0 , Y: 1quot;, x, y);public class PointsPoint points;public Points(Point Points)points = Points;public int PointNumberget return points.Length; /实现索引访问器public Point thisint Indexgetreturn pointsIndex;/感谢 watson hua(http:/ intclass Weathe
26、rOfWeekpublic string thisint Indexget/注意 case 段使用 return 直接返回所以不需要 breakswitch (Index)case 0:return quot;Today is cloudy!quot;case 5:return quot;Today is thundershower!quot;default:return quot;Today is fine!quot;public string thisstring Daygetstring TodayWeather = null;/switch 的标准写法switch (Day)case quot;Sundayquot;:TodayWeather = quot;Today is cloudy!quot;break;case quot;Fridayquot;:TodayWeather = quot;Today is thundershower!quot;break;default:TodayWeather = quot;Today is fine!quot;break;
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。