UWP 开发初阶 Chapter 9
in 初阶
上篇回顾
上篇简单介绍了一下 ListView
以及它的妙用,这也为我们接下来马上就要讲到的 DataBinding
即数据绑定打下基础。下次讲到数据绑定,我们会在 ListView
的基础上进行探索。
本篇正文
前言
本篇文章将简单给大家讲述一下 C# 中几种常用容器,比如 List
,ArrayList
,Array
,ObservableCollection
,Dictionary
以及 Hashtable
。本篇是为了给还未深入接触 C# 的朋友准备的,如果你觉得已经熟知这些,可以直接跳过本篇,节省时间。
Array
对于有一定编程基础的朋友 数组 肯定是不会陌生的。C# 的 Array
就类似于 Java 中的 Array
或是 C++ 中的 Array
。请看下面的代码演示:
//初始化了一个长度为 4 的 Array
string[] strArray = new string[4];
//将两串字符串分别储存在 0 和 1 的位置
strArray[0] = "hello";
strArray[1] = "world";
//将数据从 Array 中取出
string str1 = strArray[0]; //输出结果:"hello"
string str2 = strArray[1]; //输出结果:"world"
解释: Array
初始化的时候必须明确告诉编译器,这个 Array
的长度为多少。
ArrayList
由于 Array
必须在初始化的时候设定长度,并且长度在初始化过后是固定的(其实严格来讲并不是),所以在很多场景下使用有一定的局限性,这时候 ArrayList
出现了!ArrayList
有点类似于 Java 中的 ArrayList
和 C++ 中的 Vector
, 区别在于 C# 的 ArrayList
是以 Object
形式存放数据的,而 Java 中的 ArrayList
和 C++ 中的 Vector
是存放你指定类型的。简而言之,也就是 C# 中的 ArrayList
啥都可以放!详细,见下面代码:
//初始化一个 ArrayList
ArrayList arrayList = new ArrayList();
//写入数据
arrayList.Add("Hello, World!");
arrayList.Add(1);
arrayList.Add(true);
//获取数据
object obj1 = arrayList[0];
string str = obj1 as string;
object obj2 = arrayList[1];
int integer = (obj2 is int) ? (int)obj2 : -1;
object obj3 = arrayList[2];
bool boolean = (obj3 is bool) ? (bool)obj3 : false;
解释:其实 C# 的 ArrayList
在你存入数据的时候,自动把你的数据转换为 Object
类型,因此你根据 Index
获得的数据其实是 Object
类型的。所以如上面代码所示,你需要进一步转换为你的需要的类型的变量。
小插曲:介绍一下 C# 中的
?:
语法 与as
和is
的使用as
的使用方法as
在 C# 中也是一种类型转换的方式,但与(string)obj1
这样的强制类型转换的不同的是,as
语句会根据你转换是否成功而返回不同的值。比如这里面obj1
可以转换为string
那么str
就会被赋值为"Hello, World!"
,但如果无法转换,则会将null
赋给str
。这样可以有效避免无法强制转换时的软件崩溃。is
的使用方法有编程基础的朋友可能会觉得无法转换并不是大问题,无非再加一个
try/catch
块。但是理论上讲这么做伴随着性能损失。因此is
就出现了!举个栗子,例如(obj2 is int)
就返回一个布尔值,如果obj2
实际是个int
类型的,那么会返回true
,反之false
。?:
语法的用法(obj2 is int) ? (int)obj2 : -1; //等同于下面的代码 if (obj2 is int) { return (int)obj2; } return -1;
不难看出
?
前面的语句就是一个判断语句,如果为true
,那就返回:
前面的值,反之,返回后面的。as
语法不适用的情况细心的朋友应该发现,我在返回
int
和bool
的时候,并没有使用as
语句。这其实是因为int
和bool
两种类型的变量不能为null
,为上面刚讲到,在特定情况下,as
语句会返回null
,因此对于这些类型的变量as
语句不再适用。
List
C# 中的 List
便和 Java 的 ArrayList
还有 C++ 的 Vector
十分相似了。List
存在的原因是保证数据类型安全。因为 ArrayList
中可以存放任何形式的数据,因此在数据量变得庞大无比的时候,数据处理便变得十分困难了。因为你不清楚每个元素到底是哪个类型的变量。
具体使用方法,这里不做过多介绍了,见下面代码演示:
//初始化三个 List,分别用于存放 string,int 和 bool
List<string> strList = new List<string>();
List<int> intList = new List<int>();
List<bool> booleanList = new List<bool>();
//分别在三个 List 中写入数据
strList.Add("Hello, World!");
intList.Add(1);
booleanList.Add(true);
//分别读取三个 List 中的数据
string str = strList[0]; //"Hello, World!"
int integer = intList[0]; // 1
bool boolean = booleanList[0]; // true
ObservableCollection
总的来说 ObservableCollection
的使用方法和 List
几乎一致,但是 List
中的变化不能即使反映到 UI 上,然后 ObservableCollection
可以。这里如果听不懂,没关系,我们之后讲到 数据绑定 的时候,你就能看到差别啦。下面请看简单的代码演示:
ObservableCollection<string> obCollection = new ObservableCollection<string>();
obCollection.Add("Hello, World!");
string str = obCollection[0];
结语
本篇主要讲述了 Array
,ArrayList
,List
和 ObservableCollection
的使用方法,和简单的区别介绍。其实他们之间的学问还有很多,比如 List
相比 ObservableCollection
更高效,但是 ObservableCollection
拓展性更强,感兴趣的朋友可以去网上自行搜索了解一下。Dictionary
和 Hashtable
就放到下次有机会再讲,因为目前的开发阶段可能还用不到。
感谢大家!
下篇见!