diff options
Diffstat (limited to 'src/mscorlib/src/System/ParamsArray.cs')
-rw-r--r-- | src/mscorlib/src/System/ParamsArray.cs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/mscorlib/src/System/ParamsArray.cs b/src/mscorlib/src/System/ParamsArray.cs new file mode 100644 index 0000000000..ed8919c586 --- /dev/null +++ b/src/mscorlib/src/System/ParamsArray.cs @@ -0,0 +1,81 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. +namespace System +{ + internal struct ParamsArray + { + // Sentinel fixed-length arrays eliminate the need for a "count" field keeping this + // struct down to just 4 fields. These are only used for their "Length" property, + // that is, their elements are never set or referenced. + private static readonly object[] oneArgArray = new object[1]; + private static readonly object[] twoArgArray = new object[2]; + private static readonly object[] threeArgArray = new object[3]; + + private readonly object arg0; + private readonly object arg1; + private readonly object arg2; + + // After construction, the first three elements of this array will never be accessed + // because the indexer will retrieve those values from arg0, arg1, and arg2. + private readonly object[] args; + + public ParamsArray(object arg0) + { + this.arg0 = arg0; + this.arg1 = null; + this.arg2 = null; + + // Always assign this.args to make use of its "Length" property + this.args = oneArgArray; + } + + public ParamsArray(object arg0, object arg1) + { + this.arg0 = arg0; + this.arg1 = arg1; + this.arg2 = null; + + // Always assign this.args to make use of its "Length" property + this.args = twoArgArray; + } + + public ParamsArray(object arg0, object arg1, object arg2) + { + this.arg0 = arg0; + this.arg1 = arg1; + this.arg2 = arg2; + + // Always assign this.args to make use of its "Length" property + this.args = threeArgArray; + } + + public ParamsArray(object[] args) + { + int len = args.Length; + this.arg0 = len > 0 ? args[0] : null; + this.arg1 = len > 1 ? args[1] : null; + this.arg2 = len > 2 ? args[2] : null; + this.args = args; + } + + public int Length + { + get { return this.args.Length; } + } + + public object this[int index] + { + get { return index == 0 ? this.arg0 : GetAtSlow(index); } + } + + private object GetAtSlow(int index) + { + if (index == 1) + return this.arg1; + if (index == 2) + return this.arg2; + return this.args[index]; + } + } +} |