C# プロパティ:ビギナー向けの包括ガイド

こんにちは、未来のコードスーパースター!今日は、C#のプロパティの世界に興味深い旅に出かけます。コードを書いたことがないとしても心配しないでください - 私があなたの親切なガイドになり、このトピックをステップバイステップで取り上げます。このチュートリアルの終わりには、プロパティのプロになっていただきます!

C# - Properties

プロパティとは?

まず、あなたがお猪口を持っていると想像してみてください。お金を入れることもできますし、お金を取り出すこともできますが、お猪口の中を直接アクセスすることはできません。C#のプロパティも同様に動作します - クラス内のプライベートフィールドの値にアクセスし、修正する方法を提供しながら、そのアクセス方法を制御し続けることができます。

プロパティを使う理由は何ですか?

  1. カプセル化:クラスの内部動作を隠すのに役立ちます。
  2. 柔軟性:データの保存方法を変更しても、アクセス方法は変わらないようにできます。
  3. 検証:データを設定する前に有効であることを確認するチェックを追加できます。

さあ、コードを書いてみましょう!

基本的なプロパティの構文

以下は、プロパティの最もシンプルな形式です:

public class Person
{
private string name;

public string Name
{
get { return name; }
set { name = value; }
}
}

この例では、Nameが私たちのプロパティです。これはプライベートフィールドnameに関連しています。getsetの部分はアクセサーと呼ばれます。

アクセサー

プロパティには主に2つのアクセサーがあります:

  1. get:プロパティの値を取得します
  2. set:プロパティに新しい値を割り当てます

私たちのNameプロパティを分解してみましょう:

public string Name
{
get { return name; } // これはゲッターです
set { name = value; } // これはセッターです
}

プロパティにアクセスするとき(例:person.Name)、ゲッターが呼び出されます。値を割り当てるとき(例:person.Name = "John")、セッターが呼び出されます。

オート実装プロパティ

C#には、特別なロジックが必要ないシンプルなプロパティのための省略形があります:

public class Person
{
public string Name { get; set; }
}

これは、C#が管理する隠されたバックフィールドを持つNameプロパティを作成します。まるで魔法のようです!

ロジックを持つプロパティ

さあ、私たちのプロパティに少し魅力を加えましょう:

public class BankAccount
{
private decimal balance;

public decimal Balance
{
get { return balance; }
set
{
if (value < 0)
{
throw new ArgumentException("Balance cannot be negative");
}
balance = value;
}
}
}

ここでは、バランスが決して負数にならないように確認しています。誰かが負のバランスを設定しようとすると、例外がスローされます。まるであなたのお猪口にボディーガードがいるようなものです!

読み取り専用と書き込み専用のプロパティ

時々、プロパティへのアクセスを制限したいと思うかもしれません:

public class SecretAgent
{
private string codeName = "007";

// 読み取り専用プロパティ
public string CodeName
{
get { return codeName; }
}

// 書き込み専用プロパティ
public string Mission
{
set { Console.WriteLine($"New mission: {value}"); }
}
}

ジェームズ・ボンドもこのレベルの秘密保持に賛成するでしょう!

表現式プロパティ

C# 6.0では、シンプルなプロパティのためのより簡潔な構文が導入されました:

public class Circle
{
public double Radius { get; set; }

// 表現式を使用した読み取り専用プロパティ
public double Area => Math.PI * Radius * Radius;
}

=>構文は、「このプロパティは以下の表現式で定義されています」と言っています。短くて甘くて数学的!

抽象プロパティ

抽象クラスでは、派生クラスが実装する抽象プロパティを定義できます:

public abstract class Shape
{
public abstract double Area { get; }
}

public class Square : Shape
{
public double Side { get; set; }

public override double Area => Side * Side;
}

まるでプロパティのための青写真を作成しているようなものです。

プロパティメソッドテーブル

以下は、プロパティに関連するメソッドの便利なテーブルです:

メソッド 説明
get プロパティの値を取得します get { return name; }
set プロパティの値を設定します set { name = value; }
init オブジェクト初期化時にのみプロパティの値を設定します public string Name { get; init; }
value セッター内で割り当てられる値を表します set { if (value != null) name = value; }

結論

おめでとうございます!あなたはC#のプロパティの世界への最初の一歩を踏み出しました。プロパティは、クラスのプライベートフィールドのアクセスを管理し、規則を強制し、整理整頓を保つ、優れたバトラーのようです。

コードの旅を続ける中で、プロパティはどこにでも現れます。彼らはクリーンでメンテナンス可能なC#コードを書くための重要な部分です。練習を続け、あなたのプロパティが常に適切に保護されることを祈っています!??‍??‍?

Credits: Image by storyset