C#深刻浅出之更多数据类型

类型的划分

       一个类型,要么是值类型,要么是引用类型。区别在于拷贝方式:值类型拷贝值,引用类型拷贝引用数据库

值类型

       值类型直接包含值。至关于每个值类型都有本身单独的值:数组

int a = 10;
int b = a;

a和b都有着本身的值,修改a并不会影响b,反过来同样,互不影响。数据结构

       即便是将实例传给Console.WriteLine()这样的方法也会产生内存拷贝。因为值内存须要建立内存拷贝,所以定义的时候不要让它们占用太多内存。code

引用类型

       引用类型的变量存储对数据存储位置的引用,而不是直接存储数据。也就是说,要到对应的位置才能找到真正的数据。所以为了访问数据,“运行时”要先从变量中读取内存位置,再“跳转”到包含数据的内存位置。引用类型指向的内存区为成为堆。排序

       正如前面所说,引用类型拷贝引用,它不包含值,每次引用变量的赋值都是引用的拷贝,并不须要拷贝数据。索引

       值得注意的一点,引用类型只复制对数据的引用,因此两个不一样的变量可引用相同的数据。在这种状况下,只要数据发生了改变,就会影响到所引用到他的变量的值,毕竟都是引用同一个数据。内存

可空修饰符

       我以前提到过null值,它是给引用变量表示为空的值,通常不能将它赋值给值类型。根据定义,值类型不能包含引用。可是有的时候咱们的确又有这一方面的需求,因此为了声明能存储null变量,要使用可空修饰符"?"。示例:字符串

int? cnt = null;

隐式类型的局部变量

    关键字:var,用于声明隐式类型的局部变量。示例:编译器

var text = Console.WriteLine();

这么作最终的CIL代码并无区别,但var告诉编译器根据声明时所赋的值来推断数据类型。string

    虽然容许用var取代像是数据类型,可是在已知数据类型的状况下仍是不要这么作,明确的声明数据类型不只可以增长可读性,还至关于亲自确认了等号右边返回的是你所须要的数据类型。

    匿名类型可以在方法内部动态声明数据类型,并不须要经过显式的类定义来声明,示例:

var people1 = new { Name = "Van", Say = "啊?" };
var people2 = new { Name = "Bili", Say = "乖乖站好" };
System.Console.WriteLine( $"{people1.Name} {people1.Say}");
System.Console.WriteLine( $"{people2.Name} {people2.Say}");

元组

    有时候须要合并数据元素。元组正好能够解决这个问题,它容许在一个语句内完成全部变量的赋值。

    如下是它的语法形式:

    将元组赋给单独声明的变量:

(string power, string name, int weight) = ("超高校的幸运", "脖子直抖", 65);

    将元组赋给预声明的变量:

string power, name;
int weight;
(power, name, weight) = ("超高校的幸运", "脖子直抖", 65);

    将元组赋给隐式类型的变量:

var (power,name,weight) = ("超高校的幸运", "脖子直抖", 65);

注意:此处以及下面包含的 var 毫不能若是替换成显示类型(如string或int)。由于元组宗旨是容许每一项都有不一样的数据类型,因此每一项都指定同一个显示类型名称和这个宗旨冲突,即使是真的同样,编译器也不容许指定显示类型。

    声明具名元组,将元组值赋给它。

(string power, string name, int weight) people = ("超高校的幸运", "脖子直抖", 65);

    声明包含具名元组项的元组,将其赋给隐式类型的变量。

var people = (power:"超高校的幸运", name:"脖子直抖", weight:65);

    将元组项未具名的元组赋给隐式类型的变量,再经过向编号属性访问单独的元素。

var people = ("超高校的幸运", "脖子直抖", 65);
people.Item1;//people.Item2;

如果具名元组仍是能够经过项目编号属性访问单独的元素。

    赋值时用下划线丢弃元组的一部分数据(弃元)。

(string power, _, int weigth) people = ("超高校的幸运", "脖子直抖", 65);

数组

    数组可以在单个变量中存储同一种类型的多个数据项,而且能够经过索引来单独访问这些数据项。数组的数据线索引从0开始,最大索引值老是比数组中的数据项少1。可是如今大多数程序都使用泛型集合类型而非数组来存储数据集合。

数组声明

    数组声明,直接上代码:

string[] arr1;

方括号在数据类型以后,变量名以前。

    声明二维数组的方法,代码:

string[,] arr2;

在用逗号进行多维数组的声明,总共维数等于逗号加一。

数组的实例化和赋值

    数组可在声明的同时初始化,例如:

string[] arr3 = {"1","1","4","5","1","4"};

元素的下标对应就是对应元素的位置,依次排列。

    也能够先声明数组再进行赋值,以下:

string[] arr4;
arr4 = new string[]{"1","1","4","5","1","4"};

可是从C#3.0开始就没必要在new以后指定数组类型。编译器能根据初始化列表中的数据类型推断数组类型。以下:

arr4 = new []{"1","1","4","5","1","4"};

上面使用了new关键字,它指示“运行时”为数据库类型分配内存,也就是实例化数据类型。

    咱们也能够给数组分配固定大小但不提供初始化,也能够指定大小并赋值,以下:

string[] arr5 = new string[6]{"1","1","4","5","1","4"};

    数组在没有被初始化的时候,“运行时”会给每一个元素初始化为他们的默认值:

  • 引用类型会被初始化为null。
  • 数字类型会被初始化为0。
  • bool初始化为false。
  • char类型初始化为\0。

    多位数组注意不要超出对应的声明范围,这里再也不讨论。

数组的使用

    能够用方括号表示法(数组访问符)来访问数组中一个特定的数据项。注意下标是从0开始的,最大下标是数组内容减一。

arr1[1];//表示arr1数组中第二个元素的内容

    二维数组同理。

    交错数组,也就是数组数组,用数组来存储数组,声明方式以下:

int[][] arr6 = {
    new int[]{1,1,1};
    new int[]{2,2,2};
    new int[]{3,3,3};
}

    固然数组也有一些方法,下面进行举例:

  • arr.Length:获取数组的长度,只读。

咱们在访问数组的边界元素时,通常会采起Length-1这样的方式来访问数组边界成员。

  • System.Array.Sort():对数组内容进行排序。
  • System.Array.BinarySearch(var[] arr, var searchString):返回搜索值的索引,不存在就返回-1。前提是按升序排序。
  • System.Array.Clear(intArray, 0, intArray.Length):清空第0到第intArray.Length个索引的元素(置零)。
  • System.Array.Reverse(arr):反转数组顺序。

还有众多方法,这里不一一列举,看个乐呵。

字符串做为数组使用

    咱们须要注意的是,字符串是不可变的,字符串做为数组使用时,咱们访问到的成员变量都是char类型的变量。为此将字符串做为数组使用时要注意不能去修改为员变量的内容。

小结

    本次博文的内容介绍了更多的数据结构,可是这也只是开始,介绍了值类型,引用类型,隐式类型,元组以及数组,这些内容都会贯彻到咱们从此的项目之中,必定要打好坚实的基础,固然不是说要背下来,理解到位才是咱们应该去作的。

相关文章
相关标签/搜索