值类型和引用类型只是 c# 概念?

Posted

技术标签:

【中文标题】值类型和引用类型只是 c# 概念?【英文标题】:value types and refference types are just c# concepts? 【发布时间】:2015-10-18 08:39:32 【问题描述】:

有人可以解释一下,值类型和引用类型只是 c#.net 概念还是它确实适用于其他各种语言,如 c、c++、java。 谢谢

【问题讨论】:

这是语言中的一个通用概念,不会忽略处理器的工作方式。您不必总是说出这些话,因为语言设计者为您做出了选择。在 Java 中,除了原语之外,一切都是引用类型,这是带有垃圾收集器的语言的自然选择。在 C 和 C++ 中,一切都是值类型,具有显式语法来管理引用和复制值。在 C# 中,您可以选择。你选择的东西很重要,你不能忽略声明或代码中的差异。 【参考方案1】:

在 Java 中,引用自 Does Java make distinction between value type and reference type:

在Java中,所有的对象和枚举都是引用类型,所有的原语都是值类型。两者在复制语义方面的区别与 C# 中的相同,但您不能在 Java 中定义新的值类型。

在 C 和 C++ 中,没有值类型和引用类型的概念。 C++ 有 references,但这与 reference types 不同。

【讨论】:

【参考方案2】:

它适用于许多编程语言。

通常,值类型可以存储在堆栈中(see this Eric Lippert's article for C# details),而引用类型则存储在堆中。或者,至少,值类型是在分配给新变量或作为参数传递给方法时创建自身副本的类型。

例如:

// In C# a struct is a value type
public struct A 

    public string Text;

    public A(string text) 
    
        Text = text;
    


A a = new A("hello world");

// This creates a copy, instead of assigning the same "object" to a new reference
A a1 = a; 

看看Wikipedia 怎么说:

某些编程语言(尤其是 C#、D 和 Swift)使用该术语 值类型来引用赋值对象的类型 深拷贝语义(相对于引用类型,它具有浅层

还说:

其他编程语言(例如 Java)没有正式定义该术语 值类型,但他们的从业者非正式地使用该术语来指代 到具有深拷贝语义的类型(例如 Java 的原始类型)。 复制语义

另一个有趣的问答可以是stack and heap in V8 ( javascript)。

【讨论】:

以上是关于值类型和引用类型只是 c# 概念?的主要内容,如果未能解决你的问题,请参考以下文章

[C#]值类型和引用类型

[C#]值类型和引用类型

C# 值类型和引用类型的区别

由c#的值类型与引用类型说开去

C# 值类型与引用类型 (上)

值类型与引用类型