C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

インデクサーとは何かについて学んでいます

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■88071 / inTopicNo.1)  インデクサーとは何かについて学んでいます
  
□投稿者/ KATO (1回)-(2018/07/31(Tue) 19:55:34)

分類:[.NET 全般] 

インデクサーとは何かについて検索しました。


https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/indexers/

ここを見ました。


まず最初の
class SampleCollection<T>で躓きました。

クラス名に<>をつける事を何と言いますか?













引用返信 編集キー/
■88072 / inTopicNo.2)  Re[1]: インデクサーとは何かについて学んでいます
□投稿者/ モモ (1回)-(2018/07/31(Tue) 20:50:53)
No88071 (KATO さん) に返信

> クラス名に<>をつける事を何と言いますか?

ジェネリック型の型パラメータを定義するって言います

引用返信 編集キー/
■88077 / inTopicNo.3)  Re[1]: インデクサーとは何かについて学んでいます
□投稿者/ WebSurfer (1571回)-(2018/08/01(Wed) 13:00:01)
No88071 (KATO さん) に返信

> まず最初の class SampleCollection<T>で躓きました。

<T> は何かとか考えなくて済む ↓ こちらの方が分かりやすいかも。

インデクサーの使用 (C# プログラミング ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/indexers/using-indexers


以前自分が勉強していた時、分かりやすいと思ったチュートリアルのコードが残っていたのでご参考に
アップしておきます。URL は残念ながら見つかりません。

using System;
using System.IO;

// インデクサのチュートリアル
//
// クラスのメンバにインデクサを定義すると、そのクラスのオブジェクトのメンバには [] 配列アクセ
// ス演算子を使用してアクセスできる。
//
// 注: file[i] という書き方をするので紛らわしいが、その意味は、file が指すオブジェクトにおい
//      て、インデクサの定義に従って i が指すメンバにアクセスするということ。(オブジェクトの
//      配列を作ってその i 番目にアクセスするということではない)
//
// インデクサは強力な機能だが、配列形式の抽象化が妥当である場合に限り使用すべき。通常のメソッ
// ドの使用とどちらが適しているかを慎重に考慮すること。
//      
// 以下のサンプルでは、ファイル(正確には、FileStream インスタンスへの参照型変数)と、そのフ
// ァイルの特定のバイトにアクセスできるよう定義されたインデクサをメンバに持つクラスを定義する。
// そのクラスの参照型を file と定義し、インスタンスを作成してその参照値を file に代入すれば、
// file[i] で i が指す位置のファイルのバイトに、プロパティと同様な形でアクセスできる。

namespace Tutorial_03
{
    public class FileByteArray
    {
        Stream stream;   // Stream は abstract クラス(他のクラスの基本クラスとなるのみ)

        public FileByteArray(string fileName) // 名前 fileName のファイルをオープン
        {
            stream = new FileStream(fileName, FileMode.Open);
        }

        public void Close() // ファイルをクローズするメソッド
        {
            stream.Close();
            stream = null;
        }

        // インデクサ
        // プロパティとは、名前がない点とアクセサがパラメータ(index)を受け取る点が異なる。
        public byte this[long index]
        {
            // ファイルから index 位置の1バイトを読んで返す
            get
            {
                byte[] buffer = new byte[1];
                stream.Seek(index, SeekOrigin.Begin);   // FileStream で override したメソッド
                stream.Read(buffer, 0, 1);              // 同上
                return buffer[0];
            }
            // ファイルの index 位置に1バイトを書き込む
            set
            {
                byte[] buffer = new byte[1] { value };
                stream.Seek(index, SeekOrigin.Begin);
                stream.Write(buffer, 0, 1);             // FileStream で override したメソッド
            }
        }

        // ファイルのバイト数を返すプロパティ
        public long Length
        {
            get
            {
                return stream.Seek(0, SeekOrigin.End);
            }
        }
    }

    // 試験用クラス。ファイルのバイトの並びをひっくり返す
    // 改行は Windows のテキストファイルでは CR と FF だが、この順序を反対にして NotePad で
    // 見ると文字化けしたように見えるので注意。コマンドプロンプトで type コマンドで見れば OK
    // 日本語(2バイトコード)はバイト単位で並びをひっくり返すと文字化けするので注意。
    public class Reverse
    {
        public static void Main(string[] args)
        {
            if (args.Length == 0)   // 引数がない場合
            {
                Console.WriteLine("tutorial_03 <filename>");
                return;
            }

            FileByteArray file = new FileByteArray(args[0]);
            long len = file.Length;     // ファイルの大きさ(バイト数)

            for (long i = 0; i < len / 2; ++i)
            {
                byte t;
                t = file[i];    // インデクサの get を呼び位置 i の byte を得て t に代入
                file[i] = file[len - i - 1]; // len-i-1 位置の byte を i の位置に書き込む
                file[len - i - 1] = t;       // len-i-1 位置に t を書き込む
            }

            file.Close();
        }
    }
}

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ