目录
11.重写和重载的区别?
重写方法:关键字用override修饰,派生类重写基类的方法,方法命名、返回类型,参数必须相同
class BaseClass
{
public virtual void Method()
{
Console.WriteLine("BaseClass.Method()");
}
}
class DerivedClass : BaseClass
{
public override void Method()
{
Console.WriteLine("DerivedClass.Method()");
}
}
BaseClass obj = new DerivedClass();
obj.Method(); // 输出 "DerivedClass.Method()"
重载方法:方法名必须相同,参数列表必须不相同,返回类型可以不相同。
12.C#中有没有静态构造函数,如果有是做什么用的?
特点: 静态构造函数既没有访问修饰符,也没有参数。
在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
无法直接调用静态构造函数。
在程序中,用户无法控制何时执行静态构造函数。
用途 : 当类使用日志文件时,将使用这种构造函数向日志文件中写入项。
13.怎样理解静态变量?静态成员和非静态成员的区别?
- 生命周期:静态成员的生命周期和类相同,随着类的加载而创建,随着类的卸载而销毁;非静态成员的生命周期和实例相同,随着实例的创建而创建,随着实例的销毁而销毁。
- 创建方式:静态成员可以直接被类访问,而不需要创建类的实例;非静态成员必须创建类的实例后才能
14.属性能在接口中声明吗?
可以,不能有访问修饰符,不能初始化赋值。
interface IMyInterface
{
int Property { get; set; }
}
在接口中声明的属性只包含访问器,而不包含属性值。因此,在接口中声明的属性是抽象的,必须在实现接口的类中进行具体实现。
class MyClass : IMyInterface
{
private int _property;
public int Property
{
get { return _property; }
set { _property = value; }
}
}
在 C# 中,接口中的属性被称为索引器。我们可以使用下面的语法访问索引器:
IMyInterface obj = new MyClass();
int value = obj.Property;
obj.Property = 42;
15.在项目中为什么使用接口?接口的好处是什么?什么是面向接口开发?
接口是一种约束,描述类的公共方法/公共属性,不能有任何的实现
好处是:结构清晰,类之间通信简单易懂,扩展性好,提高复用性。
面向interface编程,原意是指面向抽象协议编程,实现者在实现时要严格按协议来办。
16.什么时候用重载?什么时候用重写?
当一个类需要用不同的实现来做同一件事情,此时应该用重写,
而重载是用不同的输入做同一件事情
17.静态方法可以访问非静态变量吗?如果不可以为什么?
静态方法和非静态变量不是同一生命周期,静态方法属于类,
非静态变量属于具体的对象,静态方法和具体的对象没有任何关联
18.在.Net中所有可序列化的类都被标记为_?
[serializable]
19.C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里?
一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加性质
20.特性( attribute)
它们是可以在程序集、类型、成员或参数上应用的声明性标签,用于提供元数据。这些元数据可以在编译时或运行时使用,并可能会影响编译器或其他工具的行为。
下面是一些 C# 中常见的特性:
使用 [Obsolete]
特性标记过时的类型或成员,然后使用工具来查找和删除这些成员,以便在新的代码中使用更新的版本。
使用 [Conditional]
特性来为某个方法指定条件编译,然后根据编译器的命令行选项或预定义的符号来决定是否编译该方法。
使用 [AttributeUsage]
特性来限制特性的使用范围。例如,您可以使用 [AttributeUsage(AttributeTargets.Class)]
来限制特性只能用于类型。
使用 [Serializable]
和 [NonSerialized]
特性来指定类型或字段是否可序列化,以便在运行时将对象的状态保存到文件中或从文件中恢复。
使用 [DllImport]
特性来标记方法为从本机 DLL 导入的,以便在托管代码中调用本机函数。
21.当使用new B()创建B的实例时,产生什么输出?
using System;
class A
{
public A()
{
PrintFields();
}
public virtual void PrintFields(){}
}
class B:A
{
int x=1;
int y;
public B()
{
y=-1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}",x,y);
}
}
1.B字段的初始化
2.初始化A的字段
3.A的构造函数
4.B的构造函数
答案:x=1,y=0
22.能用foreach遍历访问的对象需要实现 接口或声明方法的类型
答:IEnumerable 、 GetEnumerator。