C#语法代码片段

151 阅读6分钟

C#语法代码片段

基础语法

 Console.WriteLine(123);

输出,基础阶段最常用,伴随编程终生。

 var a = Console.Read();
 Console.WriteLine(a);

可以输入很多字符,单只取第一个字符。类型是int。

 var a = Console.ReadKey();
 Console.WriteLine(a);
 Console.WriteLine(a.Key);
 Console.WriteLine(a.Modifiers);
 Console.WriteLine(a.KeyChar);

第一个字符就结束,只读取一个字符。重点是获取按键信息。

 var a = Console.ReadLine();
 Console.WriteLine(a);

读一行数据,作为字符串。

数据类型

C#的所有类型其实是标识符,对应.net平台的类型。变量的两种类型:值类型和引用类型。

整型

 Console.WriteLine(byte.MaxValue);
 Console.WriteLine(byte.MinValue);
 255
 0

1个字节,一般做缓存数组。

 Console.WriteLine(short.MaxValue);
 Console.WriteLine(short.MinValue);
 32767
 -32768

2个字节,很少用。

 Console.WriteLine(int.MaxValue);
 Console.WriteLine(int.MinValue);
 2147483647
 -2147483648

4个字节,最常用的,整数默认类型。

 Console.WriteLine(long.MaxValue);
 Console.WriteLine(long.MinValue);
 9223372036854775807
 -9223372036854775808

8个字节,工作中作为id的类型,因为数据很多。

Console.WriteLine(ulong.MaxValue);
Console.WriteLine(ulong.MinValue);
18446744073709551615
0

如果要大整数,无符号long更合适,不过项目就没有用到了。

还有对应的无符号类型,这里就不考虑了。

浮点数

三种浮点数类型,区别就是精度,还有空间大小。

Console.WriteLine(float.MaxValue);
Console.WriteLine(float.MinValue);
3.4028235E+38
-3.4028235E+38

32位float浮点数,很少用,精度不够。

Console.WriteLine(double.MaxValue);
Console.WriteLine(double.MinValue);
1.7976931348623157E+308
-1.7976931348623157E+308

64位double双精度浮点数,默认类型,一般浮点数很常用,但还是有精度损失。项目中没见到。

Console.WriteLine(Decimal.MaxValue);
Console.WriteLine(Decimal.MinValue);
79228162514264337593543950335
-79228162514264337593543950335

128位高精度浮点数,非常猛,金融计算必备。

bool

Console.WriteLine(bool.TrueString);
Console.WriteLine(bool.FalseString);
True
False

就是很经典的取值。

Console.WriteLine(string.IsNullOrEmpty(""));

字符串有判断方法,很常用,不要在手动比较字符串了。

char

Console.WriteLine((int)'1');
49

字符也是int类型。

Console.WriteLine((int)'王');
29579

utf8编码集,支持汉字。

还有很多转义字符,但一般String有提供专门的方法或语法糖,不用手动操作char。

日期

时间的处理有点复杂了,而且用的很多。

(1). DateTime:表示日期和时间。

(2). DateTimeOffset:表示日期和时间值,以及指示此值与 UTC 的偏移量。UTC 一般指协调世界时。 又称世界统一时间、世界标准时间、国际协调时间。

(3). TimeSpan:表示时间间隔。

(4). TimeZoneInfo:表示地球上的任何时区。

找区别。

Console.WriteLine(DateTime.Now);
Console.WriteLine(DateTime.Now.Date);
Console.WriteLine(DateTime.Now.Year);
Console.WriteLine(DateTime.Now.Month);
Console.WriteLine(DateTime.Now.Day);
Console.WriteLine(DateTime.Now.Hour);
Console.WriteLine(DateTime.Now.Minute);
Console.WriteLine(DateTime.Now.Second);
2024/01/25 22:32:25
2024/01/25 0:00:00
2024
1
25
22
32
25

当前时间的各个部分。

Console.WriteLine(DateTime.Now);
Console.WriteLine(DateTime.Now.DayOfWeek);
Console.WriteLine(DateTime.Now.DayOfYear);
Console.WriteLine(DateTime.Now.TimeOfDay);
Console.WriteLine(DateTime.Now.ToFileTime());
2024/01/25 22:34:31
Thursday
25
22:34:31.4013393
133506668714020736

有现实意义的取值,比较实用,但工作中不够用,需要手动扩展工具类。

Console.WriteLine(new DateTime(2022, 2, 2));
Console.WriteLine(new DateTime(2022, 2, 2, 2, 2, 2));
Console.WriteLine(new DateTime(2022, 2, 2, 2, 2, 2, 2));
Console.WriteLine(new DateTime(2022, 2, 2, 2, 2, 2, 2, 2));
2022/02/02 0:00:00
2022/02/02 2:02:02
2022/02/02 2:02:02
2022/02/02 2:02:02

自定义时间,有更高的精度,但默认输出字符串就这样,获取时间戳时会有意义。

Console.WriteLine(DateTime.Now);
Console.WriteLine(DateTime.Now.AddYears(1));
Console.WriteLine(DateTime.Now.AddMonths(1));
Console.WriteLine(DateTime.Now.AddDays(1));
Console.WriteLine(DateTime.Now.AddHours(1));
Console.WriteLine(DateTime.Now.AddMinutes(1));
Console.WriteLine(DateTime.Now.AddSeconds(1));
2025/01/25 22:40:36
2024/02/25 22:40:36
2024/01/26 22:40:36
2024/01/25 23:40:36
2024/01/25 22:41:36
2024/01/25 22:40:37

在当前时间基础上添加增量,可以用来设置过期时间。

Console.WriteLine(TimeSpan.Zero);
Console.WriteLine(TimeSpan.MaxValue);
Console.WriteLine(TimeSpan.MinValue);
00:00:00
10675199.02:48:05.4775807
-10675199.02:48:05.4775808

时间间隔,时间片段。

Console.WriteLine(new TimeSpan(1, 1, 1));
Console.WriteLine(new TimeSpan(1, 1, 1, 1));
01:01:01
1.01:01:01

天时分秒,这是时间片段,可以定义一些常用的时间片段,当然datetimeoffset已经提供了相关方法。C#的方法有很多冗余,但可以保证每个工具库使用的时候可以独立支持一系列功能,这也是有道理的,规模确实比Java大很多。

var timeSpan = new TimeSpan(1, 1, 1, 1);
Console.WriteLine(timeSpan.Days);
Console.WriteLine(timeSpan.Hours);
Console.WriteLine(timeSpan.Minutes);
Console.WriteLine(timeSpan.Seconds);
1
1
1
1

获取单个元素,都是get方法。

var timeSpan = new TimeSpan(1, 1, 1, 1);
Console.WriteLine(timeSpan.TotalDays);
Console.WriteLine(timeSpan.TotalHours);
Console.WriteLine(timeSpan.TotalMinutes);
Console.WriteLine(timeSpan.TotalSeconds);
1.042372685185185
25.016944444444444
1501.0166666666667
90061

转换统计单位,这个方法好,很实用。

Console.WriteLine(TimeSpan.FromDays(1));
Console.WriteLine(TimeSpan.FromHours(1));
Console.WriteLine(TimeSpan.FromMinutes(1));
Console.WriteLine(TimeSpan.FromSeconds(1));
1.00:00:00
01:00:00
00:01:00
00:00:01

从当前时间设置时间片段,很规整的时间。

TimeSpan timeSpan = new TimeSpan(1, 1, 1, 1);
Console.WriteLine(timeSpan.Add(TimeSpan.FromDays(1)));
Console.WriteLine(timeSpan.Add(TimeSpan.FromHours(1)));
Console.WriteLine(timeSpan.Add(TimeSpan.FromMinutes(1)));
Console.WriteLine(timeSpan.Add(TimeSpan.FromSeconds(1)));
2.01:01:01
1.02:01:01
1.01:02:01
1.01:01:02

指定时间设置时间片段。

Console.WriteLine(DateTimeOffset.Now);
Console.WriteLine(DateTimeOffset.UtcNow);
2024/01/25 23:45:20 +08:00
2024/01/25 15:45:20 +00:00

同一个时间,不同的时区。一般默认取本地时区。

DateTimeOffset dateTimeOffset = DateTimeOffset.Now;
Console.WriteLine(dateTimeOffset.Date);
Console.WriteLine(dateTimeOffset.Year);
Console.WriteLine(dateTimeOffset.Month);
Console.WriteLine(dateTimeOffset.Day);
Console.WriteLine(dateTimeOffset.Hour);
Console.WriteLine(dateTimeOffset.Minute);
Console.WriteLine(dateTimeOffset.Second);
2024/01/25 0:00:00
2024
1
25
23
47
53

获取每个部分,和DateTime基本一致。

DateTimeOffset dateTimeOffset = DateTimeOffset.Now;
Console.WriteLine(dateTimeOffset.DayOfWeek);
Console.WriteLine(dateTimeOffset.DayOfYear);
Console.WriteLine(dateTimeOffset.TimeOfDay);
Console.WriteLine(dateTimeOffset.TotalOffsetMinutes);
Thursday
25
23:49:02.8434596
480

常用的计算,很实用。

Console.WriteLine(new DateTimeOffset(2022, 2, 2, 2, 2, 2, TimeSpan.Zero));
2022/02/02 2:02:02 +00:00

构造函数,需要手动指定偏移量。

Console.WriteLine(TimeZoneInfo.Utc);
Console.WriteLine(TimeZoneInfo.Local);
(UTC) 协调世界时
(UTC+08:00) 北京,重庆,香港特别行政区,乌鲁木齐

时区。

DateTimeOffset dateTimeOffset = DateTimeOffset.Now;
Console.WriteLine(dateTimeOffset);
var date = TimeZoneInfo.ConvertTime(dateTimeOffset,TimeZoneInfo.Utc);
Console.WriteLine(date);
2024/01/26 0:01:31 +08:00
2024/01/25 16:01:31 +00:00

转换时区。

日期时间基本就结束了,这些有很大的重合,足够用,不过时间比较的方法需要手动扩展。在工作中时间是必不可少的。

本地整型

Console.WriteLine(nint.MaxValue);
Console.WriteLine(nint.MinValue);
Console.WriteLine(long.MaxValue);
Console.WriteLine(long.MinValue);
9223372036854775807
-9223372036854775808
9223372036854775807
-9223372036854775808

会自动适应本地的环境,调整大小。默认是long。

nint a = 11;
Console.WriteLine(a.ToInt32().GetType());
Console.WriteLine(a.ToInt64().GetType());
System.Int32
System.Int64

可以转为long或int。

可空类型

int? a = null;
Console.WriteLine(a);

加?设置为可选参数,允许为空。

bool? a = null;
Console.WriteLine(a);

bool也支持第三种结果:null。

bool? a = null;
Console.WriteLine(a == null);
Console.WriteLine(a is null);
bool? a = null;
Console.WriteLine(a != null);
Console.WriteLine(a is not null);

is属于标识符,很好用。

bool? a = null;
Console.WriteLine(a.HasValue);
False

判断是否为null的一种标志。

int? a = 1;
if (a.HasValue)
{
    Console.WriteLine(a);
}

可以做非空判断。