C# 运算符的简化操作(四):sizeof typeof nameof index 运算符

05 sizeof 运算符

使用 sizeof 运算符可以确定栈中值类型需要的长度(单位是字节):Console.WriteLine(sizeof(int));

其结果是显示数字 4,因为 int 有 4 个字节长。.

其结果是显示数字 4,因为 int 有 4 个字节长。如果结构体只包含值类型,也可以使用sizeof 运算符和结构 —— 如下所示的 Point 类:

public struct Point{  public Point (int x, int y)  {    X = x;    Y = y;  }  public int X { get; }  public int Y { get; }}

注意

类不能使用 sizeof 运算符。

如果对复杂类型(而非基本类型)使用 sizeof 运算符,就需要把代码放在 unsafe 块中,如下所示:

unsafe{  Console.WriteLine(sizeof(Point));}
注意

默认情况下不允许使用不安全的代码,需要在 csproj 项目文件中指定AllowUnsafeBlocks。

06 typeof 运算符

typeof 运算符返回一个表示特定类型的 SystemType 对象。例如,typeof(string)返回表示 System.String 类型的 Type 对象。在使用反射技术动态地查找对象的相关信息时,这个运算符很有用。

07  nameof 运算符

nameof 是新的 C#6 运算符。该运算符接受一个符号、属性或方法,并返回其名称。这个运算符如何使用?一个例子是需要一个变量的名称时,如检查参数是否为null:

public void Method(object o){  if (o == null) throw new ArgumentNullException(nameof(o));
当然,这类似于传递一个字符串而不是使用 nameof 运算符来抛出异常。然而,如果名称拼错,传递字符串并不会显示一个编译器错误。另外,改变参数的名称时,就很容易忘记更改传递到 ArgumentNullException 构造函数的字符串。

if (o == null) throw new ArgumentNullException("o");

对变量的名称使用 nameof 运算符只是一个用例。还可以使用它得到属性的名称,例如,在属性 set 访问器中触发改变事件(使用 INotifyPropertyChanged接口),并传递属性的名称。

public string FirstName{  get => _firstName;   set  {   _firstName = value;   onPropertyChanged(nameof(FirstName));   } }

nameof 运算符也可以用来得到方法的名称。如果方法是重载的,它同样适用,因为所有的重载版本都得到相同的值:方法的名称。

public void Method()

{

    Log($"{nameof(Method)} called");

}

08 index 运算符

在 “ 数组 ” 中将使用索引运算符(括号)访问数组。这里传递数值 2,使用索引运算符访问数组 arr1 的第三个元素:

int[] arr1 = {1,2,3,4};

int x = arr1[2];  // x == 3

类似于访问数组元素,索引运算符用集合类实现。

索引运算符不需要把整数放在括号内,并且可以用任何类型定义。下面的代码片段创建了一个泛型字典,其键是一个字符串,值是一个整数。在字典中,键可以与索引器一起使用。在下面的示例中,字符串 first 传递给索引运算符,以设置字典里的这个元素,然后把相同的字符串传递给索引器来检索此元素:

var dict = new Dictionary<string,int>();

dict["first"] = 1;

int x = dict["first"];