Movatterモバイル変換


[0]ホーム

URL:


Jump to content
WikipediaThe Free Encyclopedia
Search

Value type and reference type

From Wikipedia, the free encyclopedia
(Redirected fromValue type)

In certain computerprogramming languages,data types are classified as eithervalue types orreference types, where reference types are always implicitly accessed viareferences, whereas value type variables directly contain thevalues themselves.[1][2]

Properties of value types and reference types

[edit]

Even among languages that have this distinction, the exact properties of value and reference types vary from language to language, but typical properties include:

  • Primitive data types, such as Booleans, fixed-size integers, floating-point values, and characters, are value types.
  • Objects, in the sense ofobject-oriented programming, belong to reference types.
  • Assigning to a variable of reference type simply copies the reference, whereas assigning to a variable of value type copies the value. This applies to all kinds of variables, including local variables, fields of objects, and array elements. Likewise when calling a function: parameters of reference type are copies of the reference, whereas parameters of value type are copies of the value.
  • If a reference type ismutable, then mutations made via one reference are visible via any other, whereas if a value type is mutable, then mutations made to one value are not visible in another.
  • Reference types support the notion ofidentity — it makes sense to discuss whether two values of reference type refer to the same object, and the language provides functionality to determine whether they do — whereas value types do not.
  • Values of reference type refer to objectsallocated in the heap, whereas values of value type are contained either on the call stack (in the case of local variables and function parameters) or inside their containing entities (in the case of fields of objects and array elements). (With reference types, it is only the reference itself that is contained either on the call stack or inside a containing entity.)
  • Reference types support the notion ofsubtyping, whereby all values of a given reference type are automatically values of a different reference type. Value types do not support subtyping, but may support other forms of implicittype conversion, e.g. automatically converting an integer to a floating-point number if needed. Additionally, there may be implicit conversions between certain value and reference types, e.g. "boxing" a primitiveint (a value type) into anInteger object (an object type), or reversing this via "unboxing".

Reference types and "call by sharing"

[edit]
Further information:Evaluation strategy § 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 calledcall 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 willnot be visible to the caller, because the caller and the function haveseparate references, even though both references initially point to the same object.

Reference types vs. explicit pointers

[edit]

Many languages haveexplicit pointers or references. Reference types differ from these in that the entities they refer to arealways accessed via references; for example, whereas in C++ it's possible to have either astd::string and astd::string*, 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 aStringBuilder, 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 asobject slicing, at least wheninheritance 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

[edit]

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:

classFoo{publicinta;}Fooa=newFoo();Foob=a;a.prop=3;a=newFoo();a.prop=1;

Foo is a reference type, wherea is initially assigned a reference of a new object, andb is assigned to the same object reference, i.e. bound to the same object asa, therefore, changes througha is also visible tob as well. Afterwards,a is assigned a reference (rebound) to another new object, and nowa andb refer to different objects. At the end,a refers to the second object with itsprop field having the value1, whileb refers to the first object with itsprop field having the value3.

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.

structFoo{inta;};Fooa;a.prop=1;Foo&b=a;Fooc=a;a.prop=3;

In C++, all non-reference class types have value semantics. In the above example,b is declared to be a reference (alias) ofa, and for all purposes,a andb are the same thing. It is impossible to rebindb to become something else. After the above example is run,a andb are the sameFoo object withprop being3, whilec is a copy of the originala withprop being1.

In C#, apart from the distinction between value types and reference types, there is also a separate concept called reference variables.[3] 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= ref. 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

[edit]

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

[edit]
LanguageValue typeReference type
Java[4]all non-object types, including (e.g.) booleans and numbersall object types, including (e.g.) arrays
C++all data types, except reference types, array types and function typesarrays and functions
C#[5]all non-object types, including structures and enumerations as well as primitive typesall object-types, including both classes and interfaces
Swift[6][7]structures (including e.g. booleans, numbers, strings, and sets) and enumerations (including e.g. optionals)functions, closures, classes
Python[8]all types
JavaScript[9]all non-objects, including booleans, floating-point numbers, and strings, among othersall objects, including functions and arrays, among others
OCaml[10][11]immutable characters, immutable integer numbers, immutable floating-point numbers, immutable tuples, immutable enumerations (including immutable units, immutable booleans, immutable lists, immutable optionals), immutable exceptions, immutable formatting stringsarrays, immutable strings, byte strings, dictionaries
PHPNon-object types, such as primitives and arrays.All object (class) types[12]

See also

[edit]

References

[edit]
  1. ^Brown, Erik E. (2006).Windows Forms in Action. Shelter Island, New York: Manning. p. 703.ISBN 978-1-932-39465-8.
  2. ^Stephens, Rod (2014).C# 5.0 Programmer's Reference. Indianapolis, Indiana: John Wiley & Sons. p. 57.ISBN 978-1-118-84728-2.
  3. ^"Reference variables".
  4. ^"Chapter 4. Types, Values, and Variables".docs.oracle.com.
  5. ^"C# Keywords".docs.microsoft.com.
  6. ^"Structures and Classes — The Swift Programming Language (Swift 5.2)".docs.swift.org.
  7. ^"Closures — The Swift Programming Language (Swift 5.2)".docs.swift.org.
  8. ^"Built-in Types — Python 3.8.2rc1 documentation".docs.python.org.
  9. ^"ECMAScript® 2019 Language Specification".www.ecma-international.org.
  10. ^"Chapter 24 The core library".caml.inria.fr.
  11. ^"Modifiable Data Structures".caml.inria.fr.
  12. ^"PHP: The Basics".
Retrieved from "https://en.wikipedia.org/w/index.php?title=Value_type_and_reference_type&oldid=1239944902"
Category:
Hidden categories:

[8]ページ先頭

©2009-2025 Movatter.jp