扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在这一部分中,我们讨论这两种语言之间的相似点和不同点。一些主要的不同点有:
常量声明 — Java 为此而使用 final 关键字,而 C# 使用关键字 const 或 readonly。
复合数据类型 — 在 Java 中,我们可以使用类关键字来创建作为没有方法的类的复合数据类型,但是 C# 为此提供了 struct,同 C 中一样。
析构函数 — C# 允许我们创建在销毁类的实例之前调用的析构函数方法。在 Java 中,可以提供 finalize() 方法来包含在将对象作为垃圾回收之前清除资源的代码。在 C# 中,由类析构函数来提供此功能。析构函数类似一个没有参数并前面带有波形符“~”的构造函数。
函数指针 — C# 提供一个称为 delegate 的构造来创建类型安全的函数指针。Java 没有任何与之对等的机制。
C# 提供了在 Java 中可用的所有数据类型,并且增加了对无符号数和新的 128 位高精度浮点类型的支持。
在 Java 中,对于每个基本数据类型,核心类库都提供了一个包装类来将其表示为 Java 对象。例如,Integer 类包装 int 数据类型,而 Double 类包装 double 数据类型。
而在 C# 中,所有的基本数据类型都是 System 命名空间中的对象。对于每个数据类型,都提供一个简称或别名。例如,int 是 System.Int32 的简称,而 double 是 System.Double 的简写形式。
下面的列表给出了 C# 数据类型及其别名。可以看到,前 8 个对应于 Java 中可用的基本类型。不过,请注意,Java 的 boolean 在 C# 中称为 bool。
| 
 简称  | 
 .NET类  | 
 类型  | 
 宽度  | 
 范围(位)  | 
|---|---|---|---|---|
| 
 byte  | 
 System.Byte  | 
 无符号整数  | 
 8  | 
 -128 到 127  | 
| 
 sbyte  | 
 System.SByte  | 
 有符号整数  | 
 8  | 
 -128 到 127  | 
| 
 int  | 
 System.Int32  | 
 有符号整数  | 
 32  | 
 -2,147,483,648 到 2,147,483,647  | 
| 
 uint  | 
 System.UInt32  | 
 无符号整数  | 
 32  | 
 0 到 4294967295  | 
| 
 short  | 
 System.Int16  | 
 有符号整数  | 
 16  | 
 -32,768 到 32,767  | 
| 
 ushort  | 
 System.UInt16  | 
 无符号整数  | 
 16  | 
 0 到 65535  | 
| 
 long  | 
 System.Int64  | 
 有符号整数  | 
 64  | 
 -922337203685477508 到 922337203685477507  | 
| 
 ulong  | 
 System.UInt64  | 
 无符号整数  | 
 64  | 
 0 到 18446744073709551615  | 
| 
 float  | 
 System.Single  | 
 单精度浮点类型  | 
 32  | 
 -3.402823e38 到 3.402823e38  | 
| 
 double  | 
 System.Double  | 
 双精度浮点类型  | 
 64  | 
 -1.79769313486232e308 到 1.79769313486232e308  | 
| 
 char  | 
 System.Char  | 
 单个 Unicode 字符  | 
 16  | 
 用在文本中的 Unicode 符号  | 
| 
 bool  | 
 System.Boolean  | 
 逻辑 Boolean 类型  | 
 8  | 
 true 或 false  | 
| 
 object  | 
 System.Object  | 
 所有其他类型的基本类型  | 
||
| 
 string  | 
 System.String  | 
 字符序列  | 
||
| 
 decimal  | 
 System.Decimal  | 
 可以表示具有 29 个有效位的小数的精确分数或整数类型  | 
 128  | 
 -2 x 10-96 到 2 x 1096  | 
因为 C# 将所有的基本数据类型都表示为对象,所以按照基本数据类型来调用对象方法是可能的。例如:
int i=10; Console.WriteLine(i.ToString());
借助于自动装箱和拆箱,可以达到此目的。更多信息请参见装箱和拆箱。
与 C/C++ 相似,在 C# 中可以使用枚举来组合已命名常量,而在 Java 中不能使用枚举。下面的示例定义了一个简单的 Color 枚举。
public enum Color {Green, Orange, Red, Blue}  
还可以为枚举赋整数值,如下面的枚举声明所示:
public enum Color {Green=10, Orange=20, Red=30, Blue=40}
下面的程序调用 Enum 类型的 GetNames 方法来显示枚举的可用常量。然后,它将值赋给枚举,并显示该值。
using System;
public class TypeTest
{
    public static void Main()
    {
      Console.WriteLine("Possible color choices: ");
      //Enum.GetNames returns a string array of named constants for the enum
      foreach(string s in Enum.GetNames(typeof(Color)))
      {
        Console.WriteLine(s);
      }
      Color FavoriteColor = Color.Blue;
      Console.WriteLine("Favorite Color is {0}",FavoriteColor);
      Console.WriteLine("Favorite Color value is {0}", (int)FavoriteColor);
    }
}
在运行之后,该程序将显示如下结果:
Possible color choices: Green Orange Red Blue Favorite Color is Blue Favorite Color value is 40
在 Java 和 C# 中,字符串类型表现出相似的行为,只有一些细微的差别。二者的字符串类型均是不可改变的,这意味着一旦字符串创建完毕,就不能改变字符串的值。在二者的实例中,看起来像修改字符串实际内容的方法实际上创建一个新的字符串供返回,而保留原始的字符串不变。在 C# 和 Java 中,比较字符串值的过程是不同的。在 Java 中,为了比较字符串的值,开发人员需要按照字符串类型调用 equals() 方法,正如在默认情况下 == 运算符比较引用类型一样。在 C# 中,开发人员可以使用 == 或 != 运算符来直接比较字符串的值。在 C# 中,尽管字符串是引用类型,但是在默认情况下,== 和 != 运算符将比较字符串的值而不是引用。在本文后面,我们将讨论值类型和引用。
正如在 Java 中一样,C# 开发人员不应该使用字符串类型来连接字符串,以避免每次连接字符串时都创建新的字符串类的开销。相反,开发人员可以使用 System.Text 命名空间中的 StringBuilder 类,它在功能上等同于 Java 中的 StringBuffer 类。
C# 提供了避免在字符串常量中使用转义序列(如代表制表符的“\t”或代表反斜杠字符的“\”)的功能。要这样做,可以在为字符串赋值之前使用 @ 符号来声明字符串。下面的示例显示了如何使用转义字符以及如何为字符串赋值:
//Using escaped characters string path = "\\\\FileShare\\Directory\\file.txt"; //Using String Literals string escapedPath = @"\\FileShare\Directory\file.txt";查看本文来源
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。