抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

更深入学习了数据类型的相关知识

数据范围

可使用int.MinValueint.MaxValue来获取int类型的数据范围。

1
2
3
4
5
几种基础整型范围
sbyte : -128 to 127
short : -32768 to 32767
int : -2147483648 to 2147483647
long : -9223372036854775808 to 9223372036854775807
1
2
3
4
5
无符号整型范围
byte : 0 to 255
ushort : 0 to 65535
uint : 0 to 4294967295
ulong : 0 to 18446744073709551615
1
2
3
4
浮点数范围:
float : -3.402823E+38 to 3.402823E+38
double : -1.79769313486232E+308 to 1.79769313486232E+308
decimal: -79228162514264337593543950335 to 79228162514264337593543950335

decimal会比double占用更多的内存空间,但计算小数更精准,不会出现精度丢失,适合用于金融计算等应用。

float 和 double 值在内部以二进制 (base 2) 格式存储,而 decimal 以十进制 (base 10) 格式存储。

decimal的底层实现方式后面再开个博文氵一下。

引用类型

个人理解

也就是说int[] data只是创建了一个指针?它并没有指向任何存储有数据的内存空间。

后面的new才是分配一个存储空间,并且同时让data指向这个空间。

所以如果创建了一个空引用,它是没有大小的。

Console.Write(data.Length); 会直接编译失败,因为它是空的,并不会返回0。


个人理解

实际上int[] data ={1,2,3};也可以

可能也是系统开辟了一个存储{1,2,3}的内存空间,然后再让data指向它。

类型转换

数字转成string

1
2
int num = 1;
string str = a.ToString();

每个数据类型都有ToString()方法。

string转成数字

Parse()
1
2
string str = "5";
int num = int.Parse(first);

大部分数字数据类型都有Parse()方法。

比起Parse()更推荐使用TryParse()


TryParse()

TryParse()可同时执行多项操作

  • 它会尝试将字符串分析成给定的数字数据类型
  • 如果成功,它会将转换后的值存储在out参数中
  • 它将返回bool,指示操作是成功还是失败
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
string legalValue = "520";
string illegalValue = "52Y";

int result = 0;

if (int.TryParse(legalValue, out result))
{
Console.WriteLine($"转换成功!值为{result},类型为{result.GetType()}");
}
else Console.WriteLine("转换失败!");

if (int.TryParse(illegalValue, out result))
{
Console.WriteLine($"转换成功!值为{result},类型为{result.GetType()}");
}
else Console.WriteLine("转换失败!");

------
output:
转换成功!值为520,类型为System.Int32
转换失败!

Covert类

还可以使用Convert类中的方法将string转成int

1
2
string value1 = "5";
int res = Convert.ToInt32(value1);

强制类型转换

在需要转换的变量前用括号把目的类型标记一下(跟C一样)。

1
2
double xFloat = 1.2;
int xInt = (int)xFloat;

数组

排序

Array.Sort(pallets)

底层实现发现用了叫IntrospectiveSort(内省排序)的排序方法。

特点:

  • 如果划分的大小小于16个元素,对该划分使用插入排序
  • 如果划分的大小超过2LogN, N是数组长度,那么就使用堆排序
  • 如果划分的大小介于两者之间,则在该划分上继续使用快速排序

避免了数据量小时用快排杀鸡用牛刀,数据量大时快排递归层数深,最坏情况时间复杂度会到O(n^2)

(找个时间手搓实现一遍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string[] pallets = { "B14", "A11", "B12", "A13" };

Console.WriteLine("已排序...");
Array.Sort(pallets);
foreach (var pallet in pallets)
{
Console.WriteLine($"-- {pallet}");
}

------
output:
已排序...
-- A11
-- A13
-- B12
-- B14

反转

反转来了

Array.Reverse(pallets)

反转数组中的元素。

删除

Array.Clear(pallets, 0, 2);

表示删除从索引0开始的两个元素。

删除并不是释放内存空间,而是把这块区域标成null,此时pallets[0]仍然能正常访问。


sad,这样不是很损失性能?可能List能删除元素吧?

调整大小

Array.Resize(ref pallets, 6);

将数组大小调整至6个元素。

此时将调过引用(使用ref关字)传入pallets数组的Resize()方法。在某些情况下,方法会要求按值(默认)或按引用(使ref关字)来传递参数。要解释此操作的必要性,需花时间详细阐释.NET中对象的管理方式。很遗憾,这超出了本模块的范围。如果有疑问,建议查看IntellisenseMicrosoftDocs,获取有关如何正确调用给定方法的示例。

呃呃,还要我自己去查ref什么意思。

传入引用?是我理解的那个C++的引用吗?

评论