memo‎ > ‎

C#

・" " で囲まれた文字列は標準文字列と呼ばれ、@" " で囲まれた文字列は逐語的文字列と呼ばれる。
 逐語的文字列ではエスケープ文字は無視され、改行やタブはそのまま解釈され、 " と書きたい時は "" とする。
readonly キーワードは読み取り専用フィールドであることを宣言する。コンストラクタまたは変数初期化子でのみ初期化できる。
implicit キーワードはユーザー定義変換で明示的な変換であることを示す。explicit キーワードは暗黙的変換であることを示す。
is 演算子は実装を確認し、bool 型を返す。as 演算子は変換できない場合には null を返す。
typeof 演算子は指定した型の Type オブジェクトを返す。
・継承のサンプルコード
using System;

namespace ConsoleApplication1
{
  abstract class AbstractBase // 抽象クラス。継承しない限り、インスタンスを生成できない。
  {
    public void Write()
    {
      Console.WriteLine("AbstractBase");
    }

    public abstract void Something(); // 抽象メソッド。派生クラスでオーバーライドが必要。
  }
  sealed class Drive1 : AbstractBase // シールド付きクラス。Drive1 を継承できないようにする。
  {
    new public void Write()
    {
      Console.WriteLine("Drive1");
    }

    public override void Something() // 抽象クラスの実体。
    {
    }
  }

  class VirtualBase
  {
    public virtual void Write()
    {
        Console.WriteLine("VirtualBase");
    }
  }
  class Drive2 : VirtualBase
  {
    public sealed override void Write() // シールド付きメソッド。Write() メソッドをオーバーライドできないようにする。
    {
      Console.WriteLine("Drive2");
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      AbstractBase d1 = new Drive1();
      d1.Write(); // コンパイラが静的に型を判断するため AbstractBase を出力する。

      VirtualBase d2 = new Drive2();
      d2.Write(); // 実行時に動的に型を判断するため Drive2 を出力する。
    }
  }
}


・ユーザー定義変換のサンプル
using System;

namespace ConsoleApplication1
{
  class Rational
  {
    private Int32 m_i;

    public Rational(Int32 num)
    {
      m_i = num;
    }

    public Single ToSingle()
    {
      return (Single)m_i;
    }

    //暗黙的に Rational を作成する
    public static implicit operator Rational(Int32 num)
    {
      return new Rational(num);
    }

    public static implicit operator Single(Rational r)
    {
      Console.WriteLine("暗黙的な変換を行います。{0}", r.m_i);
      return r.ToSingle();
    }

    public static explicit operator String(Rational r)
    {
      Console.WriteLine("明示的な変換を行います。{0}", r.m_i);
      return r.ToString();
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      Rational r = 3;

      Single s1 = r;
      Single s2 = (Single)r; // 明示的な変換だが、明示的な変換を定義していないため暗黙的変換が行われる
//    String s3 = r; // エラー。明示的な変換を定義している場合、暗黙的変換はできない
      String s4 = (String)r;
    }
  }
}
 

リンク
Subpages (1):TextTemplate