Csharp基础入门

Csharp基础入门

C#的文件后缀是.cs

在一个解决方案中会有N个项目文件夹

在C#中,控制台输出的方式是调用System命名空间中的console类中的WriteLine()方法

System命名空间由.Net提供,有很多程序的基础功能

System.Console.WriteLine();// 在控制台中输出内容
System.Console.ReadLine();// 在控制台中输入内容
System.Console.ReadKey();// 从控制台读取用户输入的一个按键

在Rider中,输出内容的快捷键从sout变成cw了 😊


命名空间概念

在Java中,管理多个类的目录结构是,以package关键字声明

在C#中,管理多个类的目录结构是命名空间,以namespace关键字声明

而在导入的过程中,Java使用import关键字导包

而C#使用using关键字导入命名空间

以类名作为文件名,以命名空间名作为目录结构名


命名规则差异

  1. 类名和接口名
    • C# 中的类名和接口名同样使用大写的首字母(PascalCase),例如:MyClass
    • C# 的类名通常以 .cs 扩展名保存。
  2. 命名空间
    • C# 中的命名空间(Namespace)通常使用大写的首字母,例如:MyCompany.MyApp
    • 命名空间通常反映了公司或产品的名称结构。
  3. 常量名
    • C# 中的常量名通常使用全大写,单词间用下划线分隔,例如:MY_CONSTANT
  4. 字段名
    • 私有字段通常以下划线开头加驼峰命名法,例如:_myField
    • 公共属性(Property)通常使用驼峰命名法,首字母大写,例如:MyProperty
  5. 方法名
    • 在C#中方法名通常使用大写开头的驼峰命名方法,例如:MyMethodName
一些其他差异
  1. 包/命名空间的大小写
    • Java 中的包名通常全部小写,而 C# 中的命名空间可以使用大小写混合。
  2. 文件扩展名
    • Java 文件扩展名为 .java,而 C# 文件扩展名为 .cs
  3. 方法参数
    • 参数名通常使用小写字母开始的驼峰命名法,例如:myParameter

变量

在C#中,var 关键字是一个类型推断关键字,它允许你在声明变量时省略变量的具体类型

编译器会根据变量的初始值自动推断出变量的类型

这使得代码更加简洁,尤其是在类型显而易见的情况下

注:在使用var进行变量声明时,不能不初始化改变量(延迟初始化)

var message = "Hello, World!";  // 类型为 string
var number = 42;               // 类型为 int
var collection = new List<int>();  // 类型为 List<int>

var x;  // 编译错误
x = 10; // 也不能这样写

数据类型

与Java的数据类型基本相同,C#也有基本数据类型与其包装类型

在C# 中多一个decimal类型,他比double的精度更高,更适用于金融类型数据的处理

decimal中文释义:十进制

需要注意的是,在不同的数据进行运算时,会默认进行隐式转换(有低类型到高类型的转换)

nullable(可空类型)

C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值

 int? num1 = null;
 int? num2 = 45;
 double? num3 = new double?();
 double? num4 = 3.14157;
 
 bool? boolval = new bool?();
Null 合并运算符( ?? )

C# 中两个问号的作用是判断??左边的对象是否为 null,如果不为 null 则使用?? 左边的对象,如果为 null 则使用 ?? 右边的对象

num3 = num1 ?? 5.34;
num3 = (num1 == null) ? 5.34 : num1;

string

在C# 中,字符串类是string,而Java是String

与Java相同,C#提供了很多有关于字符串操作的方法,而且这些常用方法的重载十分有用,在合适的场景填写合适的参数


插值字符串

这是C#提供的一个语法糖,其语法为:

var name = "xiaobai";
var str = $"hello, my name is {name}";

Split方法

选用分隔符,对字符串进行分割

var message = "Hello world";
string[] strings = message.Split(" ");

IndexOf方法

输出指定字符在字符串中的索引值

var message = "Hello world";
var indexOf = message.IndexOf(" "); // 5

Join方法

我们可以使用Join方法对字符串数组进行拼接操作

// 示例 1: 使用逗号作为分隔符
string[] fruits = { "Apple", "Banana", "Cherry" };
string result = string.Join(", ", fruits);
Console.WriteLine(result);  // 输出 "Apple, Banana, Cherry"

// 示例 2: 使用换行符作为分隔符
string result2 = string.Join("\n", fruits);
Console.WriteLine(result2);
// 输出
// Apple
// Banana
// Cherry
    
// 示例 3: 使用自定义分隔符
string customSeparator = " | ";
string result3 = string.Join(customSeparator, fruits);
Console.WriteLine(result3);  // 输出 "Apple | Banana | Cherry"

然而,在不同的操作系统中,换行符是不同的,所以我们可以使用System.Enviroment提供的只读属性(并非一个方法)NewLine来作为换行符使用

string result2 = string.Join(Environment.NewLine, fruits);

路径拼接

在开发过程中,我们需要对文件路径的字符串变量进行路径拼接,而在不同系统情况下,路径拼接的连接符是不一样的

为了解决这个问题,我们使用Path.Combine方法进行路径拼接

var dir1 = "Folder";
var dir2 = "SubFolder";
var fn = "readme.md";

Path.Combine(dir1,dir2,fn);

构造函数

通过构造函数,填写指定的参数可以实现一些意想不到的功能

string sep = new string("=" , 20); // 打印20个=以完成换行符功能

char[] chars = ['h','e','l','l','o'];
string str = new string(chars); // 以字符数组作为参数可实现字符串的拼接

字符串比较
string message1 = "hellow world!";
string message2 = "hellow world?";

message1.CompareTo(message2); // 比较出大小,判断ASCII码
message1.Equals(message2); // 单纯判断是否相等,性能更好