C#相关试题参考模板_第1页
C#相关试题参考模板_第2页
C#相关试题参考模板_第3页
C#相关试题参考模板_第4页
C#相关试题参考模板_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 / 701. 传入某个属性的set方法的隐含参数的名称是什么?value,它的类型和属性所声名的类型相同。 2. 如何在C#中实现继承?在类名后加上一个冒号,再加上基类的名称。 3. C#支持多重继承么?不支持。可以用接口来实现。 4. 被protected修饰的属性/方法在何处可以访问?在继承或间接继承与这个类的子类中可以访问。 5. 私有成员会被继承么?会,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了。 6. 请描述一下修饰符protected internal。 被protected interna

2、l修饰的属性/方法只能在它的在同一个程序集(Assembly)中的子类被访问。 7. C#提供一个默认的无参数构造函数,当我实现了另外一个有一个参数的构造函数时候,还想保留这个无参数的构造函数。这样我应该写几个构造函数?两个,一旦你实现了一个构造函数,C#就不会再提供默认的构造函数了,所以需要手动实现那个无参数构造函数。 8. C#中所有对象共同的基类是什么?System.Object. 9. 重载和覆写有什么区别?重载提供了对一个方法签名的不同参数调用的实现。覆写提供了子类中改变父类方法行为的实现。 10. 在方法定义中,virtual有什么含意? 被

3、virtual修饰的方法可以被子类覆写。 11. 能够将非静态的方法覆写成静态方法么?不能,覆写方法的签名必须与被覆写方法的签名保持一致,除了将virtual改为override。 12. 可以覆写私有的虚方法么?不可以,甚至子类中无法访问父类中的私有方法。 13. 能够阻止某一个类被其他类继承么? 可以,使用关键字sealed。 14. 能够实现允许某个类被继承,但不允许其中的某个方法被覆写么? 可以,标记这个类为public,并标记这个方法为sealed。 15. 什么是抽象类(abstract class)?一种不可以被实例化的类。抽象类

4、中一般含有抽象方法,当然也可有具体实现。继承类只有实现过所有抽象类的抽象方法后才能被实例化。 16. 何时必须声明一个类为抽象类? 当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。 17. 接口(interface)是什么?只含有共有抽象方法(public abstract method)的类。这些方法必须在子类中被实现。 18. 为什么不能指定接口中方法的修饰符? 接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。他们默认为公有方法。 19. 可以继承多个接口么? 当然。 20. 那么如果这些接口

5、中有重复的方法名称呢? 这种情况中你可以决定如何实现。当然需要特别得小心。但是在编译环节是没有问题的。 21. 接口和抽象类的区别是什么? 接口中所有方法必须是抽象的,并且不能指定方法的访问修饰符。抽象类中可以有方法的实现,也可以指定方法的访问修饰符。 22. 如何区别重载方法? 不同的参数类型,不同的参数个数,不同的参数顺序。 23. const和readonly有什么区别?const关键字用来声明编译时常量,readonly用来声明运行时常量。 24. System.String 和System.StringBuilder有什么区别?System.S

6、tring是不可变的字符串。System.StringBuilder存放了一个可变的字符串,并提供一些对这个字符串修改的方法。 1.静态成员和非静态成员的区别?2.const 和 static readonly 区别?3.extern 是什么意思?4.abstract 是什么意思?5.internal 修饰符起什么作用?6.sealed 修饰符是干什么的?7.override 和 overload 的区别?8.什么是索引指示器?9.new 修饰符是起什么作用?10.this 关键字的含义?11.可以使用抽象函数重写基类中的虚函数吗?12.密封类可以有虚函数吗?13.什么是属性访问器?14.ab

7、stract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?15.接口可以包含哪些成员?16.类和结构的区别?17.接口的多继承会带来哪些问题?18.抽象类和接口的区别?19.别名指示符是什么?20.如何手工释放资源?21.P/Invoke是什么?22.StringBuilder 和 String 的区别?23.explicit 和 implicit 的含义?24.params 有什么用?25.什么是反射? 以下是我做的一份参考答案(C# 语言范畴之内),如果有不准确、不全面的,欢迎各位朋友指正! 1.静态成员和非静态成员的区别?答:静态变量使用 stat

8、ic 修饰符进行声明,在类被实例化时创建,通过类进行访问不带有 static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象进行访问一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等示例:using System;using System.Collections.Generic;using System.Text; namespace Example01    class Program     

9、       class Class1                    public static String staticStr = "Class"            public String notstaticS

10、tr = "Obj"                static void Main(string args)                    /静态变量通过类进行访问,该类所有实例的同一静态变量都是同一个值    

11、;        Console.WriteLine("Class1's staticStr: 0", Class1.staticStr);             Class1 tmpObj1 = new Class1();            tmpObj1.not

12、staticStr = "tmpObj1"            Class1 tmpObj2 = new Class1();            tmpObj2.notstaticStr = "tmpObj2"          

13、60;  /非静态变量通过对象进行访问,不同对象的同一非静态变量可以有不同的值            Console.WriteLine("tmpObj1's notstaticStr: 0", tmpObj1.notstaticStr);            Console.WriteLine("tmpObj2's n

14、otstaticStr: 0", tmpObj2.notstaticStr);             Console.ReadLine();            结果:Class1's staticStr: ClasstmpObj1's notstaticStr: tmpObj1tmpObj2's notstaticStr: tmpObj2

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

16、lass Class1            public const String strConst = "Const"        public static readonly String strStaticReadonly = "StaticReadonly"        /public const Str

17、ing strConst = "Const Changed"        /public static readonly String strStaticReadonly = "StaticReadonly Changed"     客户端代码:using System;using System.Collections.Generic;using System.Text;using Example02Lib; namespace Ex

18、ample02    class Program            static void Main(string args)                    /修改Example02中Class1的strConst初始值后,只编译Example02Lib项目 

19、0;          /然后到资源管理器里把新编译的Example02Lib.dll拷贝Example02.exe所在的目录,执行Example02.exe            /切不可在IDE里直接调试运行因为这会重新编译整个解决方案!             /可以看到s

20、trConst的输出没有改变,而strStaticReadonly的输出已经改变            /表明Const变量是在编译期初始化并嵌入到客户端程序,而StaticReadonly是在运行时初始化的            Console.WriteLine("strConst : 0", Class1.strConst);  &

21、#160;         Console.WriteLine("strStaticReadonly : 0", Class1.strStaticReadonly);             Console.ReadLine();            结果:strConst :

22、 ConststrStaticReadonly : StaticReadonly 修改后的示例:测试类:using System;using System.Collections.Generic;using System.Text; namespace Example02Lib    public class Class1            /public const String strConst = "Const" &

23、#160;      /public static readonly String strStaticReadonly = "StaticReadonly"        public const String strConst = "Const Changed"        public static readonly String strStaticReadon

24、ly = "StaticReadonly Changed"    结果strConst : ConststrStaticReadonly : StaticReadonly Changed3.extern 是什么意思?答:extern 修饰符用于声明由程序集外部实现的成员函数经常用于系统API函数的调用(通过 DllImport )。注意,和DllImport一起使用时要加上 static 修饰符也可以用于对于同一程序集不同版本组件的调用(用 extern 声明别名)不能与 abstract 修饰符同时使用示例:using System;usin

25、g System.Collections.Generic;using System.Text;using System.Runtime.InteropServices; namespace Example03    class Program            /注意DllImport是一个Attribute Property,在System.Runtime.InteropServices命名空间中定义    &

26、#160;   /extern与DllImport一起使用时必须再加上一个static修饰符        DllImport("User32.dll")        public static extern int MessageBox(int Handle, string Message, string Caption, int Type);      

27、;   static int Main()                    string myString;            Console.Write("Enter your message: ");    

28、0;       myString = Console.ReadLine();            return MessageBox(0, myString, "My Message Box", 0);            结果: 4.abstract 是什么意思?答:abstract 修饰符

29、可以用于类、方法、属性、事件和索引指示器(indexer),表示其为抽象成员abstract 不可以和 static 、virtual 一起使用声明为 abstract 成员可以不包括实现代码,但只要类中还有未实现的抽象成员(即抽象类),那么它的对象就不能被实例化,通常用于强制继承类必须实现某一成员示例:using System;using System.Collections.Generic;using System.Text; namespace Example04    #region 基类,抽象类    public

30、 abstract class BaseClass            /抽象属性,同时具有get和set访问器表示继承类必须将该属性实现为可读写        public abstract String Attribute                 

31、0;  get;            set;                 /抽象方法,传入一个字符串参数无返回值        public abstract void Function(String value);   

32、      /抽象事件,类型为系统预定义的代理(delegate):EventHandler        public abstract event EventHandler Event;         /抽象索引指示器,只具有get访问器表示继承类必须将该索引指示器实现为只读        public abstract

33、Char thisint Index                    get;                #endregion     #region 继承类    public class DeriveCla

34、ss : BaseClass            private String attribute;         public override String Attribute                    get 

35、;                           return attribute;                      

36、60; set                            attribute = value;                     &

37、#160;      public override void Function(String value)                    attribute = value;            if (Event != null) &#

38、160;                          Event(this, new EventArgs();                      

39、      public override event EventHandler Event;        public override Char thisint Index                    get      &#

40、160;                     return attributeIndex;                            #endregion

41、     class Program            static void OnFunction(object sender, EventArgs e)                    for (int i = 0; i < (DeriveClass)send

42、er).Attribute.Length; i+)                            Console.WriteLine(DeriveClass)sender)i);             

43、0;              static void Main(string args)                    DeriveClass tmpObj = new DeriveClass();       

44、0;     tmpObj.Attribute = "1234567"            Console.WriteLine(tmpObj.Attribute);             /将静态函数OnFunction与tmpObj对象的Event事件进行关联   

45、0;        tmpObj.Event += new EventHandler(OnFunction);             tmpObj.Function("7654321");             Console.ReadLine(); &#

46、160;          结果:12345677654321 5.internal 修饰符起什么作用?答:internal 修饰符可以用于类型或成员,使用该修饰符声明的类型或成员只能在同一程集内访问接口的成员不能使用 internal 修饰符值得注意的是,如果为 internal 成员加上了 protected 修饰符,这时的访问级别为 internal 或 protected。只是看字面意思容易弄错,许多人认为 internal protected 应该是“只有同一个程序集中的子类可以访问”,但其实它表示“同一

47、个程序集中的所有类,以及所有程序集中的子类都可以访问”示例Example05Lib 项目的 Class1 using System;using System.Collections.Generic;using System.Text; namespace Example05Lib    public class Class1            internal String strInternal = null;   &#

48、160;    public String strPublic;        internal protected String strInternalProtected = null;    结果Example05Lib 项目的 Class2 类可以访问到 Class1 的 strInternal 成员,当然也可以访问到 strInternalProtected 成员,因为他们在同一个程序集里 Example05 项目里的 Class3 类无法访问到

49、Class1 的 strInternal 成员,因为它们不在同一个程序集里。但却可以访问到 strInternalProtected 成员,因为 Class3 是 Class1 的继承类 Example05 项目的 Program 类既无法访问到 Class1 的 strInternal 成员,也无法访问到 strInternalProtected 成员,因为它们既不在同一个程序集里也不存在继承关系 6.sealed 修饰符是干什么的?答:sealed 修饰符表示密封用于类时,表示该类不能再被继承,不能和 abstract 同时使用,因为这两个修饰符在含义上互相排斥用于方法

50、和属性时,表示该方法或属性不能再被重写,必须和 override 关键字一起使用,因为使用 sealed 修饰符的方法或属性肯定是基类中相应的虚成员通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成层次结构体系混乱恰当的利用 sealed 修饰符也可以提高一定的运行效率,因为不用考虑继承类会重写该成员示例:using System;using System.Collections.Generic;using System.Text; namespace Example06    class Program &#

51、160;          class A                    public virtual void F()                  

52、60;         Console.WriteLine("A.F");                        public virtual void G()         &#

53、160;                  Console.WriteLine("A.G");                            class B :

54、A                    public sealed override void F()                           

55、Console.WriteLine("B.F");                        public override void G()                  

56、0;         Console.WriteLine("B.G");                            class C : B         &

57、#160;          public override void G()                            Console.WriteLine("C.G");    

58、;                        static void Main(string args)                    new A().F();   &

59、#160;        new A().G();            new B().F();            new B().G();            new C().F();

60、60;           new C().G();             Console.ReadLine();            结果:类 B 在继承类 A 时可以重写两个虚函数,如图所示: 由于类 B 中对 F 方法进行了密封, 类 C 在继承类 B 时只能

61、重写一个函数,如图所示: 控制台输出结果,类 C 的方法 F 只能是输出 类B 中对该方法的实现:A.FA.GB.FB.GB.FC.G 7.override 和 overload 的区别?答:override 表示重写,用于继承类对基类中虚成员的实现overload 表示重载,用于同一个类中同名方法不同参数(包括类型不同或个数不同)的实现示例:using System;using System.Collections.Generic;using System.Text; namespace Example07    class Program&

62、#160;           class BaseClass                    public virtual void F()                

63、            Console.WriteLine("BaseClass.F");                            class DeriveClass : BaseClass &#

64、160;                  public override void F()                            base.F(); &

65、#160;              Console.WriteLine("DeriveClass.F");                        public void Add(int Left, int Right)&

66、#160;                           Console.WriteLine("Add for Int: 0", Left + Right);              

67、0;         public void Add(double Left, double Right)                            Console.WriteLine("Add for int: 0", Lef

68、t + Right);                            static void Main(string args)                  

69、0; DeriveClass tmpObj = new DeriveClass();            tmpObj.F();            tmpObj.Add(1, 2);            tmpObj.Add(1.1, 2.2); &#

70、160;           Console.ReadLine();            结果:BaseClass.FDeriveClass.FAdd for Int: 3Add for int: 3.3 8.什么是索引指示器?答:实现索引指示器(indexer)的类可以象数组那样使用其实例后的对象,但与数组不同的是索引指示器的参数类型不仅限于int简单来说,其本质就是一个含参数属性示例: us

71、ing System;using System.Collections.Generic;using System.Text; namespace Example08    public class Point            private double x, y;        public Point(double X, double Y)   &

72、#160;                x = X;            y = Y;                /重写ToString方法方便输出    

73、60;   public override string ToString()                    return String.Format("X: 0 , Y: 1", x, y);                public c

74、lass Points            Point points;        public Points(Point Points)                    points = Points;   

75、             public int PointNumber                    get                  

76、;           return points.Length;                                 /实现索引访问器      

77、  public Point thisint Index                    get                          

78、60; return pointsIndex;                             /感谢watson hua(    /索引指示器的实质是含参属性,参数并不只限于int    class WeatherOfWeek     &#

79、160;      public string thisint Index                    get                     

80、0;      /注意case段使用return直接返回所以不需要break                switch (Index)                       

81、;             case 0:                                     &#

82、160;              return "Today is cloudy!"                               &

83、#160;            case 5:                                     

84、0;              return "Today is thundershower!"                              &#

85、160;             default:                                    

86、0;               return "Today is fine!"                               

87、;                                     public string thisstring Day            &#

88、160;       get                            string TodayWeather = null;            

89、;    /switch的标准写法                switch (Day)                            &#

90、160;       case "Sunday":                                        

91、            TodayWeather = "Today is cloudy!"                            break;   

92、60;                                        case "Friday":       &

93、#160;                                            TodayWeather = "Today is thundershow

94、er!"                            break;                    &#

95、160;                       default:                           

96、60;                        TodayWeather = "Today is fine!"                   

97、60;        break;                                           

98、             return TodayWeather;                            class Program        

99、60;   static void Main(string args)                    Point tmpPoints = new Point10;            for (int i = 0; i < tmpPoints.Length; i+)

100、0;                           tmpPointsi = new Point(i, Math.Sin(i);                   

101、;      Points tmpObj = new Points(tmpPoints);            for (int i = 0; i < tmpObj.PointNumber; i+)                    &#

102、160;       Console.WriteLine(tmpObji);                          string Week = new string "Sunday", "Monday", "Tuesday",

103、"Wednesday", "Thursday", "Friday", "Staurday"            WeatherOfWeek tmpWeatherOfWeek = new WeatherOfWeek();            for (int i = 0; i < 6; i+

104、)                            Console.WriteLine(tmpWeatherOfWeeki);                  &

105、#160;     foreach (string tmpDay in Week)                            Console.WriteLine(tmpWeatherOfWeektmpDay);      

106、60;                  Console.ReadLine();            结果:X: 0 , Y: 0X: 1 , Y: 0.841470984807897X: 2 , Y: 0.909297426825682X: 3 , Y: 0.141120008059867X: 4 , Y: -0.7568024953

107、07928X: 5 , Y: -0.958924274663138X: 6 , Y: -0.279415498198926X: 7 , Y: 0.656986598718789X: 8 , Y: 0.989358246623382X: 9 , Y: 0.412118485241757Today is cloudy!Today is fine!Today is fine!Today is fine!Today is fine!Today is thundershower!Today is cloudy!Today is fine!Today is fine!Today is fine!Today

108、 is fine!Today is thundershower!Today is fine! 9.new 修饰符是起什么作用?答:new 修饰符与 new 操作符是两个概念new 修饰符用于声明类或类的成员,表示隐藏了基类中同名的成员。而new 操作符用于实例化一个类型new 修饰符只能用于继承类,一般用于弥补基类设计的不足new 修饰符和 override 修饰符不可同时用在一个成员上,因为这两个修饰符在含义上互相排斥示例:using System;using System.Collections.Generic;using System.Text; namespace

109、Example09    class BaseClass            /基类设计者声明了一个PI的公共变量,方便进行运算        public static double PI = 3.1415;        class DervieClass : BaseClass     &#

110、160;      /继承类发现该变量的值不能满足运算精度,于是可以通过new修饰符显式隐藏基类中的声明        public new static double PI = 3.1415926;        class Program            static void Main(string arg

111、s)                    Console.WriteLine(BaseClass.PI);            Console.WriteLine(DervieClass.PI);         &

112、#160;   Console.ReadLine();            结果:3.14153.1415926 10.this 关键字的含义?答:this 是一个保留字,仅限于构造函数和方法成员中使用在类的构造函数中出现表示对正在构造的对象本身的引用,在类的方法中出现表示对调用该方法的对象的引用,在结构的构造上函数中出现表示对正在构造的结构的引用,在结构的方法中出现表示对调用该方法的结果的引用this 保留字不能用于静态成员的实现里,因为这时对象或结构并未实例化在 C#

113、系统中,this 实际上是一个常量,所以不能使用 this+ 这样的运算this 保留字一般用于限定同名的隐藏成员、将对象本身做为参数、声明索引访问器、判断传入参数的对象是否为本身示例:using System;using System.Collections.Generic;using System.Text; namespace Example10    class Class1            private double c; &#

114、160;      private string value;         public double C                    get           

115、                return c;                            public Class1(double c)    

116、                /限定同名的隐藏成员            this.c = c;                public Class1(Class1 value)  &

117、#160;                 /用对象本身实例化自己没有意义            if (this != value)                            c = value.C;         

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论