namespace AddisonWesley.Michaelis.EssentialCSharp.Chapter06.Listing06_45
{
    using System;

    class CommonGuid
    {
        public static readonly Guid ComIUnknownGuid =
            new Guid("00000000-0000-0000-C000-000000000046");
        public static readonly Guid ComIClassFactoryGuid =
            new Guid("00000001-0000-0000-C000-000000000046");
        public static readonly Guid ComIDispatchGuid =
            new Guid("00020400-0000-0000-C000-000000000046");
        public static readonly Guid ComITypeInfoGuid =
            new Guid("00020401-0000-0000-C000-000000000046");
        // ...
    }

    class Program
    {
        public void Main()
        {
            // Uwaga: board.Cells nie wymaga inicjowania.
            TicTacToeBoard board = new TicTacToeBoard();
            Console.WriteLine(board.Cells);
        }
    }


    class TicTacToeBoard
    {
        // Ustawianie planszy, na której żaden gracz nie wykonał posunięcia.
        //    |   |          |   |
        // ---+---+---    ---+---+---
        //    |   |          |   |   
        // ---+---+---    ---+---+---
        //    |   |          |   |   
        // Gracz 1 - X   Gracz 2 - O
        public bool[,,] Cells { get; } = new bool[2, 3, 3];

        // Błąd: Nie można przypisać wartości do Cells,
        // ponieważ jest przeznaczona tylko do odczytu.
        // public void SetCells(bool[,,] value) =>
        //         _Cells = new bool[2, 3, 3];

        // ...
    }

    class TicTacToeBoardPreCSharp5
    {
        public TicTacToeBoardPreCSharp5()
        {
            // Ustawianie planszy, na której żaden gracz nie wykonał posunięcia.
            //    |   |
            // ---+---+---
            //    |   |   
            // ---+---+---
            //    |   |   
            _Cells = new bool[2, 3, 3];
        }

        private readonly bool[,,] _Cells;

        public bool[,,] Cells
        {
            get { return _Cells; }
        }

        // Błąd: nie można przypisać wartości do pola z modyfikatorem readonly 
        // (przypisanie może mieć miejsce wyłącznie w konstruktorze i inicjatorze zmiennej).
        // public void SetCells(bool[,,] value) =>
        //         _Cells = new bool[2, 3, 3];

        // ...
    }

}
