■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();
}
}
}
|
|