Software_CS4

☆CSharp その4
(VisualC#)

┌──┐
│目次│
├──┘
│◎クラス class
│ ◆Mathクラス math
│ ◆Int32クラス int32
│ ◆double double
│ ◆Convertクラス convert
│ ◆Arrayクラス array
│ ◆Systems.Collections名前空間 collections
│ ◆Queueクラス queue
│ ◆TypeCode列挙体 typecode
│ ◆IConvertible インタフェース iconvertible
│ ◆IDisposable インタフェース idisposable
│ ◆DateTimeクラス datetime
│ ◆Environmentクラス env
│ ◆DataTableクラス datatable
│ ◆入出力クラス io
│ ◆System.Diagnostics空間 diag
│ ◆実行制御関連クラス exec
│ ◆デバッグ debug
│ ◆ネットワーク network


◎クラス


◆Mathクラス
using System;

_◇定数
①Math.PI
│ スタティックなフィールド。円周率。

_◇静的メソッド
①Floor
│ 小数点未満切捨て。負の数に対しても-∞方向に働く
②Ceiling
│ 小数点未満切り上げ。負の数に対しても0方向に働く

_◇丸め、切捨て
※Math.Round()メソッド
浮動小数点数引数
│ 1引数⇒もっとも近い整数に丸め込む
│ 2引数⇒特定の小数位までで丸め込む
⇒IEEE754 Section4に準拠し、丸め込まれる数字が2つの整数のちょうど間の数のとき、偶数に丸め込まれる
│ 1.5は2に、2.5も2に丸められる(銀行型丸め込み)

※丸め込まれる数字が2つの整数のちょうど間の数のとき、常に上に丸め込むには
│ Math.Floor(valueToRound + 0.5)

※整数の真ん中の値を常に下方の整数に丸め込む

public static double RoundDown(double valueToRound)
{
    double floorValue = Math.Floor(valueToRound);
    if ((valueToRound - floorValue) > .5)
    {
        return floorValue + 1;
    }
    else
    {
        return floorValue;
    }
}

※Math.Truncate()メソッド
│ decimal, doubleなどの整数部分の取得
│ ⇒0方向の最も近い整数

_◇定石
①度とラジアンの変換
│ Math.PI/180 を乗算する
※ラジアンから度の場合は、180 / Math.PI を乗算する


◆Int32クラス

_◇16進文字列からの変換

例)
string hexString = “8E2”;
int num = Int32.Parse(hexString, System.Globalization.NumberStyles.HexNumber);


◆double

_◇数値を表す文字列の有効性確認

※TryParse
│ ⇒任意の数値型のstaticメソッド。
│ Parseメソッドを使ったときに、例外なく数値を得られる場合にtrueを返す


◆Convertクラス

_◇n進変換
│ Convert.ToInt32(文字列, 2/8/10/16);
│ 2,8,10,16進数へ変換した整数を返す


◆Arrayクラス

_◇配列のソート
※Sort
│ staticメソッド
│ 配列をソートする。

例)
Array.Sort( ar );

例)複数のフィールドを持つクラス

   class Item : IComparable
   {
     public string name;
     public int price;
     public Item( string name, int price )
     {
       this.name = name;
       this.price = price;
     }
     public int CompareTo( object obj )
     {
       return price - ((Item)obj).price;
     }
   }

このようなクラス定義のItemの配列

       Item [] ar = {
         new Item("チョコ",50),
         new Item("煎餅",200),
         new Item("飴",10),
         new Item("ポテチ",100)
       };

に対して Array.Sort( ar ); でソートをかける

※IComparableというインターフェイスを通じて、CompareToというメソッドが呼ばれる

※CompareToメソッド
│ インスタンス自身と引数のインスタンスを比較
│ その結果として、整数型の値を返す。
│ 返す値の内容: 引数インスタンスよりも小さいときは、負の値、同じなら0、大きければ正の値


◆Systems.Collections名前空間

_◇ArrayListクラス
│ System.Collections

例)
ArrayList alist = new ArrayList();
alist.Add(“xxx”);

のようにオブジェクトを追加していく

※コレクションに追加された要素は、インデクサにより取り出すことができる。ただし、ArrayListにaddした時点で、要素はObject型となっているので、元の型に戻すにはキャストが必要。(逆に言えば、ArrayListにはいかなる型のオブジェクトでも格納できる)

例)
string greeting;
greeting = (string)alist[0];

※すべての要素を順番に処理する場合、foreach文を使用できる。

例)

foreach (string s in alist) {
    。。。
}

※定石
処理結果を配列として返すようなメソッドの場合
最終的に得られる要素の数が不定⇒内部的にArrayListクラスを利用してオブジェクトのリストを作成
⇒配列に変換して返す

string[] GetNames() {
  ArrayList list = new ArrayList();
  // ……
  // list.Add(……);によりいくつかの要素を追加
  // ……
  return (string [])list.ToArray(typeof(string));
}

_◇Listジェネリッククラス
System.Collections.Generic名前空間

List<T>
│ Tの部分に型パラメータを指定する

例)
List<string> stringList = new List<string>();

stringList.Add(“xx”);
。。。
string greeting;
greeting = stringList[0];
。。。
foreach (string s in stringList) {
。。。
}

_◇Dictionaryジェネリッククラス
System.Collections.Generic

キー(key)と値(value)のペアを保持しているコレクション

※Hashtableクラスのように object 型でなくジェネリックで定義されており、型チェックを効かせることができる。

Dictionary<TKey, TValue>

例)
Dictionary<string, string> myDict
= new Dictionary<string, string>();
。。。
myDict.Add(“key”, “value”);
。。。
string ans = myDict[“key”];
。。。
foreach (KeyValuePair<string, string> kv in myDict) {
。。。 kv.Key, kv.Value 。。。
}

※インスタンスの生成
コレクションの要素となるキーと値の型を型パラメータにより指定する

例)
Dictionary<string, string> dict = new Dictionary<string, string>();

※ハッシュテーブルへの項目の追加
①インデクサ
│ キーが存在しなければ、新規登録。キーが存在すれば書き換えられる
例)
dict[“japan”] = “日本”;
②Addメソッド
│ キーが存在しなければ、新規登録。キーが存在すれば例外発生。
例)
dict.Add(“china”, “中国”);

※ハッシュテーブル内の値の取得
①インデクサによりキーを指定する
例)
string val = dict[“japan”];
⇒指定キーが存在しない場合には例外発生
②すべてのキーあるいは値の取得
│ コレクションとしてKeysプロパティあるいはValuesプロパティから取得できる
例)

foreach (string key in dict.Keys) {
      Console.WriteLine("{0} : {1}", key, dict[key]);

③キーと値のペアの列挙
│ KeyValuePairジェネリック構造体を使う
例)

foreach (KeyValuePair<string, string> kvp in dict) {
  Console.WriteLine("{0} : {1}", kvp.Key, kvp.Value);
}

※キーや値の存在チェック
│ ContainsKeyメソッド
│ ContainsValueメソッド
例)

if (!dict.ContainsKey("france")) {
      // 存在しない場合
      dict["france"] = "フランス";
}

※ハッシュテーブルのソート
│ ソート済みのハッシュテーブルに代入する
│ ⇒ハッシュテーブルでは格納した要素の順序は保持されない
│ ⇒このような操作をしないと順序を確定できない

例)
SortedDictionary<string, string> sdict = new SortedDictionary<string, string>(dict);

_◇Hashtableクラス
│ System.Collections.Hashtable
│ キー(key)と値(value)のペアを保持しているコレクション

例)
Hashtable h = new Hashtable();
h[“斉藤”] = “Windows 2000”;
h[“田中”] = “Windows 98”;
h[“鈴木”] = “FreeBSD”;

※Hashtableクラスのインデクサは、読み書きする値も添え字もobject型として定義されている

_◇Queueクラス

※System.Collections.Queueクラス
│ 要素がobject型

※System.Collections.Generic.Queueクラス
│ Generics
│ 特定のデータ型のみを要素に格納できる

※プロパティ
Count 格納されている要素数

※メソッド
Clear 全ての要素を削除。容量は変化しない

TrimExcess 容量を小さくする。実際の要素数が現在容量の90%未満の場合に動作する

Contains 引数のオブジェクトがキュー内にそんざいすればtrue

CopyTo キューの要素を既存の一次元配列にコピー。配列に格納できる要素数はキューより大きくないと例外発生

Dequeue 先頭のオブジェクトを取り出す(キューから削除)

Enqueue 末尾にオブジェクトを追加

Peek 先頭のオブジェクトを返すが削除しない

ToArray 要素を格納した新たな配列を作って返す


◆Queueクラス

※System.Collections.Queueクラス
│ 要素がobject型

※System.Collections.Generic.Queueクラス
│ Generics
│ 特定のデータ型のみを要素に格納できる

※プロパティ
Count 格納されている要素数

※メソッド
Clear
│ 全ての要素を削除。容量は変化しない
TrimExcess
│ 容量を小さくする。実際の要素数が現在容量の90%未満の場合に動作する
Contains
│ 引数のオブジェクトがキュー内に存在すればtrue
CopyTo
│ キューの要素を既存の一次元配列にコピー。配列に格納できる要素数はキューより大きくないと例外発生
Dequeue
│ 先頭のオブジェクトを取り出す(キューから削除)
Enqueue
│ 末尾にオブジェクトを追加
Peek
│ 先頭のオブジェクトを返すが削除しない
ToArray
│ 要素を格納した新たな配列を作って返す


◆TypeCode列挙体
│ オブジェクトの型を指定する
│ System空間
│ public enum TypeCode

※IConvertibleインタフェースを実装するクラス
│ ⇒GetTypeCodeメソッドで型コードを取得できる

※オブジェクトのGetTypeメソッドでTypeオブジェクトを得
│ ⇒TypeオブジェクトのGetTypeCodeで型コードを取得


◆IConvertible インタフェース
│ 実装型のインスタンスの値を、値と等価な共通言語ランタイム型に変換するメソッドのインタフェース


◆IDisposable インタフェース
│ 確実にリソースのクリーンアップを行うために実装する

Disposeメソッド

※usingステートメントの対象オブジェクトとできる


◆DateTimeクラス

_◇static DateTime.Parseメソッド

例)
DateTime.Parse(@”May 10, 2003″)


◆Environmentクラス

_◇プラットフォームに依存しない改行文字

※読み取り専用プロパティ
│ Environment.NewLine
│ 改行文字。フレームワーク提供のすべてのWriteLineメソッドで使われる。


◆DataTableクラス

例)新たなデータテーブルの生成
DataTable t = new DataTable(“TEST”);

例)新たなデータテーブルにカラムを追加

DataColumn column;

// Uniq Key
column = new DataColumn();
column.DataType = System.Type.GetType(“System.UInt32”);
column.ColumnName = “ID”;
column.AutoIncrement = false;
column.ReadOnly = false;
column.Unique = true;
t.Columns.Add(column);

例)プライマリキーの設定
DataColumn[] pkeyCols = new DataColumn[1];
pkeyCols[0] = taglist.Columns[“D”];
t.PrimaryKey = pkeyCols;

例)ロウの追加
DataRow row;

row = t.NewRow();
row[“ID”] = id;
t.Rows.Add(row);

例)ロウをなめる

foreach (DataRow row in t.Rows)
{
  Console.WriteLine(row.Field<UInt32>(0));
}


◆入出力関連クラス

_◇System.Consoleクラス

WriteLine()

Write()

※書式設定

{index[,alignment][:formatString]}
    index
        値リストの対応要素の識別. 0~
    alignment
        フィールド幅,マイナスなら左揃
    formatString
        書式設定文字列
            Axx
                A    書式指定子
                    D    10進
                    X    16進(大文字)
                    x    16進(小文字)
                    E    指数(大文字)
                    e    指数(小文字)
                    G    一般形式
                    g    一般形式
                    C    通貨
                    F    浮動小数
                    N    数値形式
                    P    パーセント形式
                xx    精度指定子
                    0~99.
                    小数部の有効桁もしくは0の数
            0もしくは#からなるカスタム書式指定
                #の場合数字がなければ空白。0なら0
            Datetime指定
                d
                f
                F
                g
                G
                M
                R
                s
                t
                T
                u
                U
                y
            カスタムDateTime指定
                MMDDyyyyhms

Readline()
│ 標準入力ストリームから1行分の文字列を取得する
例)

string line;
while ((line = Console.ReadLine()) != null)
{
  string newLine = "+" + line + "+";
  Console.WriteLine(newLine);
}

ReadKey()
│ 標準入力ストリームから1文字の文字キーコードを取得
│ ConsoleKeyInfo型のデータを返す。
│ ConsoleKeyInfo型のインスタンスのKeyCharプロパティによりUnicode文字が取得できる。
│ ※ReadKey()に与える引数として、trueを与えることにより押されたキー情報は非表示となる。
│ 例)
│ kinf = Console.ReadKey(true);

Read()
│ 標準入力ストリームから1文字入力しつつ、Enterを押すまで待機状態となる。
│ 入力されたコード(Enterキーの0x0dを含む)が呼ばれる度にint型の値として返る。

Beep(Hz, ms)
│ PCのBEEP音を鳴らす。
│ Hzは音の周波数(37Hzから32767Hz),msは音の持続時間(ミリ秒)。
│ パラメータを指定しないと800Hz,200msならす。

_◇System.IO.StreamReader, System.IO.StreamWriter
│ テキストファイルの読み書き

using System;
using System.IO;

※書き込み

using(StreamWriter w = new StreamWriter(@"test\test.txt"))
{
    w.WriteLine(。。。);
    w.Write(。。。);

※読み出し

using(StreamReader r = new StreamReader(@"test\test.txt"))
  {
    string line;
    while( (line = r.ReadLine()) != null) 
      {

※StreamWriterクラスの改行文字の変更例
StreamWriter sw= new StreamWriter(file);
。。。
sw.NewLine = Environment.NewLine + Environment.NewLine;

_◇System.IO.BinaryReader, System.IO.BinaryWriter
バイナリ形式での読み書き

using System;
using System.IO;

※書き込み

using(BinaryWriter w = new BinaryWriter(File.OpenWrite(@"test\binary")))
    {
      w.Write(new byte[]{(byte)0x01, (byte)0x23, (byte)0x45, (byte)0x67, });
      w.Write((int)123456789);

※読み出し

using(BinaryReader w = new BinaryReader(File.OpenRead(@"test\binary")))
    {
      try
      {
        for(;;)
          w.ReadByte());
        。。。
      }
      catch(EndOfStreamException)
      {
        。。。

w.ReadByte()
w.ReadInt32()
w.ReadSingle()

_◇System.IO.Directory

ディレクトリを読み書きするための static メソッドを持つ静的クラス。

例)
using System;
using System.IO;

Directory.Exists(“ディレクトリ名”)
Directory.CreateDirectory(“ディレクトリ名”)

①ディレクトリのタイムスタンプの取得
Directory.GetCreationTime(path);
Directory.GetLastAccessTime(path);
Directory.GetLastWriteTime(path);

②ディレクトリのタイムスタンプの変更
Directory.SetCreationTime(path, datetime);
Directory.SetLastAccessTime(path, datetime);
Directory.SetLastWriteTime(path, datetime);

③ディレクトリのリネーム、移動
移動元と移動先のディレクトリ名を指定

例)
Directory.Move(“移動元”, “移動先”);

※操作に失敗すると IOException が返る

④ディレクトリに含まれる全てのファイル名とディレクトリ名の列挙
Directory.GetFileSystemEntries(path)
例)

string[] items = Directory.GetFileSystemEntries(path);
foreach(string item in items)
{
  。。。

⇒返される文字列にはフルパスが含まれる

※ディレクトリ名のみ、ファイル名のみの場合
GetDirectories(path)
GetFiles(path)

※パターン一致をするばあい
GetFileSystemEntries(path, pattern)
GetDirectories(path, pattern)
GetFiles(path, pattern)
⇒patternには、InvaildPathCharsと「..」は使用できない。
拡張子が3文字の場合のみ、拡張子の最初の3文字と一致する全ての拡張子のファイルが検索される。拡張子が2文字以下か、4文字以上のとっきは完全一致検索

_◇System.IO.DirectoryInfoクラス

特定のディレクトリに関してインスタンスを作成し、そのディレクトリ情報を取り出すためのクラス

例)

using System;
using System.IO;

DirectoryInfo dir = new DirectoryInfo("test")
foreach(FileInfo f in dir.GetFiles())
    {
      string name = f.Name;
      string ext  = f.Extension;
      DateTime t = f.CreationTime;

※プロパティ
①タイムスタンプを取得/変更するためのプロパティ
CreationTime
LastAccessTime
LastWriteTime

⇒DateTime型

②ファイル属性の表示/変更
Attributesプロパティ
FileAttributes列挙体の一つ以上のメンバを含むビットマスク
例)

DirectoryInfo dirinfo = new DirectoryInfo(path);
  。。。
  dirinfo.Attributes & FileAttributes.Hidden ==
  。。。
  
  dirinfo.Attributes |= FileAttributes.Hidden;

※インスタンスメソッド
①ファイル名の変更、移動
MoveTo(path名);

例)
dirinfo.MoveTo(newName);

②ディレクトリに含まれる全てのファイル情報とディレクトリ情報の列挙
⇒FileSystemInfo(DirectoryInfoもしくはFileInfo)オブジェクトの配列が得られる

GetFileSystemInfos()
GetDirectories()
GetFiles()

例)

DirectoryInfo mainDir = new DirectoryInfo(path);
IEnumerable<string> fileSystemDisplayInfos =
 from fsi in mainDir.GetFileSystemInfos()
 where fsi is FileInfo || fsi is DirectoryInfo
 select fsi.ToDisplayString();

foreach (string s in fileSystemDisplayInfos)
{
 。。。

※パターン一致をするばあい
GetFileSystemInfos(pattern)
GetDirectories(pattern)
GetFiles(pattern)
⇒patternには、InvaildPathCharsと「..」は使用できない。
拡張子が3文字の場合のみ、拡張子の最初の3文字と一致する全ての拡張子のファイルが検索される。拡張子が2文字以下か、4文字以上のときは完全一致検索

_◇System.IO.Fileクラス
│ ファイルに関する操作についてのstaticなメソッドを集めたクラス

①ファイルコピー
│ コピー元とコピー先のファイル名を指定
例)
File.Copy(“コピー元”, “コピー先”);

※例外の発生
│ アクセス権がない
│ コピー元のファイルがない
│ コピー先のファイルがすでに存在する(上書きしないとき)

※上書きコピー
│ 3つ目のパラメータとしてtrueを指定する

②ファイル削除
例)
File.Delete(“ファイル名”);

③ファイルのリネーム、移動
│ 移動元と移動先のファイル名を指定
例)
File.Move(“移動元”, “移動先”);

※ファイル名を変更しない場合でも、移動先にはファイル名を指定しなければならない

④ファイルのタイムスタンプの取得
File.GetCreationTime(path);
File.GetLastAccessTime(path);
File.GetLastWriteTime(path);

⑤ファイルのタイムスタンプの変更
File.SetCreationTime(path, datetime);
File.SetLastAccessTime(path, datetime);
File.SetLastWriteTime(path, datetime);

⑥ファイルの書き出し
File.WriteAllText(fileName, contents)

_◇System.IO.FileInfoクラス
│ 特定のファイルを指定してインスタンスを作成
│ それに対してファイル操作のための各メソッドの呼び出しを行う

※プロパティ
①タイムスタンプを取得/変更するためのプロパティ
CreationTime
LastAccessTime
LastWriteTime

⇒DateTime型

②ファイル属性の表示/変更
Attributesプロパティ
FileAttributes列挙体の一つ以上のメンバを含むビットマスク
例)

FileInfo fileinfo = new FileInfo(path);
  。。。
  file.Info.Attributes & FileAttributes.Hidden ==
  。。。
  
  fileInfo.Attributes |= FileAttributes.Hidden;

※インスタンスメソッド
①ファイル名の変更、移動
MoveTo(path名);

例)
fileinfo.MoveTo(newName);

_◇System.IO.Pathクラス
ファイルやフォルダを操作するためのスタティッククラス

※スタティックメソッド
Path.GetTempFileName()
一意な名前を持つ一時ファイルをディスク上に作成し、そのファイルの完全パスを返す。

_◇System.IO.FileSystemWatcherクラス
ファイルシステムを監視するためのクラス

設定例)
FileSystemWatcher w = new FileSystemWatcher();
w.Path = @”DIR\”;
w.Filter = “*.dat”;
w.IncludeSubdirectories = false;
w.Notifyfilter = NotifyFilters.FileName;
w.Created += new FileSystemEventHandler(メソッド名);
⇒Createされたときにメソッドが呼び出される
w.EnableRaisingEvents = true;

_◇DateTimeクラス
※Nowプロパティ
│ 現在日付と時刻を取得する

_◇SystemSoundsクラス
│ System.Media名前空間
│ 以下の静的プロパティのPlayメソッドを呼び出すことでシステムサウンドの再生が可能。void型

①SystemSounds.Beep.Play();
│ ビープ音
②SystemSounds.Exclamation.Play();
│ メッセージ(警告)音
③SystemSounds.Asterisk.Play();
│ メッセージ(情報)音
④SystemSounds.Question.Play();
│ メッセージ(問い合わせ)音
⑤SystemSounds.Hand.Play();
│ システムエラー音

_◇FileAttributes列挙体

Archive アーカイブ
Compressed 圧縮
Device 予約
Directory ディレクトリ
Encrypted 暗号化
Hidden 隠しファイル
NotContentIndexed 内容インデックス付除外
Offline オフライン
ReadOnly リードオンリ
ReparsePoint リパースポイント
SparseFile スパースファイル
System システムファイル
Temporary 1時ファイル、メモリ内保持

Normal 一般ファイル、他の属性なし

_◇パスの指定方法
①カレント・ディレクトリ
“newfile.txt”

②相対パス
@”sub\newfile.txt”

③絶対パス
@”c:\tmp\newfile.txt”

※@による指定
「@”c:\tmp\newfile.txt”」

「”c:\\tmp\\newfile.txt”」


◆System.Diagnostics空間

_◇Stopwatchクラス
例)

    Stopwatch sw = new Stopwatch();
    sw.Start();
    sw.Stop();
//sw.ElapsedMillisecondsでStart,Stop間の時間が分かる
    sw.Reset(); // リセット

_◇Processクラス

※他のアプリケーションの実行
例)
using System.Diagnostics;
。。。
Process.Start(@”C:\path\xxx.exe”);

例)パラメータ指定する
using System.Diagnostics;
。。。
Process.Start(@”C:\path\xxx.exe”, @”C:\path\xxx.ini”);

※上記の起動方法では、アプリケーションがコンソールアプリの場合、コンソール・ウインドウが開く。
→ProcessStartInfoクラスを介して起動することで制御可能
例)
ProcessStartInfo psInfo = new ProcessStartInfo();
psInfo.FileName = @”c:\path\xxx.exe”;
psInfo.CreateNoWindow = true;
psInfo.UseShellExecute = false;
Process.Start(psInfo);


◆実行制御関連クラス

_◇System.Threading.Threadクラス

※プロパティ
thread.IsBackground = true;
// trueでバックグラウンド・スレッド

thread.Priority = ThreadPriority.Highest;
//優先度を「最優先」にする

※インスタンスメソッド

thread.Suspend(); // スレッドの一時停止
thread.Resume(); // スレッドの再開
thread.Join(); // スレッドの処理が終了するまで待つ
thread.Abort(); // スレッドの強制終了

※スタティックメソッド

Thread.Sleep(1000); // 1秒間待つ

_◇System.Threading.ThreadPoolクラス


◆デバッグ

_◇System.Diagnostics.Debug

Assert( 条件, “メッセージ” );

※コンパイルシンボル DEBUG を定義する必要がある
│ #defineによるか

│ プロジェクトのプロパティ>ビルドの
│ 条件付きコンパイルシンボルにシンボルを入力


◆ネットワーク

_◇TcpListenerクラス
│ TCPサーバをつくるためのクラス

※手順
①TcpListenerクラスのstartメソッドによりListen開始
②接続要求くれば、AcceptTcpClientメソッドにより、接続を受け付ける
③AcceptTcpClientメソッドで返されるTcpClientオブジェクトのGetStreamメソッドによりNetworkStreamを取得④以後NetworkStreamにより送受信する
⑤Tcpを閉じる。
⑥リスナを閉じる

_◇TcpClientクラス
│ TCPクライアントをつくるためのクラス

※手順
①TcpClientクラスのコンストラクタ(あるいはConnectメソッド)によりサーバと接続する
②サーバとの接続に成功したところで、TcpClientクラスのGetStreamメソッドによりNetworkStreamを取得する。
③以後NetworkStreamにより送受信する
④Tcpを閉じる。

_◇Socketクラス