C# Object 类型

C# Object 类型,第1张

本文内容来自微软 MVP solenovex 的视频教程—— 真会C#?- 第3章 创建类型 ,大致和第 7 课—— object 类型 对应。可在 GitHub 中查看 C# 视频教程的配套PPT

本文主要包括以下内容

object(SystemObject)是所有类型的终极父类。所有类型都可以向上转换为object。

object是引用类型,但值类型可以转化为object,反之亦然。(类型统一)。

在值类型和 object 之间转化的时候,CLR 必须执行一些特殊的工作,以弥合值类型和引用类型之间语义上的差异,这个过程就叫做 装箱 拆箱

装箱就是把值类型的实例转化为引用类型实例的动作,目标引用类型可以是 object,也可以是某个接口。

拆箱正好相反,把那个对象转化为原来的值类型。 int y = (int)obj; // Unbox the int

拆箱需要显式的转换。运行时会检查这个值类型和object对象的真实类型是否匹配,如果不匹配就抛出InvalidCastException。

注意:装箱对于类型统一是非常重要的。但是系统不够完美,数组和泛型只支持引用转换,不支持装箱。

装箱会把值类型的实例复制到一个新的对象,拆箱会把这个对象的内容再复制给一个值类型的实例。

C# 的程序既会做静态的类型检查(编译时),也会做运行时的类型检查(CLR)。

静态检查:不运行程序的情况下,让编译器保证你程序的正确性。 int x = "5"; 运行时的类型检查由CLR执行,发生在向下的引用转换或拆箱的时候。

运行时检查之所以可行是因为:每个在 heap 上的对象内部都存储了一个类型 token。这个 token 可以通过调用 object 的 GetType() 方法来获取。

所有 C# 的类型在运行时都是以 SystemType 的实例来展现的,两种方式可以获得SystemType对象:

GetType 是在运行时被算出的,typeof 是在编译时被算出(静态)(当涉及到泛型类型参数时,它是由 JIT 编译器来解析的)。

SystemType 的属性有:类型的名称,Assembly,基类等等。

ToString() 方法会返回一个类型实例的默认文本表示。所有的内置类型都重写了该方法。

可以在自定义的类型上重写 ToString() 方法,如果你不重写该方法,那就会返回该类型的名称。

当你调用一个被重写的 object 成员的时候,例如在值类型上直接调用 ToString() 方法,这时候就不会发生装箱 *** 作,但是如果你进行了转换,那么装箱 *** 作就会发生。

Built-in reference types (C# reference)

Object Class

Boxing and Unboxing (C# Programming Guide)

Type-testing and conversion operators (C# reference)

ObjectGetType Method

Type Class

ObjectToString Method

前两天刚遇到的同一个问题,我的解决方法是

allClass = projectServicegetCondition(className,creatime);//数据库取出来的是Object类型

     for(int i=0;i<allClasssize();i++){

      YanxiuClassVo classVo = new YanxiuClassVo();//需要放入的实体类

      Object[] objClass = (Object[])allClassget(i);

      classVosetID(objClass[0]toString());

      classVosetCreateTime((Date)objClass[1]);

      classVosetClassName(objClass[2]toString());

      classVosetIsDelete(objClass[3]toString());

      classVosetCreater(objClass[5]toString());

     }

希望能帮到你

java的容器中可以放基本的数据类型,但是是以包装类的形式,如int 在 容器中是先包装成Integer,再转变成Object存放。

集合中也可以放类的实例化对象。任何一种数据类型或者对象放进容器中后都会失去原有的类型,变成 Object,用的时候从容器中取出后进行转型成所需的类型就可以了,

《Think in java》 中是这样解释的: 由于当初编写集合时,那个集合的程序员根本不知道用户到底想把什么类型置入集合。若指示某个集合只允许特定的类型,会妨碍它成为一个“常规用途”的工具,为用户带来麻烦。为解决这个问题,集合实际容纳的是类型为Object的一些对象的句柄。

java使用变量的instance方法先判断是否什么基本类型,然后使用强制转换,实例如下:

Object param = paramsget(i);

   if (param instanceof Integer) {

    int value = ((Integer) param)intValue();

    prepStatementsetInt(i + 1, value);

   } else if (param instanceof String) {

    String s = (String) param;

    prepStatementsetString(i + 1, s);

   } else if (param instanceof Double) {

    double d = ((Double) param)doubleValue();

    prepStatementsetDouble(i + 1, d);

   } else if (param instanceof Float) {

    float f = ((Float) param)floatValue();

    prepStatementsetFloat(i + 1, f);

   } else if (param instanceof Long) {

    long l = ((Long) param)longValue();

    prepStatementsetLong(i + 1, l);

   } else if (param instanceof Boolean) {

    boolean b = ((Boolean) param)booleanValue();

    prepStatementsetBoolean(i + 1, b);

   } else if (param instanceof Date) {

    Date d = (Date) param;

    prepStatementsetDate(i + 1, (Date) param);

   }

以下代码可以打印出对象中每个元素

Object[] myobj = {1,2,3,4};

String str;

for(int i = 0; i < myobjlength; i++){

Object obj = myobj[i];

str = objtoString();

Systemoutprintln(str);

}

其中:

Object[] myobj 得到对象数组

Object obj = myobj[i];得到对象数组中每个对象

str = objtoString();将对象转为字符串。转换为其他类型时要注意出错处理,如元素为非数字类型,转换为数字的情况

tabchild()会出现对象不支持此属性或方法是因为本来就没有child()方法,你用$("#tab>span")child()也同样。

获得匹配元素集合中每个元素的所有子元素应该用children()

以上就是关于C# Object 类型全部的内容,包括:C# Object 类型、object类型怎么转为普通对像类型、java中为什么从集合中取出来的元素都是Object类型的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10126879.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存