Skip to content

Commit 466b0f6

Browse files
gfoidlstephentoub
andauthored
Use C# 10's enhanced struct initialization features (#63131)
* Use C# 10's enhanced struct initialization features * Addressed usages * Remove #pragmas * Fixed build Cf. #63131 (comment) * Update src/libraries/Common/src/System/Collections/Generic/EnumerableHelpers.Linq.cs Co-authored-by: Stephen Toub <stoub@microsoft.com>
1 parent 7eaabea commit 466b0f6

File tree

10 files changed

+25
-35
lines changed

10 files changed

+25
-35
lines changed

src/libraries/Common/src/System/Collections/Generic/EnumerableHelpers.Linq.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ internal static T[] ToArray<T>(IEnumerable<T> source)
8080
return result;
8181
}
8282

83-
var builder = new LargeArrayBuilder<T>(initialize: true);
83+
LargeArrayBuilder<T> builder = new();
8484
builder.AddRange(source);
8585
return builder.ToArray();
8686
}

src/libraries/Common/src/System/Collections/Generic/LargeArrayBuilder.SizeOpt.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,10 @@ internal struct LargeArrayBuilder<T>
1515
{
1616
private ArrayBuilder<T> _builder; // mutable struct; do not make this readonly
1717

18-
public LargeArrayBuilder(bool initialize) : this()
19-
{
20-
// This is a workaround for C# not having parameterless struct constructors yet.
21-
// Once it gets them, replace this with a parameterless constructor.
22-
Debug.Assert(initialize);
23-
}
18+
/// <summary>
19+
/// Constructs a new builder.
20+
/// </summary>
21+
public LargeArrayBuilder() => this = default;
2422

2523
public int Count => _builder.Count;
2624

src/libraries/Common/src/System/Collections/Generic/LargeArrayBuilder.SpeedOpt.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,9 @@ internal struct LargeArrayBuilder<T>
2525
/// <summary>
2626
/// Constructs a new builder.
2727
/// </summary>
28-
/// <param name="initialize">Pass <c>true</c>.</param>
29-
public LargeArrayBuilder(bool initialize)
28+
public LargeArrayBuilder()
3029
: this(maxCapacity: int.MaxValue)
3130
{
32-
// This is a workaround for C# not having parameterless struct constructors yet.
33-
// Once it gets them, replace this with a parameterless constructor.
34-
Debug.Assert(initialize);
3531
}
3632

3733
/// <summary>
@@ -42,10 +38,10 @@ public LargeArrayBuilder(bool initialize)
4238
/// Do not add more than <paramref name="maxCapacity"/> items to this builder.
4339
/// </remarks>
4440
public LargeArrayBuilder(int maxCapacity)
45-
: this()
4641
{
4742
Debug.Assert(maxCapacity >= 0);
4843

44+
this = default;
4945
_first = _current = Array.Empty<T>();
5046
_maxCapacity = maxCapacity;
5147
}

src/libraries/Common/src/System/Collections/Generic/SparseArrayBuilder.cs

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,10 @@ internal struct SparseArrayBuilder<T>
7171
/// <summary>
7272
/// Constructs a new builder.
7373
/// </summary>
74-
/// <param name="initialize">Pass <c>true</c>.</param>
75-
public SparseArrayBuilder(bool initialize)
76-
: this()
74+
public SparseArrayBuilder()
7775
{
78-
// Once C# gains parameterless struct constructors, please
79-
// remove this workaround.
80-
Debug.Assert(initialize);
81-
82-
_builder = new LargeArrayBuilder<T>(initialize: true);
76+
this = default;
77+
_builder = new LargeArrayBuilder<T>();
8378
}
8479

8580
/// <summary>

src/libraries/Common/tests/Tests/System/Collections/Generic/LargeArrayBuilderTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace System.Collections.Generic.Tests
1414
[Fact]
1515
public void Constructor()
1616
{
17-
var builder = new LargeArrayBuilder<T>(initialize: true);
17+
var builder = new LargeArrayBuilder<T>();
1818

1919
Assert.Equal(0, builder.Count);
2020
Assert.Same(Array.Empty<T>(), builder.ToArray());
@@ -24,8 +24,8 @@ public void Constructor()
2424
[MemberData(nameof(EnumerableData))]
2525
public void AddCountAndToArray(IEnumerable<T> seed)
2626
{
27-
var builder1 = new LargeArrayBuilder<T>(initialize: true);
28-
var builder2 = new LargeArrayBuilder<T>(initialize: true);
27+
var builder1 = new LargeArrayBuilder<T>();
28+
var builder2 = new LargeArrayBuilder<T>();
2929

3030
int count = 0;
3131
foreach (T item in seed)
@@ -63,7 +63,7 @@ public void MaxCapacity(IEnumerable<T> seed, int maxCapacity)
6363
[MemberData(nameof(EnumerableData))]
6464
public void AddRange(IEnumerable<T> seed)
6565
{
66-
var builder = new LargeArrayBuilder<T>(initialize: true);
66+
var builder = new LargeArrayBuilder<T>();
6767

6868
// Call AddRange multiple times and verify contents w/ each iteration.
6969
for (int i = 1; i <= 10; i++)
@@ -81,7 +81,7 @@ public void CopyTo(IEnumerable<T> seed, int index, int count)
8181
{
8282
var array = new T[seed.Count()];
8383

84-
var builder = new LargeArrayBuilder<T>(initialize: true);
84+
var builder = new LargeArrayBuilder<T>();
8585
builder.AddRange(seed);
8686
builder.CopyTo(array, index, count);
8787

src/libraries/System.Linq/src/System/Linq/AppendPrepend.SpeedOpt.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ private TSource[] LazyToArray()
2323
{
2424
Debug.Assert(GetCount(onlyIfCheap: true) == -1);
2525

26-
var builder = new LargeArrayBuilder<TSource>(initialize: true);
26+
LargeArrayBuilder<TSource> builder = new();
2727

2828
if (!_appending)
2929
{
@@ -106,7 +106,7 @@ private TSource[] LazyToArray()
106106
{
107107
Debug.Assert(GetCount(onlyIfCheap: true) == -1);
108108

109-
var builder = new SparseArrayBuilder<TSource>(initialize: true);
109+
SparseArrayBuilder<TSource> builder = new();
110110

111111
if (_prepended != null)
112112
{

src/libraries/System.Linq/src/System/Linq/Concat.SpeedOpt.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public override int GetCount(bool onlyIfCheap)
3838

3939
public override TSource[] ToArray()
4040
{
41-
var builder = new SparseArrayBuilder<TSource>(initialize: true);
41+
SparseArrayBuilder<TSource> builder = new();
4242

4343
bool reservedFirst = builder.ReserveOrAdd(_first);
4444
bool reservedSecond = builder.ReserveOrAdd(_second);
@@ -102,7 +102,7 @@ private TSource[] LazyToArray()
102102
{
103103
Debug.Assert(!_hasOnlyCollections);
104104

105-
var builder = new SparseArrayBuilder<TSource>(initialize: true);
105+
SparseArrayBuilder<TSource> builder = new();
106106
ArrayBuilder<int> deferredCopies = default;
107107

108108
for (int i = 0; ; i++)

src/libraries/System.Linq/src/System/Linq/Select.SpeedOpt.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ private sealed partial class SelectEnumerableIterator<TSource, TResult> : IIList
2222
{
2323
public TResult[] ToArray()
2424
{
25-
var builder = new LargeArrayBuilder<TResult>(initialize: true);
25+
LargeArrayBuilder<TResult> builder = new();
2626

2727
foreach (TSource item in _source)
2828
{
@@ -585,7 +585,8 @@ private TResult[] LazyToArray()
585585
{
586586
Debug.Assert(_source.GetCount(onlyIfCheap: true) == -1);
587587

588-
var builder = new LargeArrayBuilder<TResult>(initialize: true);
588+
LargeArrayBuilder<TResult> builder = new();
589+
589590
foreach (TSource input in _source)
590591
{
591592
builder.Add(_selector(input));

src/libraries/System.Linq/src/System/Linq/SelectMany.SpeedOpt.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public int GetCount(bool onlyIfCheap)
3131

3232
public TResult[] ToArray()
3333
{
34-
var builder = new SparseArrayBuilder<TResult>(initialize: true);
34+
SparseArrayBuilder<TResult> builder = new();
3535
ArrayBuilder<IEnumerable<TResult>> deferredCopies = default;
3636

3737
foreach (TSource element in _source)

src/libraries/System.Linq/src/System/Linq/Where.SpeedOpt.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public int GetCount(bool onlyIfCheap)
3434

3535
public TSource[] ToArray()
3636
{
37-
var builder = new LargeArrayBuilder<TSource>(initialize: true);
37+
LargeArrayBuilder<TSource> builder = new();
3838

3939
foreach (TSource item in _source)
4040
{
@@ -332,7 +332,7 @@ public int GetCount(bool onlyIfCheap)
332332

333333
public TResult[] ToArray()
334334
{
335-
var builder = new LargeArrayBuilder<TResult>(initialize: true);
335+
LargeArrayBuilder<TResult> builder = new();
336336

337337
foreach (TSource item in _source)
338338
{

0 commit comments

Comments
 (0)