UWP 开发初阶 Chapter 9

介绍 C# 中的几种常用储存容器

上篇回顾

上篇简单介绍了一下 ListView 以及它的妙用,这也为我们接下来马上就要讲到的 DataBinding 即数据绑定打下基础。下次讲到数据绑定,我们会在 ListView 的基础上进行探索。

本篇正文

前言

本篇文章将简单给大家讲述一下 C# 中几种常用容器,比如 ListArrayListArrayObservableCollectionDictionary 以及 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# 中的 ?: 语法 与 asis 的使用

    • 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 语法不适用的情况

      细心的朋友应该发现,我在返回 intbool 的时候,并没有使用 as 语句。这其实是因为 intbool 两种类型的变量不能为 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];

结语

本篇主要讲述了 ArrayArrayListListObservableCollection 的使用方法,和简单的区别介绍。其实他们之间的学问还有很多,比如 List 相比 ObservableCollection 更高效,但是 ObservableCollection 拓展性更强,感兴趣的朋友可以去网上自行搜索了解一下。DictionaryHashtable 就放到下次有机会再讲,因为目前的开发阶段可能还用不到。

感谢大家!

下篇见!


© TotoroQ 2018. All rights reserved.

Powered by Hydejack v8.0.0