rksoftware

Visual Studio とか C# とかが好きです

C# 2.0 以降の新機能の確認 - C# 2.0 - static クラス

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

static クラス

 https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/static-classes-and-static-class-members
 new キーワードを使用して、そのクラス型の変数を作成できないクラスを定義できる。class の前に static をつける。

class Program
{
    static void Main(string[] args)
    {
        // A a = new A(); <- これはできない
        A.PropertyA = 1;
        Console.WriteLine(A.PropertyA);   // 1
    }
}

static class A
{
    public static int PropertyA { get; set; }
}

C# 2.0 以降の新機能の確認 - C# 2.0 - プロパティの get/set 個別のアクセスレベル

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

プロパティの get/set 個別のアクセスレベル

 https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/restricting-accessor-accessibility
 プロパティの get アクセサーと set で異なるアクセス レベルを設定できる。

class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        // a.PropertyA = 1; <- set は private なのでこれはできない
        a.SetPropertyA(10);
        Console.WriteLine(a.PropertyA);   // 10
    }
}

class A
{
    public int PropertyA { get; private set; }
    public void SetPropertyA(int value) { PropertyA = value; }
}

C# 2.0 以降の新機能の確認 - C# 2.0 - ?? 演算子

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

?? 演算子

 https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/null-conditional-operator
 null 合体演算子と呼ばれる。左側のオペランドが null 値でない場合には左側のオペランドを返し、null 値である場合には右側のオペランドを返す。

string a = "a";
string b = null;
Console.WriteLine(a ?? "a is null");    // a
Console.WriteLine(b ?? "b is null");    // b is null

C# 2.0 以降の新機能の確認 - C# 2.0 - Null 許容型 (Nullable)

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

Null 許容型 (Nullable)

 https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/nullable-types/
 Null 許容型は、基になる値型の値だけでなく、null 値も表すことができる。型名の後ろに ? をつけて変数宣言する。Value プロパティ等で値型で値を取り出せるが、多くの場所で Null 許容型のままでも期待する結果になる。

int? a = 1;
a = null;
Console.WriteLine(a == null);   // True
a = 1;
Console.WriteLine(a.Value);     // 1
Console.WriteLine(a);           // 1

C# 2.0 以降の新機能の確認 - C# 2.0 - 部分型定義 (Partial クラス/構造体)

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

部分型定義 (Partial クラス/構造体)

 https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/partial-type
 クラス、構造体、またはインターフェイスの定義を複数のファイルに分割することができる。

class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        a.A1(); // A1 を出力
        a.A2(); // A2 を出力
    }
}

partial class A
{
    public void A1()
    {
        Console.WriteLine("A1");
    }
}

partial class A
{
    public void A2()
    {
        Console.WriteLine("A2");
    }
}

C# 2.0 以降の新機能の確認 - C# 2.0 - 反復子 (yield)

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

反復子 (yield)

 https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/concepts/iterators
 反復子を使用して、リストや配列などのコレクションをステップ実行することができる。

static void Main(string[] args)
{
    foreach (int number in Values())
    {
        Console.WriteLine(number.ToString());
    }
    // 1
    // 2
    // 3
    // と出力
}

public static IEnumerable<int> Values()
{
    yield return 1;
    yield return 2;
    yield return 3;
}

C# 2.0 以降の新機能の確認 - C# 2.0 - 匿名メソッド

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

匿名メソッド

 https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/statements-expressions-operators/anonymous-methods
 [推奨されません(※)] delegate をインライン コードで生成できる。 (※)C# 3.0 で追加されたラムダ式を使用してください。

System.Threading.Timer t = new System.Threading.Timer(
    delegate (object state) { Console.WriteLine("delegate"); } // 匿名メソッド
    , null, 0, 1000
    );
// "delegate" を繰り返し出力