いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

C#4.0の追加機能-05(オプション引数と名前付け引数-2, コンストラクタ, インデクサ, constructor, indexer)


引き続き、オプション引数と名前付け引数についてです。
とはいっても、前回と内容はあんまり変わりません。


オプション引数と名前付け引数は、メソッドだけでなく
コンストラクタやインデクサにも適用できます。


ただし、インデクサの場合、最初の引数にはオプショナル引数を設定できません。
定義できるのは2番目の引数からです。


やり方は、前回と同じです。


以下、サンプルです。

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;

namespace NamedAndOptionalParameters02 {

    class Program {
        static void Main(string[] args) {
            (new Program()).Execute();

            Console.WriteLine("Press any key to exit...");
            Console.ReadLine();
        }

        private void Execute() {
            //
            // オプショナル引数と名前付け引数は
            // メソッドだけでは無く、コンストラクタやインデクサにも
            // 適用できる。
            //
            // 但し、インデクサの場合は最初の引数をオプショナルにすることは出来ません。
            // (コンパイルエラーとなります。)
            // オプショナル引数を定義出来るのは2番目の引数からです。
            //

            //
            // コンストラクタの引数省略.
            //
            var data = new SampleData();

            //
            // インデクサの引数省略.
            //
            Console.WriteLine(data[0]);
            Console.WriteLine(data[0, 1]);
        }

        class SampleData {
            
            DataTable _table;

            public SampleData(DataTable initialData = null) {
                _table = LoadTableData();
            }

            // public object this[int row = 0] はエラーとなる.
            public object this[int row, int col = 0] {
                get {
                    if (row < 0 || col < 0) {
                        return string.Empty;
                    }

                    if (row >= _table.Rows.Count) {
                        return string.Empty;
                    }

                    if (col >= _table.Columns.Count) {
                        return string.Empty;
                    }

                    return _table.Rows[row][col];
                }
            }

            private DataTable LoadTableData() {
                
                DataTable table = new DataTable();

                table.Columns.Add("Id", typeof(int));
                table.Columns.Add("Name");

                for(int i = 0; i < 10; i++) {
                    table.LoadDataRow(new object[]{ i, string.Format("xxxx_{0}", i) }, true);
                }

                return table;
            }

        }
    }
}