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 命名空间中的对象。对于每个数据类型,提供了一个简称(或别名)。例如,int 是 System.Int32 的简称,而 double 是 System.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,
Orange,
Red,
Blue
}
|
也可以将整数值分配给枚举,如下面的枚举声明所示:
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: ");
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()
{
string path1 = "\\\\FileShare\\Directory\\file.txt";
System.Console.WriteLine(path1);
string path2 = @"\\FileShare\Directory\file.txt";
System.Console.WriteLine(path2);
}
|
转换和强制转换
Java 和 C# 对数据类型的自动转换和强制转换遵循相似的规则。
和 Java 一样,C# 支持隐式和显式类型转换。如果是扩大转换,则为隐式转换。例如,下面从 int 到 long 的转换为隐式转换,与在 Java 中相同:
C#
复制代码
int int1 = 5;
long long1 = int1;
|
下面是 .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;
|
下表列出了显式转换。
源类型
目标类型
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# 支持两种变量类型:
如果创建两个值类型变量 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());
System.Console.WriteLine(k.ToString());
|
但是,引用类型的行为则不同。例如,可以声明如下所示的两个变量:
C#
复制代码
Employee ee1 = new Employee();
Employee ee2 = ee1;
|
现在,因为类在 C# 中为引用类型,所以 ee1 被视为对 Employee 的引用。在前面的两行中,第一行在内存中创建 Employee 的一个实例,并设置 ee1 以引用该实例。因此,将 ee2 设置为等于 ee1 时,它包含了对内存中的类的重复引用。如果现在更改 ee2 上的属性,则 ee1 上的属性将反映这些更改,因为两者都指向内存中的相同对象,如下所示:
装箱和取消装箱
将值类型转换为引用类型的过程称为装箱。反之,将引用类型转换为值类型的过程则称为取消装箱。下面的代码说明了这一点:
C#
复制代码
int i = 123;
object o = i;
int j = (int)o;
|
Java 要求手动执行这种转换。可以通过构造这种对象或装箱,将基元数据类型转换为包装类的对象。同样地,可以通过在这种对象上调用合适的方法或取消装箱,从包装类对象中提取基元数据类型的值。有关装箱和取消装箱的更多信息,请参见 装箱转换(C# 编程指南) 和 取消装箱转换(C# 编程指南)。
|
分享到:
相关推荐
### Java与C#语法对比详解 #### 一、概述 本文将对Java与C#两种流行编程语言在语法上的异同进行深入分析。通过对比,读者可以更好地理解这两种语言的特点,从而根据项目需求选择合适的技术栈。以下是Java与C#在...
- Java的泛型(Generics)与C#中的泛型存在语法上的相似性,但实现细节有所不同。 - 两种语言都支持数值转换、装箱和拆箱操作。 4. 表达式与运算符 - Java和C#的算术运算符、关系运算符和逻辑运算符基本相同。 ...
### 论C#与Java之异同 ...通过以上的对比分析可以看出,尽管C#和Java在很多方面有着相似之处,但它们在细节上仍存在一定的差异。这种比较有助于开发者更好地理解这两种语言的特点,并根据项目需求选择合适的工具。
- **C#与JAVA的代码对比**:虽然两个语言的语法和API有所不同,但实现DES的核心逻辑是相同的,都涉及密钥的设置、加密和解密操作。 - **通用性**:DEMO表明C#和JAVA实现的DES算法可以互换使用,这在跨平台开发中很...
《C#与Java对比》 本文将探讨C#和Java这两种主流编程语言之间的主要差异,以便于开发者理解和选择适合自己项目的语言。以下是一些关键的区别: 1. 循环语法: - Java的`for`循环既支持索引遍历,也支持基于类型的...
### C++、Java、C# .NET 和 VB.NET 语法对比 #### 1. 基本数据类型 为了帮助开发者快速掌握不同编程语言的基本数据类型,以下表格提供了C++、VB.NET、C# .NET 和 Java 的基本数据类型的对应关系。 | 基础类型名 |...
2. **C#与Java语法对比**:理解两者之间的语法差异,如类定义、方法声明、异常处理等。 3. **.NET框架**:熟悉.NET框架,特别是关于文件系统操作、异步编程和网络通信的部分,因为这些是Git库常见的需求。 4. **单元...
这里主要聚焦于C++与C#的对比,并适当提及Java的相关特性,以帮助读者更好地理解这些语言之间的区别。 ### 一、继承 **C++**: 支持多继承,即一个类可以从多个基类继承属性和方法。 **C#**: 不支持多继承,一个类...
【描述】:"本文将详细对比C#与Java这两门编程语言在源文件、数据类型、运算符、分支语句、访问修饰符、方法、属性、继承、事件、运算符重载、异常处理、索引器以及元数据等方面的不同之处。" 【标签】:"C#与Java的...
### C#与Java的语言特性对比 - **属性**:Java中,属性的访问通常需要通过`get`和`set`方法,而在C#中,属性更像是直接的数据成员,定义时必须同时包含`get`和`set`,访问时使用点操作符,更加直观。 - **对象索引...
标题 "C#与VB对比图" 提到的是两种流行的编程语言——C#和Visual Basic (VB)之间的比较。这两种语言都是Microsoft .NET框架的核心部分,用于构建Windows应用程序、Web应用程序和移动应用等。以下是这两者在语法上的...
在对比C#与Java这两种编程语言时,我们可以发现它们有许多相似之处,但也存在明显的差异。首先,两者都源自C++,并且在语法上有很多共同点。例如,它们都是编译成中间代码,可以在受管理的环境中运行,如.NET ...
这里我们将深入探讨C#和Java在语法、应用领域、性能、跨平台性等方面的主要差异。 首先,C#是由微软公司推出的,主要用于.NET框架,而Java由Sun Microsystems(现已被Oracle收购)开发,其目标是实现“一次编写,...
- Java语法较为简洁,类似于C++,但去除了指针和显式内存管理。 - C#语法更接近C++,保留了指针(但受限于安全性),并引入了一些新的语言特性,如lambda表达式、async/await等。 3. **运行环境**: - Java程序...
### C#与Java的对比分析 #### 一、概述 C#与Java是两种非常流行的编程语言,在软件开发领域有着广泛的应用。这两种语言都源于C语言家族,它们的设计初衷都是为了提供一种更现代化、更安全且面向对象的编程语言。...
### C#与Java的深入对比分析 #### 一、引言 随着计算机科学的发展,不同的编程语言被设计出来以满足多样化的开发需求。C# 和 Java 是两种非常流行且广泛应用于企业级应用开发的编程语言。尽管它们都属于 C 家族的...
【C#与Java对比知识点详解】 C#和Java都是广泛使用的面向对象的编程语言,它们在语法、特性以及设计哲学上有许多相似之处,但也存在显著的差异。以下是一些主要的区别点: 1. **无符号整数**: - C#支持无符号...
总结起来,Java和C#在基本语法、注释风格、数据类型处理和枚举定义上都有自己的特点。Java以其跨平台性闻名,而C#通常与.NET框架紧密关联。选择哪种语言取决于项目需求、团队经验和开发工具支持。了解这些差异有助于...
本书《Professional C#, 3rd Edition》中的附录C针对的是C#与Java开发者的对比,旨在帮助Java开发者快速过渡到C#。尽管C#与Java在语法上有着极高的相似性,但两者之间仍存在着微妙却重要的差异。本章节将深入探讨...