C# 8.0 搶先看 -- Ranges and Indicies (3) Range 在 .NET Core preview 3 的變更

Range 結構的定義在 .NET core preview 3 - 010184 做了改變。

本篇文章使用環境
開發環境 Visual Studio 2019 Preview 4 (16.0.0 Preview 4)
框架       .NET Core 3.0.100-preview3-010431
編譯器    C# 8.0 beta

今天很開心的更新了 .NET Core 到 preview 3  10431 ( 之前曾經不小心下載過 10272,後來那個下載點就變成 10184,猜想應該是我下載的當兒微軟放錯版本導致),發現  Range structure 的內容被改變了,在此紀錄一下其變化內容。

以前在 preview 版本時代, Range structure 是長這樣的:

namespace System
{
    public struct Range : IEquatable<Range>
    {
        public Index End { get; }
        public Index Start { get; }

        public static Range All();
        public static Range Create(Index start, Index end);
        public static Range FromStart(Index start);
        public static Range ToEnd(Index end);
        public override bool Equals(object value);
        public bool Equals(Range other);
        public override int GetHashCode();
        public override string ToString();
    }
}

在 preview 3 後,改變成以下的形式:

public struct Range : IEquatable<Range>
    {
        public Range(Index start, Index end);

        public static Range All { get; }
        public Index End { get; }
        public Index Start { get; }

        public static Range EndAt(Index end);
        public static Range StartAt(Index start);
        public override bool Equals(object value);
        public bool Equals(Range other);
        public override int GetHashCode();
        public OffsetAndLength GetOffsetAndLength(int length);
        public override string ToString();

        public struct OffsetAndLength
        {
            public OffsetAndLength(int offset, int length);

            public int Offset { get; }
            public int Length { get; }

            public void Deconstruct(out int offset, out int length);
        }
    }

幾個重要的改變說明如下:

(1) 移除了 static Range Create(Index start, Index end) method,將 Range 的建構函式的存取修飾改為 public。

(2) 原有的 static All() method,改為 static All { get; } property

(3) 原有的 static Range FromStart(Index start) method 更名為 static Range StartAt(Index start) method

(4) 原有的 static Range ToEnd(Index end); method 更名為 static Range EndAt(Index end) method

(5) 以巢狀型別方式在內部新增  OffsetAndLength structure

(6) 新增 public OffsetAndLength GetOffsetAndLength(int length) method

註:依據Consider removing Range.OffsetAndLength目前的討論內容 (5) 和  (6) 可能還會再改。