`
sailorlee
  • 浏览: 42751 次
  • 性别: Icon_minigender_1
  • 来自: 河北唐山
最近访客 更多访客>>
社区版块
存档分类
最新评论

你必须知道的C#的25个基础概念

阅读更多

1.静态变量和非静态变量的区别?
静态变量:静态变量使用 static 修饰符进行声明 ,在所属类被装载时创建,通过类进行访问,所属类的
所有实例的同一静态变量都是同一个值。
非静态变量:不带有static 修饰符声明的变量称做非静态变量,在类被实例化时创建,通过对象进行访
问,同一个类的不同实例的同一非静态变量可以是不同的值。

2.const 和 static readonly 区别?

const:用const 修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序。
static readonly:用static readonly 修饰符声明的成员依然是变量,只不过具有和常量类似的
使用方法:通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行期初始化。

3.extern 是什么意思?
extern:修饰符用于声明由程序集外部实现的成员函数,经常用于系统API函数的调用。
注意:和DllImport一起使用时要加上static修饰符,也可以用于对于同一程序集不同版本组件的
调用(用extern声明别名),不能与abstract修饰符同时使用。

4.abstract 是什么意思?

abstract修饰符可以用于类、方法、属性、事件和索引指示器(indexer),表示其为抽象成员。
abstract不可以和 static 、virtual 、override 一起使用。
声明为abstract成员可以不包括实现代码,但只有类中还有未实现的抽象成员,该类就不可以被实例化,
通常用于强制继承类必须实现某一成员。

5.internal 修饰符起什么作用?

internal 修饰符可以用于类型或成员,使用该修饰符声明的类型或成员只能在同一程集内访问,
接口的成员不能使用 internal 修饰符

6.sealed 修饰符是干什么的?

sealed修饰符表示密封,用于类时,表示该类不能再被继承,不能和abstract同时使用,
因为这两个修饰符在含义上互相排斥,用于方法和属性时,表示该方法或属性不能再被继承,
必须和override关键字一起使用,因为使用sealed修饰符的方法或属性肯定是基类中相应的虚成员,
通常用于实现第三方类库时不想被客户端继承,或用于没有必要再继承的类以防止滥用继承造成
层次结构体系混乱。恰当的利用sealed修饰符也可以提高一定的运行效率。

7.override 和 overload 的区别?

override 表示重写,用于继承类对基类中虚成员的实现。
overload 表示重载,用于同一个类中同名方法不同参数(包括类型不同或个数不同)的实现。

8.什么是索引指示器?

实现索引指示器(indexer)的类可以象数组那样使用其实例后的对象,但与数组不同的是索引指示器的
参数类型不仅限于int,简单来说,其本质就是一个含参数属性。

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

10.this 关键字的含义?

this是一个保留字,仅限于构造函数和方法成员中使用。
在类的构造函数中出现表示对正在构造的对象本身的引用,
在类的方法中出现表示对调用该方法的对象的引用。
在结构的构造上函数中出现表示对正在构造的结构的引用,
在结构的方法中出现表示对调用该方法的结果的引用。
this保留字不能用于静态成员的实现里,因为这时对象或结构并未实例化。
在C#系统中,this 实际上是一个常量,所以不能使用this++这样的运算。
this保留字一般用于限定同名的隐藏成员、将对象本身做为参数、声明索引访问器、判断传入参数的对象是否为本身。

11.可以使用抽象函数重写基类中的虚函数吗?
可以,但需使用new修饰符显式声明,表示隐藏了基类中该函数的实现。

12.密封类可以有虚函数吗?

可以,基类中的虚函数将隐式的转化为非虚函数,但密封类本身不能再增加新的虚函数。

13.如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后可以有几个属性访问器?如果基类中有get和set两个呢?

如果基类中的虚属性只有一个属性访问器,那么继承类重写该属性后也应只有一个。
如果基类中有get和set两个属性访问器,那么继承类中可以只有一个也可以同时有两个属性访问器。

14.abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
abstract 修饰符不可以和 static、virtual 和 override 修饰符一起使用。

15.接口可以包含哪些成员?
接口可以包含属性、方法、索引指示器和事件,但不能包含常量、域、操作符、构造函数和析构函数,而且也不能包含任何静态成员。

16.类和结构的区别?
类:类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存,
类有构造和析构函数,类可以继承和被继承。
结构:结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),
结构的赋值将分配产生一个新的对象。结构没有构造函数,但可以添加。结构没有析构函数,
结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口。

17.接口的多继承会带来哪些问题?
C# 中的接口与类不同,可以使用多继承,即一个子接口可以有多个父接口。
但如果两个父成员具有同名的成员,就产生了二义性(这也正是C#中类取消了多继承的原因之一),这时在实现时最好使用显式的声明。

18.抽象类和接口的区别?
抽象类(abstract class)可以包含功能定义和实现,
接口(interface)只能包含功能定义,抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的
内部共性,接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性,分析对象,
提炼内部共性形成抽象类,用以表示对象本质,即“是什么”,为外部提供调用或功能需要扩充时优先使用接口。

19.别名指示符是什么?
通过别名指示符我们可以为某个类型起一个别名,主要用于解决两个命名空间内有同名类型的冲突或
避免使用冗余的命名空间,别名指示符只在一个单元文件内起作用。

20.如何释放非托管资源?

.NET平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的
工作,但它无法对非托管资源进行释放,这时我们必须自己提供方法来释放对象内分配的非托管资源,
比如你在对象的实现代码中使用了一个COM对象,最简单的办法,可以通过实现
protected void Finalize()(析构函数会在编译时变成这个东东)来释放非托管资源,
因为GC在释放对象时会检查该对象是否实现了 Finalize() 方法,如果是则调用它。
有一种更好的,那就是通过实现一个接口显式的提供给客户调用端手工释放对象的方法,
而不是傻傻的等着GC来释放我们的对象(何况效率又那么低),
System命名空间内有一个IDisposable接口,拿来做这事非常合适,就省得我们自己再声明一个接口了。
另外补充一句,这种实现并不一定要使用了非托管资源后才用,如果你设计的类会在运行时有大些的
实例(象GIS中的Geometry),为了优化程序性能,你也可以通过实现该接口让客户调用端在确认
不需要这些对象时手工释放它们。

21.P/Invoke是什么?
在受控代码与非受控代码进行交互时会产生一个事务(transition),
这通常发生在使用平台调用服务(Platform Invocation Services),即P/Invoke,
如调用系统的API或与COM对象打交道,通过System.Runtime.InteropServices命名空间,
虽然使用Interop非常方便,但据估计每次调用事务都要执行10到40条指令,算起来开销也不少,
所以我们要尽量少调用事务,如果非用不可,建议本着一次调用执行多个动作,
而不是多次调用每次只执行少量动作的原则。

22.StringBuilder 和 String 的区别?
String虽然是一个引用类型,但在赋值操作时会产生一个新的对象,而StringBuilder则不会,
所以在大量字符串拼接或频繁对某一字符串进行操作时最好使用StringBuilder,不要使用String。

23.explicit 和 implicit 的含义?
explicit和implicit属于转换运算符,如用这两者可以让我们自定义的类型支持相互交换,
explicti表示显式转换,如从A->B必须进行强制类型转换(B=(B)A),
implicit表示隐式转换,如从B->A只需直接赋值(A=B),
隐式转换可以让我们的代码看上去更漂亮、更简洁易懂,所以最好多使用 implicit 运算符。
不过!如果对象本身在转换时会损失一些信息(如精度),那么我们只能使用 explicit 运算符,以便在编译期就能警告客户调用端。

24.params 有什么用?

params关键字在方法成员的参数列表中使用,为该方法提供了参数个数可变的能力,
它在只能出现一次并且不能在其后再有参数定义,之前可以。

25.什么是反射

反射,Reflection,通过它我们可以在运行时获得各种信息,
如程序集、模块、类型、字段、属性、方法和事件,
通过对类型动态实例化后,还可以对其执行操作,一般用于插件式框架程序和设计模式的实现,
当然反射是一种手段可以充分发挥其能量来完成你想做的任何事情。

分享到:
评论

相关推荐

    C#25个基础概念,你必须知道的(附演示)

    学习C#必知的C#25个基础概念,你必须知道的(附演示)

    你必须知道的C#的25个基础概念(附源码)

    先自己复习一下,看看下面的C#问题都能回答上来么? 1.静态变量和非静态变量的区别? 2.const 和 static readonly 区别? 3.extern 是什么意思? 4.abstract 是什么意思? 5.internal 修饰符起什么作用? 6.sealed ...

    c#中你必须要知道的25个概念

    以下是你必须了解的25个重要概念,这些概念不仅对于日常开发至关重要,也是面试时经常被问及的题目。 1. **变量(Variables)**:存储数据的容器,有特定的数据类型,如int、string、bool等。 2. **数据类型(Data...

    C#面向对象 基础概念25个.pdf

    C#面向对象 基础概念25个.pdf

    C#24个基础概念系列专题

    "C#24个基础概念系列专题"旨在深入解析C#中的关键知识点,确保开发者能够扎实地理解和运用这些概念。以下将详细介绍这24个基础概念,每个概念都将展开讨论,以确保读者能够全面理解并能在实际开发中灵活应用。 1. ...

    25个C#概念基础 源码 注释 终身受用

    这个名为“25个C#概念基础 源码 注释 终身受用”的资源包显然旨在为初学者提供一个全面的起点,深入理解C#语言的关键概念。下面,我们将详细探讨这25个核心概念,以及源码和注释的重要性。 1. 变量:C#中的变量是...

    C#基础概念二十五问

    在C#编程语言的学习过程中,...以上二十五个问题涵盖了C#编程的基础概念,深入理解和掌握这些知识是成为一名合格的C#开发者的关键。通过持续学习和实践,将这些理论知识应用于实际项目,你的编程技能会得到显著提升。

    C#基础概念二十五问_C#教程

    C#基础概念二十五问_C#教程

    C#基础教程C# C# C# C#

    【C#基础教程C# C# C# C#】是一份专门为C#编程语言初学者设计的详尽教程。C#(读作“C Sharp”)是微软公司于2000年推出的一种面向对象的、类型安全的、现代的编程语言,主要用于构建Windows平台的应用程序、Web应用...

    c#程序设计基础

    《C#程序设计基础》是一本面向初学者的优秀教程,旨在帮助读者快速掌握C#编程语言的基础知识和核心概念。C#是由微软公司开发的一种面向对象的编程语言,广泛应用于Windows平台、Web应用以及游戏开发等领域。通过学习...

    C#必须知道的300个问题

    "C#必须知道的300个问题"涵盖了从基础语法到高级特性的广泛内容,旨在帮助开发者全面提升C#编程技能。以下是一些核心的知识点概览: 1. **基础语法**:包括变量声明、数据类型(如int, string, bool等)、运算符...

    C#基础概念25问

    【C#基础概念25问】是一份专为C#初学者设计的学习资料,它涵盖了C#编程语言的核心基础知识。这份资源旨在帮助新手快速建立起对C#语言的理解,从而能够开始编写自己的C#程序。以下是对C#基础概念的一些详细解释: 1....

    C#课件基础教程

    C#是一种广泛应用于游戏开发、桌面应用、移动应用和Web应用等领域的面向...随着对C#基础的深入理解和实践,你可以逐渐进阶到更高级的主题,如面向对象编程、异常处理、泛型、LINQ、异步编程以及.NET框架的其他服务。

    C#基础应用实例

    本教程"**C#基础应用实例**"聚焦于C#的核心概念,包括类的运用、接口的使用以及委托和事件的处理,这些都是学习C#编程的重要组成部分。 首先,我们来深入理解**类(Class)**。类是面向对象编程的基础,它是数据和...

    C#基础编程练习题

    本资料包含了一些在Visual Studio 2010环境下编写的C#基础编程练习题,这些练习题旨在帮助学习者巩固和提升C#编程技能。 1. 变量与数据类型:C#中变量是用来存储数据的容器,包括基本数据类型(如int、float、bool...

    C#程序设计基础

    在实际开发中,除了基础概念,还需要学习更高级的主题,如WPF(Windows Presentation Foundation)用于构建现代UI,Entity Framework进行数据库操作,以及ASP.NET Web应用程序开发等。不断学习和实践,将使你在C#...

Global site tag (gtag.js) - Google Analytics