C# 的关键字系列(4 of n)

和对象类型(object type),类型转换(type conversions)打交道的关键字:

  • as
  • is
  • explicit
  • implicit
  • operator
  • sizeof
  • typeof

is and as

is : 用来判断某个对象是不是某个类型。

string str= string.Empty;
if (str is string)
{
}

在这里如果str 是string 的话,if 就是true。

as :将某个对象转换为某个类型。

string str= string.Empty;
if (str is string)
{
}
string as_str = str as string;
if (as_str != null)
{
}


在这里如果str 是string 对象的话,那么as_str 就不是null。

因为在执行is操作后,我们经常需要对对象进行类型转换。所以使用as的方式效率更高,你可以将is 理解为先进行as 操作,然后判断结果是不是null

explicit,implicit,operator

explicit:显式的

implicit:隐式的

public static explicit operator Celsius(Fahrenheit f)
{
    return new Celsius((5.0f / 9.0f) * (f.degrees - 32));
}

这个方法的意思是Fahrenheit f 转换成Celsius 是显式的,所以 Celsius c =  f; 这句代码会抛出异常:
12EE38AA9CC74DEF8F2CDD8EFF2D63F3

正确的写法是Celsius c =  (Celsius)f;

public static implicit operator Celsius(Fahrenheit f)
{
     return new Celsius((5.0f / 9.0f) * (f.degrees - 32));
}

这个方法代表Fahrenheit f 转换成Celsius 是隐式的,所以 Celsius c =  f; 这句代码正常执行,不需要转换。

sizeof and typeof

sizeof:

用于获取非托管类型的大小(以字节为单位)。 非托管类型包括下表列出的内置类型以及以下类型:

  • 枚举类型

  • 指针类型

  • 用户定义的结构,不包含任何属于引用类型的字段或属性

例如sizeof(int) 返回4.
7EC71901268C4489BD82BBE49CD5CA37

问:sizeof(string) ? 可以编译通过吗?,如果编译通过返回什么,或者该如何计算一个string的

sizeof?

答案

C++中的sizeof

A. 参数为数据类型或者为一般变量。例如sizeof(int),sizeof(long)等等。这种情况要注意的是不同系统系统或者不同编译器得到的结果可能是不同的。

例如int类型在16位系统中占2个字节,在32位系统中占4个字节。

B. 参数为数组或指针。

int a[50]; 

//sizeof(a)=4*50=200; 求数组所占的空间大小

int *a=new int[50];

//sizeof(a)=4; a为一个指针,sizeof(a)是求指针的大小,在32位系统中,当然是占4个字节。

C. 参数为结构或类。Sizeof应用在类和结构的处理情况是相同的。但有两点需要注意,

  • 结构或者类中的静态成员不对结构或者类的大小产生影响,因为静态变量的存储位置与结构或者类的实例地址无关。
  • 没有成员变量的结构或类的大小为1,因为必须保证结构或类的每一个实例在内存中都有唯一的地址。

这段抄自:http://www.cnblogs.com/wangliang651/archive/2006/07/18/453947.html


typeof

用于获取类型的 System.Type 对象。 typeof 表达式采用以下形式:

注意,这里的参数是类型

int i = 0;
Console.WriteLine(i.GetType()); //System.Int32
Console.WriteLine(typeof(int)); //System.Int32

GetType()是对象的方法,typeof 的参数是类型。

Visual Basic 中的TypeOf

Visual Basic 的TypeOf 有点奇怪:

image

Module Module1

    Sub Main()
        Dim t = New Test()

        Console.WriteLine(t.ReturnString())
        Console.WriteLine(TypeName(t))
        Console.WriteLine(TypeOf (t) Is Test)
        Console.WriteLine(t.GetType())

        Console.ReadLine()
    End Sub

    Class Test
        Function ReturnString() As String
            Return "Hello Visual Basic!"
        End Function
    End Class

End Module

运行结果如下:

4C8E1BA58A5A442694C5B0165477A9CE

var

首先为什么有了var关键字?

var custQuery = from cust in customers
                where cust.City == "Phoenix"
                select new { cust.Name, cust.Phone };

如果不用var,那应该用什么呢?

但是在开发的过程中,我发现很多人都比较喜欢这个关键字,我个人还是偏向于只在上面的这种情况和在一些能对代码阅读起帮助的地方使用。

clipboard

3F2B5779F769447BA0F07204A51C23D8

好。

不过上面有个问题,d是int 类型,不是double类型了。

var 还可以在foreach中使用。

5FBB2D98CBD94C288F337D8346E52D3A

在这种情况下,如果可以不使用var,请尽量不要使用var,就像你不一定知道这里的control是什么类型一样,你知道control是什么类型吗??

dynamic

关于dynamic,我觉得没什么好说的了,请看前面写的一些文章:

浅谈Dynamic 关键字系列之一:dynamic 就是Object

浅谈Dynamic 关键字系列之二:调用属性,方法,字段

浅谈Dynamic 关键字系列之三(上):ExpandoObject, DynamicObject, DynamicMetaObject

浅谈Dynamic 关键字系列之三(下):ExpandoObject,DynamicObject,DynamicMetaObject

浅谈Dynamic 关键字系列之四:dynamic为什么比反射快

有人说第一篇是误人子弟,误就误吧。。

作者:LoveJenny
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/LoveJenny/p/2804324.html