C#语言基础常见问题汇总

  概述

  1、什么是C#?

  C#是Microsoft公司设计的一种编程语言。它松散地基于C/C++,并且有很多方面和Java类似。

  Microsoft是这样描述C#的:“C#是从C和C++派生来的一种简单、现代、面向对象和类型安全的编程语言。C#(读做‘Csharp’)主要是从C/C++编程语言家族移植过来的,C和C++的程序员会马上熟悉它。C#试图结合Visual Basic的快速开发能力和C++的强大灵活的能力。”

  2、如何开发C#应用程序?

  .NET SDK包括了C#命令行编译器(csc.exe),下一个版本的Visual Studio (Visual Studio 7 or Visual Studio.NET)会包含对C#开发的完整支持。

  3、C#可以取代Java?

  C#非常像Java语言——这两种语言的核心和C++相比都有相似的优缺点。例如,两个语言都有垃圾回收,但是两个语言都没有模板(template)。Microsoft已经中止了Visual J++产品,因此很难不认为Microsoft在使用C#来替代Java。

  4、C#可以取代C++?

  显然是不,但是我们又很难说C++是新的.NET平台上编写代码的最佳选择。为了使.NET的运行层能完全发挥作用,它要求编程语言遵循某些特定的规则——其中之一就是所有的语言类型必须遵守通用类型系统(Common Type System,CTS)。不幸的是,许多C++特性不能被CTS支持。例如,模板和类的多重继承。

  Microsoft对这个问题的答案是给C++提供可管理的扩展(Managed Extensions,ME), 这可以使C++遵守CTS。通过添加新的关键字来标记C++类有CTS的属性(例如.-gc表示垃圾回收)。但是在创建新的工程时很难讲为什么ME C++会比C#更合适。就特征(feature)而言它们很相似,但与C++不同的是C#从一开始就以.NET为环境设计的。ME C++存在的理由好像是将C++代码移植(port)为.NET环境下的代码。

  因此,这个问题的答案,很可能是C++作为一个.NET环境之外的语言将依然保留它的重要性;而通过ME将现存的C++代码移植为适合.NET环境;但是很可能C#将是C++开发者开发新的.NET应用程序的最好选择。

  8、C#是面向对象的吗?

  是的,C#像Java和C++一样,是一个面向对象的语言。

  9、C#有自己的类库吗?

  不,就像所有的.NET语言(VB.Net,JScript .Net...)一样,C#访问.NET类库,C#没有自己的类库。

  基本类型

  1、C#提供什么标准类型?

  C# 支持的基本类型和C++很相似,包括int, long, float, double, char, string, arrays, structs 和 classes。然而,不要假设太多,名字可能很形似,但是一些细节不相同。例如C#中的long是64位的,而C++的long取决于平台,32位的平台上是32位的,64位的平台上是64位的。class和struct在C++中几乎完全一样,但在C#中并不是这样的。

  2、是否所有的C#类型都派生于一个公共的基类?

  是,也不是,所有的对象都可以看作从Object (System.Object)派生而来。但是为了把像int,float这样的值类型实例看作是从Object对象派生的,这个实例必须通过一个装箱的操作(boxing)转化为引用类型。理论上,开发者可以忽略这些底层的转化,但是认识到这点对于系统性能影响很重要。

  3、是否可以这样认为,可以将一个值类型的实例作为参数传给以对象为参数的方法?

  是的,例如:

class CApplication

{

  public static void Main()

  {

    int x = 25;

    string s = “fred”;

    DisplayMe( x );

    DisplayMe( s );

   }

    static void DisplayMe( object o )

    {

      System.Console.WriteLine( “You are {0}”, o );

    }

}

  将显示:

  You are 25    
  You are fred

  4、值类型和引用类型的最基本的区别是什么?

  C#将类型分为两类,一类是值类型,另一类是引用类型。大部分固有的基本类型(如int, char)是值类型,structs 也是值类型。引用类型包括类、接口、数组和字符串。基本的概念非常简单,那就是一个值类型的实例代表了实际的数据(存在栈中),而一个引用类型的实例代表指向数据的指针或者引用(存在堆中)。

  C++开发者最容易混淆的地方是:C#已经自己预定义了一些类型作为值类型,一些作为引用类型,而一个C++的开发者希望能够自己控制。

  例如,在C++中,我们可以这样做:

  int x1 = 3; // x1 是堆栈上的值    
  int *x2 = new int(3) // x2 是堆的一个值的引用

  但是在C#中没有这样的控制:

  int x1 = 3; // x1是堆栈上的值    
  int x2 = new int();    
  x2 = 3; // x2还是堆栈上的值!

  5、既然 int是值类型,而 class是引用类型,那么int是怎样从Object派生的呢?

  是这样的,当int用作int时候,这是一个值类型(在栈上),然而,当它用作是Object时,这是一个引用堆上的整数值的引用类型。换而言之,当你将int看作对象时,运行层将它自动转化为对象引用,这个转化过程称作装箱(boxing)。这个转换包括将栈里的值拷贝到了堆里,并且新建了一个对象的实例来引用该值。拆箱操作(unboxing)是个反过程——将对象转化为基于栈的值类型。

  int x = 3;    
  // 堆栈上新的int类型,值为3    
  object objx = x;    
  // 堆上新的int, 设定值为3,x=3仍然在堆栈上    
  int y = (int)objx;    
  //新的int类型的值3在堆栈上,x=3在堆栈上,objx=3在堆上

  6、C#使用引用替代指针,那么C#的引用和C++的引用一样吗?

  不完全,基本的思想是一样的,但是一个重要的区别是C#的引用可以是null。因此你不能确认C#的引用一定会是一个有效的对象。如果试图使用一个值为null的引用,一个NullReferenceException 异常将被抛出。

  例如,看一看以下的方法:

void displayStringLength( string s )

{

  Console.WriteLine( “String is length {0}”, s.Length );

}

如果这样调用它,这种方法将产生一个NullReferenceException 异常:

string s = null;

displayStringLength( s );

当然有些情况你认为产生这样一个异常是完全可以接受的结果,

但是在这个例子里最好按下面的代码改写一下:

void displayStringLength( string s )

{

  if( s == null )

  Console.WriteLine(“String is null”);

  else

  Console.WriteLine(“String is length {0}”, s.Length );

}

  class和struct

  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++ 构造器是否相同?

  非常相似,但是它们绝对不同。第一,C#析构器不保证在某个特定的时间被调用。实际上它根本不保证被调用。真实的情况是,C#析构器只是一个伪装了的Finalize方法。具体点讲,它是一个插入调用基类Finalize方法的Finalize方法。因此,这段代码:

class CTest

{

  ~CTest()

   {

  System.Console.WriteLine(“Bye bye” );

  }

}

实际上就是:

class CTest

{

  protected override void Finalize()

  {

    System.Console.WriteLine(“Bye bye” );

    base.Finalize();

  }

}

  如果你不相信,可以将一个 Finalize方法和一个析构器加入C#类中,然后就可以知道是如何编译的了。

  5、什么是静态构造器?

  它是整个类的一个构造器,而不是类的一个实例的构造器,它在类装载的时候被调用。

  6、C#中所有的方法都是虚方法吗?

  不,像C++一样,缺省的时候,方法不是虚拟的,但都可以改为虚拟的。

  7、怎样在C#中声明一个纯虚函数?

  在方法前使用abstract修饰符,类也可以标记为abstract(这是自然的)。注意,abstract方法不能有执行代码(不同于C++中纯虚方法)。

  和C++处理的不同

  1. 我“new”了一个对象,但是我怎样删除它?

  你不能,不允许你显式地调用析构器,也没有delete操作符。但是不必担心,垃圾回收(garbage collection)会释放你的对象,最终会的(也许会的)。

  2. 我试图在栈上建立一个对象,但是C#编译器不通过,这是怎么回事?

和C++不同,你不能在栈上建立一个对象的实例。类的实例总是被建立在堆上并且接受垃圾回收器(garbage collection)的管理。

  3. 我定义了一个析构器,但是它从来不能被调用,为什么?

  一个C#析构器实际上是Finalize方法的实现,但是运行环境不保证调用Finalize方法。你可以考虑通过调用GC.RequestFinalizeOnShutdown()方法试一下。

  4. 大多数的C#基本类型和C++的基本类型有相同的名字,它们一样吗?

不,C#中char和C++中的wchar是相同的。C#中所有的字符包括字符串都是Unicode的,C#中整型值是固定大小的,而在C++中其大小取决于处理器。例如,一个C#的int是32位的,而C++ 中int在32-bit处理器上是32位的,在64-bit处理器上是64位的,一个C#的long是64位的。

时间: 2024-10-24 07:20:18

C#语言基础常见问题汇总的相关文章

艾伟_转载:C#语言基础常见问题汇总

概述 1.什么是C#? C#是Microsoft公司设计的一种编程语言.它松散地基于C/C++,并且有很多方面和Java类似. Microsoft是这样描述C#的:"C#是从C和C++派生来的一种简单.现代.面向对象和类型安全的编程语言.C#(读做'Csharp')主要是从C/C++编程语言家族移植过来的,C和C++的程序员会马上熟悉它.C#试图结合Visual Basic的快速开发能力和C++的强大灵活的能力." 2.如何开发C#应用程序? .NET SDK包括了C#命令行编译器(c

Win7/Win8.1免费升级Win10正式版常见问题汇总解答

  今天,微软宣布Windows 10正式版将于7月29日发布,届时正版Win7和Win8.1用户可免费升级到Win10.与此同时,微软官网也迎来了改版,并回答了一些Windows 10免费升级相关的问题,下面小编就为大家带来Win7/Win8.1免费升级Win10正式版常见问题汇总解答,具体如下. Win10何时推出? Win10将于2015年7月29日发布. 预订Win10免费升级版有何意义? 我们将在有限时间内为符合条件的Windows7 SP1.Windows 8.1更新和Windows

win8系统使用时遇到的常见问题汇总及解答

不少电脑爱好者朋友现在都在关注最新微软windows 8系统,根据微软最新官方消息,WIN8系统也将在本月底发布最新消费者预览版,供尝鲜朋友抢先体验WIN8,针对近期不少朋友都常问的一些windows 8问题,笔者这里汇总解答下. windows 8常见问题汇总解答 一:windows 8什么时候发布?可以到哪去下载? 编辑解答:win8最新微软公布的消息是将于2月底29号发布消费者预览版,供电脑爱好者尝鲜体验,正式版也将在不久之后发布.下载方面因为第一时间由微软公布,所以大家需要去微软官方下载

PL/SQL --> 语言基础

--===================== -- PL/SQL --> 语言基础 --=====================       PL/SQL是过程化的SQL语言,是ORACLE对SQL语言的扩展,在普通SQL语句的基础上增加了编程语言的特点.使得该语言不仅具有过程编程语 言的特征,如循环.条件分支等.同时也具有对象编程语言的特征,如重载.继承等.     一.PL/SQL程序语言的组成     主要由块组成         一个块由三个基本部分组成:声明.执行体.异常处理   

Mysql基础知识点汇总_Mysql

1.什么是SQL语句 sql语言:结构化的查询语言.(Structured Query Language),是关系数据库管理系统的标准语言. 它是一种解释语言:写一句执行一句,不需要整体编译执行. 语法特点: 1.没有" ",字符串使用' '包含 2.没有逻辑相等,赋值和逻辑相等都是= 3.类型不再是最严格的.任何数据都可以包含在' '以内 4.没有bool值的概念,但是在视图中可以输入true/false 5.它也有关系运算符:> < >= <= = <

大数据安全分析常见问题汇总

大数据是时下最火热的IT行业的词汇,随之数据仓库.数据安全.数据分析.数据挖掘等等围绕大数量的商业价值的利用逐渐成为行业人士争相追捧的利润焦点. 本人在与用户沟通大数据问题时经常会遇到一些问题,现将这些常见问题汇总,抛砖引玉,希望可以帮助到大家. 1. 大数据安全分析的核心目标是什么? 应答:为了能够找到隐藏在数据背后的安全真相.数据之间存在着关联,传统分析无法将海量数据汇总,但是大数据技术能够应对海量数据的分析需求.通过大数据基础能够挖掘出APT攻击.内网隐秘通道.异常用户行为等安全事件.在此

家用无线路由器的配置和常见问题汇总

家用无线路由器的配置和常见问题汇总   一.路由器设置的网页存储在路由器芯片里,设置时WAN接口(路由器上蓝色接口)不需要接网线 1.路由器设置的网页存储在路由器芯片里,设置时WAN接口(路由器上蓝色接口)不需要接网线. 二.进入不了管理界面,或者打不开192.168.1.1 方法一. fwr701型可以尝试使用10.0.0.1进入(浏览器输入10.0.0.1) 如使用此方法可以进入进入后请修改路由器地址到正常网段,可参见修改路由器地址防止与网内路由器.光猫等冲突 方法二: 1.点击"开始-运行

【软考教程】程序设计语言基础

继续软考教程的学习,在第1章,我们主要是对计算机的组成和工作原理做了一定了解,可以说,在他的带领下,我们对计算机硬件方面的知识,有了更加坚实的基础. 第2章,程序设计语言基础知识.不看内容,光从标题来看,并不会觉得陌生."程序设计语言",至今,我们已经接触过不止一种了,从最初的VB.到后来的VB.NET.C#.C++,软考前个阶段,我们还见到了早有耳闻的Java世界. 那么,下面就跟随着"设计语言"的脚步,一起发现编程路上美丽的风光吧. 想要对程序设计语言有个宏观上

HTML进阶应用技巧(一)HTML语言基础

技巧 一.为什么要学习HTML? 近两年来,许多公司开发出了图形化的HTML开发工具,使得网页的制作变得非常简单.如微软公司推出的 Microsoft FrontPage, Adobe公司推出的 Adobe Pagemill, Micromedia公司推出的Dreamweaver等编辑工具,都被称为"所见即所得"的网页制作工具.这些图形化的开发工具可以直接处理网页,而不用书写费劲的标记.这使得用户在没有HTML语言基础的情况下,照样可以编写网页.这时,编写HTML文档的任务由开发工具替