C# 可空类型和数组

389 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

一、可空类型

C# 提供了一个特殊的数据类型,nullable 类型(可空类型),可空类型可以表示其基础值类型正常范围内的值,再加上一个 null 值。

Nullable< Int32 >,读作"可空的 Int32",可以被赋值为 -2,147,483,6482,147,483,647 之间的任意值,也可以被赋值为 null 值。类似的,Nullable< bool > 变量可以被赋值为 truefalsenull

在处理数据库和其他包含可能未赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型的功能特别有用。例如,数据库中的布尔型字段可以存储值 truefalse,或者,该字段也可以未定义。

声明一个 nullable 类型(可空类型)的语法如下:

< data_type> ? <variable_name> = null;

可空数据类型的用法:

using System;
namespace CalculatorApplication
 {
         class NullablesAtShow
         {
            static void Main(string[] args)
            {
               int? num1 = null;
               int? num2 = 45;
               double? num3 = new double?();
               double? num4 = 3.14157;
               bool? boolval = new bool?();
               // 显示值
               Console.WriteLine("显示可空类型的值: {0}, {1}, {2}, {3}", 
                                  num1, num2, num3, num4);
               Console.WriteLine("一个可空的布尔值: {0}", boolval);
               Console.ReadLine();
            }
         }
}

当上面的代码被编译和执行时,它会产生下列结果:

      显示可空类型的值: , 45,  , 3.14157      一个可空的布尔值:

Null 合并运算符( ?? )

Null 合并运算符用于定义可空类型和引用类型的默认值。Null 合并运算符为类型转换定义了一个预设值,以防可空类型的值为 NullNull 合并运算符把操作数类型隐式转换为另一个可空(或不可空)的值类型的操作数的类型。

如果第一个操作数的值为 null,则运算符返回第二个操作数的值,否则返回第一个操作数的值。下面的实例演示了这点:

using System;
namespace CalculatorApplication
{
         class NullablesAtShow
         {
            static void Main(string[] args)
            {
               double? num1 = null;
               double? num2 = 3.14157;
               double num3;
               num3 = num1 ?? 5.34;      
               Console.WriteLine("num3 的值: {0}", num3);
               num3 = num2 ?? 5.34;
               Console.WriteLine("num3 的值: {0}", num3);
               Console.ReadLine();
            }
     	}
}

代码被编译和执行时产生结果:

num3 的值: 5.34
num3 的值: 3.14157
二、数组

**数组是一个存储相同类型元素的固定大小的顺序集合。**数组是用来存储数据的集合,通常认为数组是一个同一类型变量的集合。

声明数组变量并不是声明 number0number1、…、number99 一个个单独的变量,而是声明一个就像 numbers 这样的变量,然后使用 numbers[0]numbers[1]、…、numbers[99] 来表示一个个单独的变量。数组中某个指定的元素是通过索引来访问的。

**所有的数组都是由连续的内存位置组成的。**最低的地址对应第一个元素,最高的地址对应最后一个元素。

一、声明数组

在 C# 中声明一个数组,您可以使用下面的语法:

datatype[] arrayName;

其中,

  • datatype 用于指定被存储在数组中的元素的类型。
  • [ ] 指定数组的秩(维度)。秩指定数组的大小。
  • arrayName 指定数组的名称。  

例如:

double[] balance;

二、初始化数组

声明一个数组不会在内存中初始化数组。当初始化数组变量时,您可以赋值给数组。数组是一个引用类型,所以您需要使用 new 关键字来创建数组的实例。

double[] balance = new double[10];

三、赋值给数组

可以通过使用索引号赋值给一个单独的数组元素

double[] balance = new double[10];    balance[0] = 4500.0;

可以在声明数组的同时给数组赋值

double[] balance = { 2340.0, 4523.69, 3421.0};

也可以创建并初始化一个数组

int [] marks = new int[5]  { 99,  98, 92, 97, 95};

在上述情况下,你也可以省略数组的大小

int [] marks = new int[]  { 99,  98, 92, 97, 95};

您也可以赋值一个数组变量到另一个目标数组变量中。在这种情况下,目标和源会指向相同的内存位置:

int [] marks = new int[]  { 99,  98, 92, 97, 95};    int[] score = marks;

当创建一个数组时,C# 编译器会根据数组类型隐式初始化每个数组元素为一个默认值。例如,int 数组的所有元素都会被初始化为 0。

四、访问数组元素

元素是通过带索引的数组名称来访问的。这是通过把元素的索引放置在数组名称后的方括号中来实现的。例如:

    double salary = balance[9];

下面是一个实例,使用上面提到的三个概念,即声明、赋值、访问数组:

using System;
namespace ArrayApplication
      {
         class MyArray
         {
            static void Main(string[] args)
            {
               int []  n = new int[10]; /* n 是一个带有 10 个整数的数组 */
               int i,j;
               /* 初始化数组 n 中的元素 */         
               for ( i = 0; i < 10; i++ )
               {
                  n[ i ] = i + 100;
               }
               /* 输出每个数组元素的值 */
               for (j = 0; j < 10; j++ )
               {
                  Console.WriteLine("Element[{0}] = {1}", j, n[j]);
               }
               Console.ReadKey();
            }
         }
}

代码执行时,产生结果:

  1. Element[0] = 100
  2. Element[1] = 101
  3. Element[2] = 102
  4. Element[3] = 103
  5. Element[4] = 104
  6. Element[5] = 105
  7. Element[6] = 106
  8. Element[7] = 107
  9. Element[8] = 108
  10. Element[9] = 109

五、使用 foreach 循环

在前面的实例中,我们使用一个 for 循环来访问每个数组元素。您也可以使用一个 foreach 语句来遍历数组。

using System;
namespace ArrayApplication
      {
         class MyArray
         {
            static void Main(string[] args)
            {
               int []  n = new int[10]; /* n 是一个带有 10 个整数的数组 */
               /* 初始化数组 n 中的元素 */         
               for ( int i = 0; i < 10; i++ )
               {
                  n[i] = i + 100;
               }
               /* 输出每个数组元素的值 */
               foreach (int j in n )
               {
                  int i = j-100;
                  Console.WriteLine("Element[{0}] = {1}", i, j);
               }
               Console.ReadKey();
            }
         }
      }
  1. Element[0] = 100
  2. Element[1] = 101
  3. Element[2] = 102
  4. Element[3] = 103
  5. Element[4] = 104
  6. Element[5] = 105
  7. Element[6] = 106
  8. Element[7] = 107
  9. Element[8] = 108
  10. Element[9] = 109