zoukankan      html  css  js  c++  java
  • 艾伟_转载: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位的。

  • 相关阅读:
    HDU 2544 最短路
    HDU 3367 Pseudoforest
    USACO 2001 OPEN
    HDU 3371 Connect the Cities
    HDU 1301 Jungle Roads
    HDU 1879 继续畅通工程
    HDU 1233 还是畅通工程
    HDU 1162 Eddy's picture
    HDU 5745 La Vie en rose
    HDU 5744 Keep On Movin
  • 原文地址:https://www.cnblogs.com/waw/p/2157080.html
Copyright © 2011-2022 走看看