C#初学者必知:关键概念解析

需积分: 9 0 下载量 171 浏览量 更新于2024-09-29 收藏 158KB DOC 举报
cStr); //非静态变量需要通过对象访问,不同对象的同一非静态变量可能有不同的值 Class1obj1=new Class1(); Class1obj2=new Class1(); obj1.notstaticStr+="1"; obj2.notstaticStr+="2"; Console.WriteLine("obj1's notstaticStr: {0}", obj1.notstaticStr); Console.WriteLine("obj2's notstaticStr: {0}", obj2.notstaticStr); } } } } 2.const和static readonly区别?答:const:const修饰的变量在编译时就确定其值,不能在运行时改变。const是常量,一旦赋值就不能修改。const是编译时常量,不占用内存空间。 static readonly:static readonly修饰的变量在运行时初始化,只能在声明或构造函数中赋值,且一旦赋值后不能更改。static readonly是运行时常量,占用内存空间。 示例: using System; namespace Example02 { class Program { public const int ConstValue = 10; public static readonly int ReadonlyValue = 20; static void Main(string[] args) { //尝试在构造函数之外修改const值,会引发编译错误 //ConstValue = 30; ReadonlyValue = 40; //运行时修改ReadonlyValue值,但编译器不允许 Console.WriteLine("ConstValue: {0}", ConstValue); Console.WriteLine("ReadonlyValue: {0}", ReadonlyValue); } } } 3.extern是什么意思?答:extern用于引用C/C++编译的外部函数,它告诉C#编译器函数的实现是在其他地方,通常在DLL中。 extern关键字用于声明一个方法,但不提供方法体。 示例: using System; using System.Runtime.InteropServices; namespace Example03 { class Program { [DllImport("kernel32.dll")] extern static bool Beep(uint freq, uint duration); static void Main(string[] args) { Beep(500, 1000); } } } 4.abstract是什么意思?答:abstract在C#中表示抽象,可以修饰类、方法和属性等。抽象类不能被实例化,只能作为其他类的基类。抽象方法没有实现,必须在派生类中重写。 5.internal修饰符起什么作用?答:internal是C#中的访问修饰符,表示仅限于当前程序集内访问。它限制了类或成员的可见性,使得它们对其他程序集不可见。 6.sealed修饰符是干什么的?答:sealed修饰符用于密封类,阻止其他类继承这个类。密封类不能成为抽象类的子类,并且其抽象方法必须提供实现。 7.override和overload的区别?答:override重写父类的虚方法,实现方法签名必须与被重写的方法完全相同。overload是方法多态,通过不同的参数列表来创建多个同名方法。 8.什么是索引指示器?答:索引指示器(Indexers)允许类像数组一样通过索引来访问数据,提供自定义的访问方式。例如,List<T>类中的this[int index]就是索引指示器。 9.new修饰符是起什么作用?答:new修饰符用于隐藏基类的成员,或者在派生类中重新声明和初始化实例构造函数。 10.this关键字的含义?答:this关键字在C#中代表当前对象的引用,主要用于区分实例方法中的局部变量和成员变量,也可以在构造函数中调用其他构造函数。 11.可以使用抽象函数重写基类中的虚函数吗?答:不可以,抽象函数在基类中已经声明但没有实现,因此派生类必须重写抽象函数,而不能重写虚函数。 12.密封类可以有虚函数吗?答:不能,密封类不能再被继承,所以它的成员不能是虚的,因为虚成员是为了支持多态性,而密封类已经禁止了这种特性。 13.如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后可以有几个属性访问器?如果基类中有get和set两个呢?答:如果基类中的虚属性只有一个访问器,如只有get,那么继承类重写该属性时也必须只有一个get访问器。如果基类有get和set两个访问器,继承类可以有0个、1个或2个访问器,但必须至少重写其中一个。 14.abstract可以和virtual一起使用吗?可以和override一起使用吗?答:abstract不能与virtual一起使用,因为抽象方法不需要实现。但abstract方法可以被override,以提供具体实现。 15.接口可以包含哪些成员?答:接口可以包含方法、属性、事件和索引器,但不能包含字段、构造函数、析构函数和静态成员。 16.类和结构的区别?答:类是引用类型,分配在堆上,支持继承和装箱拆箱操作;结构是值类型,分配在栈上或作为结构体数组的一部分,不支持继承,但可以实现接口。 17.接口的多继承会带来哪些问题?答:接口多继承可能导致命名冲突,需要通过接口别名解决。另外,多继承可能导致复杂的设计和实现,增加代码维护难度。 18.抽象类和接口的区别?答:抽象类可以有成员实现,可以有构造函数,可以有非抽象成员,可被单继承;接口不包含实现,只能有公有的、静态的、不可变的成员,可以被多重继承。 19.别名指示符是什么?答:别名指示符(using alias directive)允许为命名空间或类型创建别名,以简化代码并提高可读性。 20.如何释放非托管资源?答:使用using语句块或实现IDisposable接口来管理非托管资源的生命周期,确保在不再使用时正确释放。 21.P/Invoke是什么?答:P/Invoke(Platform Invoke)是.NET Framework提供的机制,用于调用非托管(通常是C/C++)代码,如Windows API函数。 22.StringBuilder和String的区别?答:String是不可变类型,每次修改都会创建新对象,效率较低;StringBuilder是可变类型,适用于大量字符串拼接操作,性能更优。 23.explicit和implicit的含义?答:explicit和implicit是类型转换运算符的修饰符,explicit表示显式转换,需要程序员手动调用;implicit表示隐式转换,编译器自动完成。 24.params有什么用?答:params关键字用于定义方法参数,允许传递可变数量的参数,这些参数会被当作数组处理。 25.什么是反射?答:反射是.NET框架的一个功能,允许程序在运行时检查自身信息(如类型、成员、属性等),并能动态创建对象和调用方法。这对于插件架构、序列化、动态编程等场景非常有用。
2012-04-11 上传