1. C#语言基础
1.1 C#语法概览
欢迎来到C#的世界!对于刚从Java转过来的开发者来说,你会发现C#和Java有很多相似之处,但C#也有其独特的魅力和强大之处。让我们一起来探索C#的基本语法,并比较一下与Java的异同。
程序结构
C#程序的基本结构与Java非常相似。这里是一个简单的C#程序:
using System;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
}
对比Java的版本:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
你会发现,两者的结构非常相似。主要的区别在于:
C#使用 using
关键字导入命名空间,而Java使用import
。C#的 Main
方法是static void Main(string[] args)
,而Java是public static void main(String[] args)
。C#使用 Console.WriteLine()
输出,Java使用System.out.println()
。
在c# 9的最新语法上还可以更简洁,是的没错,只需要一行代码,不需要写命名空间,类,方法,直接编写代码,当然这个方式只存在c#9以上的版本。
Console.WriteLine("Hello, World!");
命名约定
C#和Java的命名约定有些许不同:
C#中,方法名和属性名通常使用PascalCase(如 CalculateTotal
)。局部变量和参数使用camelCase(如 totalAmount
)。接口名称以"I"开头(如 IDisposable
)。
而Java中:
方法名和变量名都使用camelCase。 接口名称不需要特殊前缀。
数据类型
C#和Java的基本数据类型很相似,但也有一些区别:
C#:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
decimal m = 100.50m;
bool isTrue = true;
char c = 'A';
string s = "Hello";
Java:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
boolean isTrue = true;
char c = 'A';
String s = "Hello";
注意C#特有的decimal
类型,它提供了更高精度的小数计算,特别适合金融相关的应用。
数组
C#和Java的数组声明稍有不同:
C#:
int[] numbers = new int[5];
string[] names = { "Alice", "Bob", "Charlie" };
Java:
int[] numbers = new int[5];
String[] names = { "Alice", "Bob", "Charlie" };
控制结构
C#和Java的控制结构几乎完全相同:
// if语句
if (condition)
{
// code
}
else if (anotherCondition)
{
// code
}
else
{
// code
}
// for循环
for (int i = 0; i < 10; i++)
{
// code
}
// while循环
while (condition)
{
// code
}
// switch语句
switch (variable)
{
case value1:
// code
break;
case value2:
// code
break;
default:
// code
break;
}
这些结构在Java中的写法完全相同。
异常处理
C#和Java的异常处理也非常相似:
C#:
try
{
// 可能抛出异常的代码
}
catch (SpecificException ex)
{
// 处理特定异常
}
catch (Exception ex)
{
// 处理一般异常
}
finally
{
// 总是要执行的代码
}
Java的异常处理结构完全相同。
注释
C#和Java的注释方式也是一样的:
// 这是单行注释
/*
* 这是多行注释
*/
/// <summary>
/// 这是XML文档注释,类似于Java的Javadoc
/// </summary>
小结
通过这个概览,你可以看到C#和Java在语法上有很多相似之处。这意味着作为一个Java开发者,你可以相对轻松地过渡到C#。然而,C#也有其独特的特性和语法糖,使得某些任务更加简洁和高效。
在接下来的章节中,我们将深入探讨C#的各个方面,包括它独特的特性如属性、事件、委托等。这些概念可能对Java开发者来说比较新,但它们是C#强大功能的关键所在。记住,学习一门新的语言不仅是学习语法,更是学习一种新的思维方式。让我们继续我们的C#学习之旅吧!
1.2 变量和数据类型
在C#中,变量和数据类型是编程的基础。对于从Java转过来的开发者来说,你会发现很多熟悉的概念,但C#也有一些独特的特性。让我们深入探讨C#的变量和数据类型,并与Java进行比较。
变量声明
C#和Java的变量声明方式非常相似:
C#:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
0
Java:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
1
主要区别在于:
C#使用 string
(小写),而Java使用String
(大写)。C#使用 bool
,而Java使用boolean
。
基本数据类型
C#和Java都有类似的基本数据类型,但C#提供了更多的选择:
C# 类型 | Java 类型 | 大小 | 范围 |
---|---|---|---|
sbyte | byte | 8位 | -128 到 127 |
byte | - | 8位 | 0 到 255 |
short | short | 16位 | -32,768 到 32,767 |
ushort | - | 16位 | 0 到 65,535 |
int | int | 32位 | -2^31 到 2^31-1 |
uint | - | 32位 | 0 到 2^32-1 |
long | long | 64位 | -2^63 到 2^63-1 |
ulong | - | 64位 | 0 到 2^64-1 |
float | float | 32位 | ±1.5x 10^-45 到 ±3.4 x 10^38 |
double | double | 64位 | ±5.0 × 10^-324 到 ±1.7 × 10^308 |
decimal | - | 128位 | ±1.0 x 10^-28 到 ±7.9 x 10^28 |
char | char | 16位 | U+0000 到 U+FFFF |
bool | boolean | 8位 | true或 false |
注意C#提供了无符号整数类型(byte
, ushort
, uint
, ulong
)和decimal
类型,这些在Java中是没有的。
值类型和引用类型
C#和Java都区分值类型和引用类型,但C#的处理更加灵活:
值类型(Value Types):
在C#中,所有的基本数据类型(int, float, bool等)和struct都是值类型。 值类型直接存储它们的数据。
引用类型(Reference Types):
类(class)、接口(interface)、委托(delegate)和数组(array)是引用类型。 引用类型存储对其数据(对象)的引用。
C#独特之处:
C#允许使用 struct
关键字创建自定义值类型。C#的 string
虽然是引用类型,但具有值类型的一些特性(如不可变性)。
可空类型
C#引入了可空类型的概念,这在Java中是没有的:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
2
可空类型允许值类型也可以赋值为null
,这在处理数据库或用户输入时非常有用。
var关键字
C#提供了var
关键字用于隐式类型声明:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
3
Java从Java 10开始引入了类似的var
关键字,但使用范围更受限制。
常量
C#使用const
关键字声明常量:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
4
Java使用final
关键字:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
5
枚举
C#和Java都支持枚举,但C#的枚举更加灵活:
C#:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
6
Java:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
7
C#的枚举可以指定底层类型,而Java的枚举实际上是特殊的类。
类型转换
C#提供了多种类型转换方法:
隐式转换:
public class HelloWorld {
8
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}显式转换(强制类型转换):
public class HelloWorld {
9
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}使用Convert类:
Console.WriteLine("Hello, World!");
0使用Parse方法:
Console.WriteLine("Hello, World!");
1TryParse方法(安全转换):
Console.WriteLine("Hello, World!");
2
Java的类型转换相对简单一些,主要依赖于强制类型转换和包装类的方法。
小结
虽然C#和Java在变量和数据类型方面有很多相似之处,但C#提供了更多的选择和灵活性。C#的可空类型、更丰富的基本数据类型、更灵活的枚举和方便的类型转换方法,都为开发者提供了更多的工具来处理各种数据场景。
作为一个从Java转向C#的开发者,你会发现这些额外的特性可以让你的代码更加简洁和表达力更强。在实际编程中,合理利用这些特性可以提高代码的可读性和性能。
在接下来的学习中,我们将深入探讨C#的更多高级特性,如属性、索引器、泛型等。这些概念将进一步展示C#相对于Java的独特优势。继续保持学习的热情,你会发现C#是一个功能丰富、富有表现力的语言!
1.3 运算符和表达式
C#的运算符和表达式与Java有很多相似之处,但也有一些独特的特性。让我们深入了解C#的运算符和表达式,并与Java进行比较。
算术运算符
C#和Java的算术运算符基本相同:
加法 (+) 减法 (-) 乘法 (*) 除法 (/) 取模 (%)
示例:
Console.WriteLine("Hello, World!");
3
注意:C#和Java在整数除法时都会舍去小数部分,如果要得到精确结果,至少有一个操作数应该是浮点数。
赋值运算符
C#和Java的赋值运算符也基本相同:
简单赋值 (=) 复合赋值 (+=, -=, *=, /=, %=)
C#特有的复合赋值运算符:
??= (空合并赋值运算符,C# 8.0引入)
示例:
Console.WriteLine("Hello, World!");
4
比较运算符
C#和Java的比较运算符完全相同:
等于 ==
不等于 !=
大于 >
小于 <
大于等于 >=
小于等于 <=
示例:
Console.WriteLine("Hello, World!");
5
逻辑运算符
C#和Java的逻辑运算符也是相同的:
逻辑与 (&&) 逻辑或 (||) 逻辑非 (!)
示例:
Console.WriteLine("Hello, World!");
6
位运算符
C#和Java的位运算符也基本相同:
按位与 &
按位或 |
按位异或 ^
按位取反 ~
左移 <<
右移 >>
C#特有的位运算符:
无符号右移 (>>>)
示例:
Console.WriteLine("Hello, World!");
7
条件运算符
C#和Java都有三元条件运算符:
Console.WriteLine("Hello, World!");
8
C#特有的条件运算符:
空合并运算符 (??) 空条件运算符(?.)
示例:
Console.WriteLine("Hello, World!");
9
类型测试运算符
C#提供了一些Java中没有的类型测试运算符:
is 运算符:检查对象是否与特定类型兼容 as 运算符:执行类型转换,如果转换失败,返回null
示例:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
decimal m = 100.50m;
bool isTrue = true;
char c = 'A';
string s = "Hello";
0
Lambda 表达式
C#和Java都支持Lambda表达式,但语法略有不同:
C#:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
decimal m = 100.50m;
bool isTrue = true;
char c = 'A';
string s = "Hello";
1
Java:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
decimal m = 100.50m;
bool isTrue = true;
char c = 'A';
string s = "Hello";
2
空合并运算符(??)
C#特有的空合并运算符可以简化处理可能为null的情况:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
decimal m = 100.50m;
bool isTrue = true;
char c = 'A';
string s = "Hello";
3
在Java中,你可能需要这样写:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
decimal m = 100.50m;
bool isTrue = true;
char c = 'A';
string s = "Hello";
4
表达式体成员 (Expression-bodied members)
C#允许使用更简洁的语法来定义属性和方法:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
decimal m = 100.50m;
bool isTrue = true;
char c = 'A';
string s = "Hello";
5
这种语法在Java中是不存在的。
字符串插值
C#提供了非常方便的字符串插值语法:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
decimal m = 100.50m;
bool isTrue = true;
char c = 'A';
string s = "Hello";
6
Java在较新的版本中也引入了类似的功能,但语法不同:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
decimal m = 100.50m;
bool isTrue = true;
char c = 'A';
string s = "Hello";
7
小结
虽然C#和Java在运算符和表达式方面有很多相似之处,但C#提供了一些额外的特性,如空合并运算符、空条件运算符、表达式体成员等,这些可以让代码更加简洁和表达力更强。
作为一个从Java转向C#的开发者,你会发现这些额外的特性可以让你的代码更加优雅和易读。在实际编程中,合理利用这些特性可以提高代码质量和开发效率。
在接下来的学习中,我们将深入探讨C#的更多高级特性,如LINQ、异步编程等。这些概念将进一步展示C#相对于Java的独特优势。继续保持学习的热情,你会发现C#是一个功能丰富、表达力强的语言!
1.4 控制流语句
控制流语句是编程语言的基本构建块,用于控制程序的执行路径。C#和Java在这方面非常相似,但C#也有一些独特的特性。让我们深入了解C#的控制流语句,并与Java进行比较。
if-else 语句
C#和Java的if-else语句几乎完全相同:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
decimal m = 100.50m;
bool isTrue = true;
char c = 'A';
string s = "Hello";
8
C#特有的特性:
可空类型的使用:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
decimal m = 100.50m;
bool isTrue = true;
char c = 'A';
string s = "Hello";
9
模式匹配(C# 7.0+):
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
boolean isTrue = true;
char c = 'A';
String s = "Hello";
0
switch 语句
C#的switch语句比Java的更加灵活:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
boolean isTrue = true;
char c = 'A';
String s = "Hello";
1
C#特有的特性:
模式匹配(C# 7.0+):
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
boolean isTrue = true;
char c = 'A';
String s = "Hello";
2
switch 表达式(C# 8.0+):
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
boolean isTrue = true;
char c = 'A';
String s = "Hello";
3
循环语句
C#和Java的循环语句非常相似:
for循环:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
boolean isTrue = true;
char c = 'A';
String s = "Hello";
4
while 循环:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
boolean isTrue = true;
char c = 'A';
String s = "Hello";
5
do-while 循环:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
boolean isTrue = true;
char c = 'A';
String s = "Hello";
6
foreach 循环:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
boolean isTrue = true;
char c = 'A';
String s = "Hello";
7
C#特有的特性:
LINQ与foreach的结合:
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
boolean isTrue = true;
char c = 'A';
String s = "Hello";
8
跳转语句
C#和Java都支持以下跳转语句:
break:跳出当前循环或switch语句 continue:跳过当前循环的剩余部分,开始下一次迭代 return:从方法中返回,并可选择返回一个值
C#特有的跳转语句:
goto:虽然不推荐使用,但C#保留了goto语句
int x = 10;
long y = 100L;
float f = 3.14f;
double d = 3.14;
boolean isTrue = true;
char c = 'A';
String s = "Hello";
9
异常处理
C#和Java的异常处理机制非常相似:
int[] numbers = new int[5];
string[] names = { "Alice", "Bob", "Charlie" };
0
C#特有的特性:
异常过滤器(C# 6.0+):
int[] numbers = new int[5];
string[] names = { "Alice", "Bob", "Charlie" };
1
using 语句(简化资源管理):
int[] numbers = new int[5];
string[] names = { "Alice", "Bob", "Charlie" };
2
using 声明(C# 8.0+):
int[] numbers = new int[5];
string[] names = { "Alice", "Bob", "Charlie" };
3
小结
虽然C#和Java在控制流语句方面有很多相似之处,但C#提供了一些额外的特性,如模式匹配、switch表达式、异常过滤器等,这些可以让代码更加简洁和表达力更强。
作为一个从Java转向C#的开发者,你会发现这些额外的特性可以让你的代码更加优雅和易读。特别是模式匹配和switch表达式,它们可以大大简化复杂的条件逻辑。
在实际编程中,合理利用这些特性可以提高代码质量和开发效率。例如,使用模式匹配可以使类型检查和转换更加简洁,使用switch表达式可以使复杂的条件判断更加清晰。
在接下来的学习中,我们将深入探讨C#的更多高级特性,如LINQ、异步编程等。这些概念将进一步展示C#相对于Java的独特优势。继续保持学习的热情,你会发现C#是一个功能丰富、表达力强的语言!
1.5 方法和参数
方法(在Java中称为函数)是编程中最基本的代码组织单元。C#和Java在方法定义和使用上有很多相似之处,但C#提供了一些额外的特性,使得方法定义和调用更加灵活。让我们深入探讨C#的方法和参数,并与Java进行比较。
方法定义
C#和Java的基本方法定义非常相似:
int[] numbers = new int[5];
string[] names = { "Alice", "Bob", "Charlie" };
4
Java中的等效代码:
int[] numbers = new int[5];
string[] names = { "Alice", "Bob", "Charlie" };
5
主要区别:
C#方法名通常使用PascalCase,而Java使用camelCase。 C#支持方法重载,Java也支持。
参数传递
C#和Java都支持值传递和引用传递,但C#提供了更多选项:
值参数(默认):
int[] numbers = new int[5];
string[] names = { "Alice", "Bob", "Charlie" };
6
引用参数(ref 关键字):
int[] numbers = new int[5];
string[] names = { "Alice", "Bob", "Charlie" };
7
Java没有直接等效的引用参数,但可以通过包装类或数组实现类似效果。
输出参数(out 关键字):
int[] numbers = new int[5];
string[] names = { "Alice", "Bob", "Charlie" };
8
Java没有直接等效的输出参数。
参数数组(params 关键字):
int[] numbers = new int[5];
string[] names = { "Alice", "Bob", "Charlie" };
9
Java使用可变参数(varargs)实现类似功能:
int[] numbers = new int[5];
String[] names = { "Alice", "Bob", "Charlie" };
0
方法重载
C#和Java都支持方法重载,允许在同一个类中定义多个同名但参数列表不同的方法:
int[] numbers = new int[5];
String[] names = { "Alice", "Bob", "Charlie" };
1
Java的方法重载与C#基本相同。
可选参数
C#支持可选参数,这在Java中直到最近才引入:
int[] numbers = new int[5];
String[] names = { "Alice", "Bob", "Charlie" };
2
在Java中,你通常需要使用方法重载来实现类似功能:
int[] numbers = new int[5];
String[] names = { "Alice", "Bob", "Charlie" };
3
命名参数
C#支持命名参数,可以提高代码的可读性:
int[] numbers = new int[5];
String[] names = { "Alice", "Bob", "Charlie" };
4
Java不支持命名参数,但可以使用建造者模式来实现类似的效果。
表达式体方法
C# 6.0引入了表达式体方法,可以使简单方法的定义更加简洁:
int[] numbers = new int[5];
String[] names = { "Alice", "Bob", "Charlie" };
5
Java不支持这种语法糖。
本地函数
C# 7.0引入了本地函数,允许在方法内定义函数:
int[] numbers = new int[5];
String[] names = { "Alice", "Bob", "Charlie" };
6
Java不直接支持本地函数,但可以使用匿名内部类或lambda表达式来实现类似功能。
异步方法
C#对异步编程的支持非常强大,使用async和await关键字:
int[] numbers = new int[5];
String[] names = { "Alice", "Bob", "Charlie" };
7
Java也支持异步编程,但语法和使用方式与C#不同,通常使用CompletableFuture:
int[] numbers = new int[5];
String[] names = { "Alice", "Bob", "Charlie" };
8
扩展方法
C#允许你为现有类型添加新方法,而不需要修改原始类型的定义:
int[] numbers = new int[5];
String[] names = { "Alice", "Bob", "Charlie" };
9
Java不支持扩展方法,但可以使用静态工具类来实现类似功能。
泛型方法
C#和Java都支持泛型方法,允许你编写可以处理多种类型的方法:
// if语句
if (condition)
{
// code
}
else if (anotherCondition)
{
// code
}
else
{
// code
}
// for循环
for (int i = 0; i < 10; i++)
{
// code
}
// while循环
while (condition)
{
// code
}
// switch语句
switch (variable)
{
case value1:
// code
break;
case value2:
// code
break;
default:
// code
break;
}
0
Java的泛型方法语法略有不同:
// if语句
if (condition)
{
// code
}
else if (anotherCondition)
{
// code
}
else
{
// code
}
// for循环
for (int i = 0; i < 10; i++)
{
// code
}
// while循环
while (condition)
{
// code
}
// switch语句
switch (variable)
{
case value1:
// code
break;
case value2:
// code
break;
default:
// code
break;
}
1
方法组合与函数式编程
C#对函数式编程有很好的支持,可以轻松组合和传递方法:
// if语句
if (condition)
{
// code
}
else if (anotherCondition)
{
// code
}
else
{
// code
}
// for循环
for (int i = 0; i < 10; i++)
{
// code
}
// while循环
while (condition)
{
// code
}
// switch语句
switch (variable)
{
case value1:
// code
break;
case value2:
// code
break;
default:
// code
break;
}
2
Java也支持函数式编程,但语法略有不同:
// if语句
if (condition)
{
// code
}
else if (anotherCondition)
{
// code
}
else
{
// code
}
// for循环
for (int i = 0; i < 10; i++)
{
// code
}
// while循环
while (condition)
{
// code
}
// switch语句
switch (variable)
{
case value1:
// code
break;
case value2:
// code
break;
default:
// code
break;
}
3
小结
虽然C#和Java在方法和参数的基本概念上很相似,但C#提供了更多的特性和灵活性。C#的引用参数、输出参数、命名参数、可选参数等特性可以让方法定义和调用更加灵活和清晰。此外,C#的异步方法、扩展方法和表达式体方法等特性可以让代码更加简洁和易读。
作为一个从Java转向C#的开发者,你会发现这些额外的特性可以大大提高你的编程效率和代码质量。例如,命名参数和可选参数可以减少方法重载的需求,扩展方法可以让你更容易地扩展现有类型的功能,而async/await则可以大大简化异步编程的复杂性。
在实际编程中,合理利用这些特性可以让你的代码更加清晰、简洁和易于维护。例如,使用命名参数可以提高代码的可读性,使用扩展方法可以使你的代码更加模块化,而使用异步方法可以提高应用程序的响应性。
随着你对C#的深入学习,你会发现更多强大的特性和用法。保持学习和实践的热情,你将能够充分利用C#的强大功能,成为一个高效的.NET开发者!
Java失业者转.NET开发交流群:157210263
博客详细文章站点 http://token-ai.cn/
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...