【问题标题】:Can an object be a field?对象可以是场吗?
【发布时间】:2015-04-17 14:55:25
【问题描述】:

来自this页面:

类型对象可以存储为字段和静态字段。

这让我很困惑。我认为字段只是封装在类或对象中的变量(如 int、string 等)。对象也可以是字段吗?

【问题讨论】:

  • 你的意思是一个字段可以是一个对象,是的
  • @Ahmad 不,字段不能是“对象”。它可以是一个对象的引用。
  • 是的,他们可以。任何东西都可以是一个字段。
  • @xanatos 那么什么是对象?在 C# 中,当您声明引用类型对象时,它是对对象的引用,或者只是对对象的引用,因为没有该引用就无法访问或声明对象(它没有意义)。顺便说一句,他应该说一个字段可以是一个对象。
  • 'object' 是一个定义不明确的术语。有时它的意思是“类”,有时是“实例”。在 C# 中,它通常表示一种类型,准确地说是所有其他类的基类。这种简写在OOP中很正常,整数就是整数等等。

标签: c# object field


【解决方案1】:

当然,对象可以是类中的字段。

想象一个班级

class ClassA
{
    public int ID {get;set;}
}

class ClassB
{

   public ClassA ObjA;
}

现在ClassB 有一个字段ObjA,它是ClassA 的一个对象

我认为字段只是变量(如 int、string 等) 封装在一个类或一个对象中。

它并不特定于 primitive 类型,您可以在您的类中将类/结构的对象作为字段 (或属性)

【讨论】:

  • 这是对ClassA对象的引用
  • @xanatos,是的,但这只是语义 IMO,ObjA 是对 ClassA 对象的引用,或者它是一个对象。
  • 映射到某物不可能是某物。当您尝试简化概念时,我确实认为当您简化时,您应该非常小心措辞,以免产生错误的想法。
【解决方案2】:

任何东西都可以是一个字段。在 C# 中,每种类型(包括 Type 类型)都是 object 的子代。因此,您可以创建任何您想要的内容并将其设为任何类的(静态)字段。

【讨论】:

  • 每种类型 几乎每种类型...int* 例如不是
  • @xanatos typeof(int*) 返回System.Int32*?
  • @DionV。看看typeof(int*).BaseType再看看typeof(int).BaseType,然后试试List<int*>
  • @xanatos:是的,unsafe 块往往会打破很多关于 C# 的正常假设。但我认为这不值得对新手说,对于大多数人几乎不会使用(如果有的话)的功能来说,这会造成很多混乱。
  • @SolalPirelli 正如我对 Habib 所说的那样,简化概念是正确的……诀窍在于选择单词。在 C# 中,几乎每种类型都是 object 的子类型,这是完全正确的,具有相同的冗长性,并让读者可以一瞥还有什么。只是为了好奇,不要继续 unsafe 世界...... ref int 是一种类型,但不是对象的孩子。 typeof(int).MakeByRefType().BaseType
【解决方案3】:

那篇文章有点简化。字段/变量/参数可以是值类型(例如 int),或对引用类型的引用(非正式地称为“对象”......例如类类型和委托)。

Type 是一个引用类型(在某处有一些类似public class Type { ... } 的代码),因此您可以在字段/变量/参数中对它进行引用。

【讨论】:

  • 我很困惑,这个答案对我来说是正确的,但所有其他答案都在说相反的事情
  • @adoomedknight 重点在于 Taw 的评论中 'object' 是一个定义不明确的术语。有时它的意思是“类”,有时是“实例”。在 C# 中,它通常表示一种类型,准确地说是所有其他类的基类。这种简写在 OOP 中是正常的,整数就是整数等等。 事实上,当说对象时(如实例),对对象的引用,对象类型都以相同的方式命名。他们之间有一个很好的点。我指着它。
  • 如果我说一个字段只能是值类型或对引用类型的引用,我说得对吗?
  • @adoomedknight 或者它可能是一个不安全的指针 :-) 但是是的,你是对的 :-)
【解决方案4】:

Type 是一个描述类型的类。您可以拥有 Type 类型的字段,然后可以将其分配给 Type 对象。

【讨论】:

    【解决方案5】:

    在回答主要问题之前,让我们先看看,什么是字段?

    根据 msdn

    字段是类或结构中包含的对象或值。 字段 允许类和结构封装数据。

    示例

    public class CalendarDate
    {
        public int month;
        public int day;
        public int year;
    }
    

    关于字段的重要一点是,它帮助类封装数据。在上面的示例中,月、日和年是分别封装了月、日和年数据的字段。

    类型也一样。类可以使用类型来封装数据。唯一的区别是您不知道编译时该数据将是什么,因为它可以是该类型的任何内容。

    【讨论】:

      【解决方案6】:

      几乎所有types 都派生自object。这一点非常重要,因为它将涉及 BoxingUnboxing 的概念。

      装箱是将值类型转换为类型对象或 到此值类型实现的任何接口类型。当 CLR 将值类型框起来,它将值包装在 System.Object 和 将其存储在托管堆上。拆箱从中提取值类型 物体。拳击是隐含的;拆箱是明确的。的概念 装箱和拆箱是 C# 类型系统统一视图的基础 其中任何类型的值都可以被视为一个对象。

      一个例子如下:

      // Implicit Boxing Operation:
      int i = 123;
      object o = i;
      
      // Explicit Boxing Operation:
      int i = 123;
      object o = (object)i;
      

      理解这个概念很重要,因为它会像他的回答中所示的 @Habib 那样阐明上下文。这就是我觉得你的理解存在差距的地方。

      您对封装的误称,在某些情况下field 被封装在property 中。所以当你看到:

      public string Example { get; set; } 
      

      这将代表一个封装的字段。

      【讨论】:

        猜你喜欢
        • 2018-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多