`
JadeLuo
  • 浏览: 409341 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

C# 与 Java语法对比

    博客分类:
  • C#
 
阅读更多

ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/dv_csref/html/bbf3a6da-7884-43ba-9e02-e4d727ab481a.htm

 

 

 

Java 不允许在同一个源文件中出现多个包。而 C# 允许在一个 .cs 文件中出现多个命名空间,如下所示:

   
namespace AcmeAccounting
{
    public class GetDetails
    {
        // ...
    }
}

namespace AcmeFinance
{
    public class ShowDetails
    {
        // ...
    }
}

C# 提供 Java 中可用的所有数据类型,并增加了对无符号数字和新的 128 位高精度浮点类型的支持。

核心类库为 Java 中的每个基元数据类型提供了一个包装类,此包装类将基元数据类型表示为 Java 对象。例如,Int32 类包装 int 数据类型,Double 类包装 double 数据类型。

另一方面,C# 中的所有基元数据类型都是 System 命名空间中的对象。对于每个数据类型,提供了一个简称(或别名)。例如,intSystem.Int32 的简称,而 doubleSystem.Double 的简写。

下表提供了 C# 数据类型列表及其别名。如表所示,前八个数据类型对应于 Java 中可用的基元类型。但请注意,Java 的 boolean 在 C# 中称为 bool

简称

.NET 类

类型

宽度

范围(位)

byte

Byte

无符号整数

8

0 到 255

sbyte

SByte

有符号整数

8

-128 到 127

int

Int32

有符号整数

32

-2,147,483,648 到 2,147,483,647

uint

UInt32

无符号整数

32

0 到 4294967295

short

Int16

有符号整数

16

-32,768 到 32,767

ushort

UInt16

无符号整数

16

0 到 65535

long

Int64

有符号整数

64

-922337203685477508 到 922337203685477507

ulong

UInt64

无符号整数

64

0 到 18446744073709551615

float

Single

单精度浮点型

32

-3.402823e38 至 3.402823e38

double

Double

双精度浮点型

64

-1.79769313486232e308 至 1.79769313486232e308

char

Char

单 Unicode 字符

16

文本中使用的 Unicode 符号

bool

Boolean

逻辑布尔值类型

8

True 或 False

object

Object

所有其他类型的基类型

 

 

string

String

字符序列

 

 

decimal

Decimal

精确小数类型或整型,可以表示带有 29 个有效位的十进制数

128

±1.0 × 10e−28 至 ±7.9 × 10e28

因为 C# 将所有基元数据类型当作对象表示,所以可以在基元数据类型上调用对象方法。例如:

C#  “复制”图像复制代码
static void Main()
{
    int i = 10;
    object o = i;
    System.Console.WriteLine(o.ToString());
}    

借助自动装箱和取消装箱完成此操作。有关更多信息,请参见装箱和取消装箱(C# 编程指南)

“折叠”图像常数

Java 和 C# 均能够声明这样一个变量:它的值在编译时指定,在运行时不能更改。Java 使用 final 字段修饰符声明此类变量,而 C# 则使用 const 关键字。除了 const 以外,C# 还提供 readonly 关键字以声明可以在运行时进行一次赋值(在声明语句中或在构造函数中)的变量。初始化以后,readonly 变量的值不能更改。当已单独编译的模块需要共享版本号等数据时,可以使用 readonly 变量。如果模块 A 更新了,并使用一个新的版本号进行了重新编译,则模块 B 可以用这个新的常数值进行初始化,而无需重新编译。

“折叠”图像枚举

枚举用于对已命名常数进行分组,与在 C 和 C++ 中的用法相似,但不可用于 Java。下面的示例定义一个简单的 Color 枚举。

C#  “复制”图像复制代码
public enum Color
{
    Green,   //defaults to 0
    Orange,  //defaults to 1
    Red,     //defaults to 2
    Blue     //defaults to 3
}  

也可以将整数值分配给枚举,如下面的枚举声明所示:

C#  “复制”图像复制代码
public enum Color2
{
    Green = 10,
    Orange = 20,
    Red = 30,
    Blue = 40
}

下面的代码示例调用 Enum 类型的 GetNames 方法来显示枚举的可用常数。然后,将值分配给枚举,并显示此值。

C#  “复制”图像复制代码
class TestEnums
{
    static void Main()
    {
        System.Console.WriteLine("Possible color choices: ");

        //Enum.GetNames returns a string array of named constants for the enum.
        foreach(string s in System.Enum.GetNames(typeof(Color)))
        {
            System.Console.WriteLine(s);
        }

        Color favorite = Color.Blue;

        System.Console.WriteLine("Favorite Color is {0}", favorite);
        System.Console.WriteLine("Favorite Color value is {0}", (int) favorite);
    }
}

“折叠”图像输出

Possible color choices:

Green

Orange

Red

Blue

Favorite Color is Blue

Favorite Color value is 3

“折叠”图像字符串

Java 和 C# 中的字符串类型的行为相似,只有细微的差异。两种字符串类型都是不可变的,意味着一旦创建了字符串,字符串的值就无法更改。两个实例中的方法看上去修改了字符串的实际内容,实际上创建并返回了一个新字符串,而原始字符串保持不变。C# 和 Java 中比较字符串值的过程有所不同。若要在 Java 中比较字符串值,则开发人员需要在字符串类型上调用 equals 方法,原因是默认情况下 == 运算符会比较引用类型。在 C# 中,开发人员可以直接使用 ==!= 运算符来比较字符串值。尽管在 C# 中字符串是引用类型,但在默认情况下 ==!= 运算符将比较字符串值而不是引用。

和在 Java 中一样,C# 开发人员不应使用字符串类型来串连字符串,以避免在每次串连字符串时创建新字符串类所产生的开销。相反,开发人员可以使用 StringBuilder 类,它与 Java 的 StringBuffer 类在功能上等效。

“折叠”图像字符串文本

C# 能够避免在字符串常数中使用转义序列,如用于制表符的 "\t" 或用于反斜杠字符的 "\"。若要达到此目的,只需在分配字符串值之前使用 @ 符号声明原义字符串。下面的示例演示如何使用转义字符以及如何分配字符串文本:

C#  “复制”图像复制代码
static void Main()
{
    //Using escaped characters:
    string path1 = "\\\\FileShare\\Directory\\file.txt";
    System.Console.WriteLine(path1);

    //Using String Literals:
    string path2 = @"\\FileShare\Directory\file.txt";
    System.Console.WriteLine(path2);
}

“折叠”图像转换和强制转换

Java 和 C# 对数据类型的自动转换和强制转换遵循相似的规则。

和 Java 一样,C# 支持隐式和显式类型转换。如果是扩大转换,则为隐式转换。例如,下面从 intlong 的转换为隐式转换,与在 Java 中相同:

C#  “复制”图像复制代码
int int1 = 5;
long long1 = int1;  //implicit conversion

下面是 .NET Framework 数据类型之间的隐式转换列表:

源类型

目标类型

Byte

short、ushort、int、uint、long、ulong、float、double 或 decimal

Sbyte

short、int、long、float、double 或 decimal

Int

long、float、double 或 decimal

Uint

long、ulong、float、double 或 decimal

Short

int、long、float、double 或 decimal

Ushort

int、uint、long、ulong、float、double 或 decimal

Long

float、double 或 decimal

Ulong

float、double 或 decimal

Float

double

Char

ushort、int、uint、long、ulong、float、double 或 decimal

使用与 Java 相同的语法强制转换要显式转换的表达式:

C#  “复制”图像复制代码
long long2 = 5483;
int int2 = (int)long2;  //explicit conversion

下表列出了显式转换。

源类型

目标类型

Byte

sbyte 或 char

Sbyte

byte、ushort、uint、ulong 或 char

Int

sbyte、byte、short、ushort、uint、ulong 或 char

Uint

sbyte、byte、short、ushort、int 或 char

Short

sbyte、byte、ushort、uint、ulong 或 char

Ushort

sbyte、byte、short 或 char

Long

sbyte、byte、short、ushort、int、uint、ulong 或 char

Ulong

sbyte、byte、short、ushort、int、uint、long 或 char

Float

sbyte、byte、short、ushort、int、uint、long、ulong、char 或 decimal

Double

sbyte、byte、short、ushort、int、uint、long、ulong、char、float 或 decimal

Char

sbyte、byte 或 short

Decimal

sbyte、byte、short、ushort、int、uint、long、ulong、char、float 或 double

“折叠”图像值与引用类型

C# 支持两种变量类型:

  • 值类型

    这些是内置基元数据类型(如 char、int 和 float)以及用 struct 声明的用户定义类型。

  • 引用类型

    从基元类型构造的类和其他复杂的数据类型。这种类型的变量不包含类型的实例而仅包含对实例的引用。

如果创建两个值类型变量 i 和 j(如下所示),则 i 和 j 完全相互独立:

C#  “复制”图像复制代码
int i = 10;
int j = 20;

为它们指定了独立的内存位置:

各种值类型的不同内存地址

如果更改这两个变量中其中一个的值,另一个变量当然不受影响。例如,如果具有如下形式的表达式,则这两个变量之间仍然没有关联:

C#  “复制”图像复制代码
int k = i;

也就是说,如果更改 i 的值,则 k 将保留赋值时 i 具有的值。

C#  “复制”图像复制代码
i = 30;

System.Console.WriteLine(i.ToString());  // 30
System.Console.WriteLine(k.ToString());  // 10

但是,引用类型的行为则不同。例如,可以声明如下所示的两个变量:

C#  “复制”图像复制代码
Employee ee1 = new Employee();
Employee ee2 = ee1;

现在,因为类在 C# 中为引用类型,所以 ee1 被视为对 Employee 的引用。在前面的两行中,第一行在内存中创建 Employee 的一个实例,并设置 ee1 以引用该实例。因此,将 ee2 设置为等于 ee1 时,它包含了对内存中的类的重复引用。如果现在更改 ee2 上的属性,则 ee1 上的属性将反映这些更改,因为两者都指向内存中的相同对象,如下所示:

引用类型的内存位置

“折叠”图像装箱和取消装箱

将值类型转换为引用类型的过程称为装箱。反之,将引用类型转换为值类型的过程则称为取消装箱。下面的代码说明了这一点:

C#  “复制”图像复制代码
int i = 123;      // a value type
object o = i;     // boxing
int j = (int)o;  // unboxing

Java 要求手动执行这种转换。可以通过构造这种对象或装箱,将基元数据类型转换为包装类的对象。同样地,可以通过在这种对象上调用合适的方法或取消装箱,从包装类对象中提取基元数据类型的值。有关装箱和取消装箱的更多信息,请参见 装箱转换(C# 编程指南)取消装箱转换(C# 编程指南)

分享到:
评论

相关推荐

    Java与c#语法及对比

    详细全面的描述了Java与c#语法对比,相信看了对你一定有帮助,~~~~~~~~~

    c#与Java的分析和比较

    它包括了诸如单一继承,界面,与Java几乎同样的语法,和编译成中间代码再运行的过程.但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司.NET windows网络框架的...

    C++ Java C#.net VB.net 语法对比

    C++ Java C#.net VB.net 四种常用语言的各种语法对比,语法大全

    五种语言横向对比

    对C#,Java,GO,Python,Js五种语言进行横向对比.对比语言特性,以及常见语法.转新语言必备.语法不熟悉的时候也可以用来速查.

    疯狂JAVA讲义

    1.2.1 C#简介和优势 4 1.2.2 Ruby简介和优势 4 1.2.3 Python的简介和优势 5 1.3 Java程序运行机制 5 1.3.1 高级语言的运行机制 6 1.3.2 Java程序的运行机制和JVM 6 1.4 开发Java的准备 7 1.4.1 安装JDK 8 ...

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    无论是刚开始接触面向对象编程的新手,还是打算转移到c#的具有c,c++或者java基础的程序员,都可以从本书中吸取到新的知识。 作译者 john sharp,content master首席技术专家。content master隶属于cm集团,cm集团...

    vscdoe_mac.dmg.zip

    Visual studio code mac版是一款免费开源的现代化轻量级代码编辑器,支持语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比 Diff、GIT 等特性,Visual studio code mac针对网页开发和云端应用开发...

    VSCode1.15.0 for mac

    Visual studio code mac版是一款免费开源的现代化轻量级代码编辑器,支持语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比 Diff、GIT 等特性,Visual studio code mac针对网页开发和云端应用开发...

    .NET事件监听机制的局限与扩展分析

    .NET中把“事件”看作一个基本的编程概念,并提供了非常优美的语法支持,对比如下C#和Java代码可以看出两种语言设计思想之间的差异。 代码如下:// C# someButton.Click += OnSomeButtonClick; 代码如下:// Java ...

    Notepad++ 绿色版+多个实用插件

    支持的语言: C, C++ , Java , C#, XML, HTML, PHP, Javascript , RC resource file, makefile, ASCII art file (extension .nfo , screenshot1, screenshot2), doxygen, ini file, batch file, ASP , VB/VBS source ...

    XQuery权威指南(简码·扫描版)

     本书的特点是用简洁的语言深入浅出地介绍了XQuery方方面面的知识,在讲述有些内容时把XQuery与其他广为人知的技术如SQL等相对比,使得读者可以很快上手。阅读本书只须要了解一些基础的XML背景知识。本书除了用于...

    强悍文本编辑器 - Notepad++ v5.3 Final 多国语言版

    C C++ Java C# XML HTML PHP CSS makefile ASCII art (.nfo) doxygen ini file batch file Javascript ASP VB/VBS SQL Objective-C RC resource file Pascal Perl Python Lua TeX TCL Assembler Ruby Lisp Scheme...

Global site tag (gtag.js) - Google Analytics