【问题标题】:Safe to assume all C# variables initialized by new are references?可以安全地假设所有由 new 初始化的 C# 变量都是引用吗?
【发布时间】:2010-10-26 01:58:58
【问题描述】:

我现在正在学习 C# refs。

是否可以假设所有分配有 new 的变量都是引用而不是值?

例子:

SomeType variable = new SomeType()

【问题讨论】:

  • 请参阅最新评论以回复您的问题。

标签: c# reference ref


【解决方案1】:

没有:

  • 类的实例是引用,但结构的实例是值。
  • 类和结构都可以使用 new 构造

例如,System.Drawing.Pointstruct 而不是 class

Point point = new Point(1, 1); //point is a value, not a reference

【讨论】:

【解决方案2】:

C# 有两种类型的对象 - 引用类型(使用 class 关键字定义)和值类型(使用 struct 关键字定义)。

选择一本关于 C# 的好书了解更多详细信息。它是一个重要的概念。

【讨论】:

  • “当你在 VT 上执行 new() 时,你会得到一个指向堆栈上对象开头的变量。”这是否意味着一旦像在 C 中那样退出堆栈帧后引用 VT,您可能会获得损坏的内存?
  • Microsoft 已经取得了长足的进步……CLR 进行了检查以避免此类损坏,并在执行代码之前对其进行验证。如果您跳入非托管代码和修补程序,您仍然可以搞砸,但这需要您使用“不安全”关键字标记该代码段并需要激活编译器开关。在这种情况下,您是在说您对不安全的代码负责。
  • 总而言之,99% 的情况下,如果您持有一个 VT 变量/ref,您可以确定它指向一个有效对象。 CLR 会为您处理/管理。
  • @Gishu,但我不了解在堆栈上创建的 VT。如果它们确实是在堆栈上创建的,那么一旦退出函数框架,对 VT 的任何引用都将被破坏。
  • 值类型并不总是在堆栈上创建。这很复杂 - 请参阅 stackoverflow.com/questions/203695/structure-vs-class-in-c
【解决方案3】:

不,值类型不是引用。

但对于任何其他非值类型和“ref/out”参数,它们都是引用。

【讨论】:

    【解决方案4】:

    没有。在 C# 中,结构也使用 new() 实例化,但被视为值。

    【讨论】:

      【解决方案5】:

      看起来您将引用与对象混淆了。如果是这种情况,那么使用 new 关键字创建的类型是对象。被视为值的结构除外。

      【讨论】:

        【解决方案6】:

        不一定。随着您对 C# 的深入了解,您会发现有类(引用类型)和结构(值类型)。它们都是通过使用“new”关键字来实例化的,但结构的实例不是引用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-20
          • 1970-01-01
          • 2017-12-11
          • 2023-03-12
          • 2010-12-30
          • 2021-01-02
          • 2021-11-18
          • 2011-01-21
          相关资源
          最近更新 更多