初次相遇C#
开发工具与关键技术:C#和 Visual Studio
作者:朱海丁
撰写时间:2020年05月08日
- 什么是C#?
C#是Microsoft公司设计的一种编程语言。它松散地基于C/C++,并且有很多方面和Java类似。Microsoft是这样描述C#的:“C#是从C和C++派生来的一种简单、现代、面向对象和类型安全的编程语言。C#(读做‘Csharp’)主要是从C/C++编程语言家族移植过来的,C和C++的程序员会马上熟悉它。C#试图结合Visual Basic的快速开发能力和C++的强大灵活的能力。” - 如何开发C#应用程序?
.NET SDK包括了C#命令行编译器(csc.exe),下一个版本的Visual Studio (Visual Studio 7 or Visual Studio.NET)会包含对C#开发的完整支持。 - 一个简单的C#程序是怎样的?
可以是这样:
class CApplication {
public static void Main() {
System.Console.Write( “Hello, new .NET world!” ); }}
(你不能将Main()作为全局函数——C#没有全局函数) - C#是面向对象的吗?
是的,C#像Java和C++一样,是一个面向对象的语言。 - C#有自己的类库吗?
不,就像所有的.NET语言(VB.Net,JScript
.Net…)一样,C#访问.NET类库,C#没有自己的类库。
基本类型
7. 值类型和引用类型的最基本的区别是什么?
C#将类型分为两类,一类是值类型,另一类是引用类型。大部分固有的基本类型(如int, char)是值类型,structs 也是值类型。引用类型包括类、接口、数组和字符串。基本的概念非常简单,那就是一个值类型的实例代表了实际的数据(存在栈中),而一个引用类型的实例代表指向数据的指针或者引用(存在堆中)。
C++开发者最容易混淆的地方是:C#已经自己预定义了一些类型作为值类型,一些作为引用类型,而一个C++的开发者希望能够自己控制。
1. struct在C++中是多余的,为什么C#还要使用它们呢?
在C++中,一个结构和一个类几乎就是一个同样的东西。唯一的区别是缺省的成员的访问级别不一样(struct的缺省级别是public,class的缺省级别是private)。然而,在C#中struct和class完全不一样。在C#中,struct 是值类型,而class是引用类型。另外struct不能从其他struct或者class继承,尽管struct可以实现接口。struct没有析构器。
2. C#支持多重继承吗?
C#支持接口的多重继承,但是不支持类的多重继承。
3. C#接口和C++抽象类一样吗?
不,不完全。C++的抽象类不能被实例化。但是它可以(而且经常是)包含执行代码和数据成员。一个C#接口不能包含任何执行代码或数据成员,它只是一组方法名称和签名(signature)。一个C#的接口更像是一个COM接口而不是抽象类。
另一个主要的不同点是:C#类只能从一个类(不管是否抽象)继承,但可以实现多重接口。
4. C#构造器和C++ 构造器是否相同?
非常相似。
5. C#析构器和C++ 析构器是否相同?
不! 它们看起来相同,但是它们绝对不同。第一,C#析构器不保证在某个特定的时间被调用。实际上它根本不保证被调用。真实的情况是,C#析构器只是一个伪装了的Finalize方法。具体点讲,它是一个插入调用基类Finalize方法的Finalize方法。如果你不相信,可以将一个 Finalize方法和一个析构器加入C#类中,然后就可以知道是如何编译的了。
7. 什么是静态构造器?
它是整个类的一个构造器,而不是类的一个实例的构造器,它在类装载的时候被调用。
- 我“new”了一个对象,但是我怎样删除它?
你不能,不允许你显式地调用析构器,也没有delete操作符。但是不必担心,垃圾回收(garbage collection)会释放你的对象,最终会的(也许会的)。 - 我试图在栈上建立一个对象,但是C#编译器不通过,这是怎么回事?
和C++不同,你不能在栈上建立一个对象的实例。类的实例总是被建立在堆上并且接受垃圾回收器(garbage collection)的管理。 - 我定义了一个析构器,但是它从来不能被调用,为什么?
一个C#析构器实际上是Finalize方法的实现,但是运行环境不保证调用Finalize方法。你可以考虑通过调用GC.RequestFinalizeOnShutdown()方法试一下。