Merge branch 'cecil-light'
[mono.git] / mcs / class / dlr / Runtime / Microsoft.Scripting.Core / Utils / StrongBox.cs
1 /* ****************************************************************************
2  *
3  * Copyright (c) Microsoft Corporation. 
4  *
5  * This source code is subject to terms and conditions of the Apache License, Version 2.0. A 
6  * copy of the license can be found in the License.html file at the root of this distribution. If 
7  * you cannot locate the  Apache License, Version 2.0, please send an email to 
8  * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound 
9  * by the terms of the Apache License, Version 2.0.
10  *
11  * You must not remove this notice, or any other, from this software.
12  *
13  *
14  * ***************************************************************************/
15
16 namespace System.Runtime.CompilerServices {
17
18     /// <summary>
19     /// Holds a reference to a value.
20     /// </summary>
21     /// <typeparam name="T">The type of the value that the <see cref = "StrongBox{T}"></see> references.</typeparam>
22     public class StrongBox<T> : IStrongBox {
23         /// <summary>
24         /// Gets the strongly typed value associated with the <see cref = "StrongBox{T}"></see>
25         /// <remarks>This is explicitly exposed as a field instead of a property to enable loading the address of the field.</remarks>
26         /// </summary>
27         [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1051:DoNotDeclareVisibleInstanceFields")]
28         public T Value;
29
30         /// <summary>
31         /// Initializes a new StrongBox which can receive a value when used in a reference call.
32         /// </summary>
33         public StrongBox() {
34         }
35
36         /// <summary>
37         /// Initializes a new <see cref = "StrongBox{T}"></see> with the specified value.
38         /// </summary>
39         /// <param name="value">A value that the <see cref = "StrongBox{T}"></see> will reference.</param>
40         public StrongBox(T value) {
41             Value = value;
42         }
43
44         object IStrongBox.Value {
45             get {
46                 return Value;
47             }
48             set {
49                 Value = (T)value;
50             }
51         }
52     }
53
54     /// <summary>
55     /// Defines a property for accessing the value that an object references.
56     /// </summary>
57     public interface IStrongBox {
58         /// <summary>
59         /// Gets or sets the value the object references.
60         /// </summary>
61         object Value { get; set; }
62     }
63 }