・" " で囲まれた文字列は標準文字列と呼ばれ、@" " で囲まれた文字列は逐語的文字列と呼ばれる。
逐語的文字列ではエスケープ文字は無視され、改行やタブはそのまま解釈され、 " と書きたい時は "" とする。
・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;
}
}
}