Contents
Value type and reference type
In certain computer programming languages, data types are classified as either value types or reference types, where reference types are always implicitly accessed via references, whereas value type variables directly contain the values themselves.
Properties of value types and reference types
Even among languages that have this distinction, the exact properties of value and reference types vary from language to language, but typical properties include:
Reference types and "call by sharing"
Even when function arguments are passed using "call by value" semantics (which is always the case in Java, and is the case by default in C#), a value of a reference type is intrinsically a reference; so if a parameter belongs to a reference type, the resulting behavior bears some resemblance to "call by reference" semantics. This behavior is sometimes called call by sharing. Call by sharing resembles call by reference in the case where a function mutates an object that it received as an argument: when that happens, the mutation will be visible to the caller as well, because the caller and the function have references to the same object. It differs from call by reference in the case where a function assigns its parameter to a different reference; when that happens, this assignment will not be visible to the caller, because the caller and the function have separate references, even though both references initially point to the same object.
Reference types vs. explicit pointers
Many languages have explicit pointers or references. Reference types differ from these in that the entities they refer to are always accessed via references; for example, whereas in C++ it's possible to have either a and a, where the former is a mutable string and the latter is an explicit pointer to a mutable string (unless it's a null pointer), in Java it is only possible to have a , which is implicitly a reference to a mutable string (unless it's a null reference). While C++'s approach is more flexible, use of non-references can lead to problems such as object slicing, at least when inheritance is used; in languages where objects belong to reference types, these problems are automatically avoided, at the cost of removing some options from the programmer.
Reference rebinding and aliasing
In most programming languages, it is possible to change the variable of a reference type to refer to another object, i.e. to rebind the variable to another object. For example, in the following Java code: is a reference type, where is initially assigned a reference of a new object, and is assigned to the same object reference, i.e. bound to the same object as , therefore, changes through is also visible to as well. Afterwards, is assigned a reference (rebound) to another new object, and now and refer to different objects. At the end, refers to the second object with its field having the value , while refers to the first object with its field having the value. However, such as C++, the term "reference type" is used to mean an alias, and it is not possible to rebind a variable of a reference type once it is created, as it is an alias to the original object. In C++, all non-reference class types have value semantics. In the above example, is declared to be a reference (alias) of , and for all purposes, and are the same thing. It is impossible to rebind to become something else. After the above example is run, and are the same object with being , while is a copy of the original with being. In C#, apart from the distinction between value types and reference types, there is also a separate concept called reference variables. A reference variable, once declared and bound, behaves as an alias of the original variable, but it can also be rebounded to another variable by using the reference assignment operator. The variable itself can be of any type, including value types and reference types, i.e. by passing a variable of a reference type by reference (alias) to a function, the object where the reference-type variable points to can also be changed, in addition to the object itself (if it is mutable).
Immutable data types
If an object is immutable and object equality is tested on content rather than identity, the distinction between value type and reference types is no longer clear, because the object itself cannot be modified, but only replaced as a whole (for value type) / with the reference pointed to another object (for reference type). Passing such immutable objects between variables have no observable differences if the object is copied or passed by reference, unless the object identity is taken. In a functional programming language where nothing is mutable (such as Haskell), such distinction does not exist at all and becomes an implementation detail.
Classification per language
This article is derived from Wikipedia and licensed under CC BY-SA 4.0. View the original article.
Wikipedia® is a registered trademark of the
Wikimedia Foundation, Inc.
Bliptext is not
affiliated with or endorsed by Wikipedia or the
Wikimedia Foundation.