C#におけるメソッドとプロパティの違い

こんにちは。悩めるエンジニアの糸賀です。
突然ですが、例1をご覧ください。Carクラスの中にメソッドとプロパティが一つずつあります。それらの処理は同じです。設定ファイルを参照し、そのオブジェクトのIDにマッチする馬力を取得しています。
例1

public class Car
{
	// Method
	public int GetHorsepower()
	{
		var hpTableRow = Config.HorsepowerTable
			.FirstOrDefault(row => (row.CarId = this.Id));
		return (hpTableRow != null)
			? hpTableRow.Horsepower
			: 0;
	}
	
	// Propetry
	public int Horsepower { 
		get
		{
			var hpTableRow = Config.HorsepowerTable
				.FirstOrDefault(row => (row.CarId = this.Id));
			return (hpTableRow != null)
				? hpTableRow.Horsepower
				: 0;
		} 
	}
	public string Id { get; set; }
}


このようなコードを見て私は、”あれれー、メソッドとプロパティって何が違うの?”、”あれれー、どう使い分ければいいの?”と疑問を持ちました。

そこでこの記事では、初心に立ち返りC#におけるメソッドとプロパティの違いについて解説します。細かい処理速度やメモリ使用量の違いなどの検証はせず、より概念的なアプローチで進めます。
C#バージョン: 5.0
最終更新日: 2021/05/29

そもそもメソッドとは


メソッドとは処理の塊です。もう少し具体的に言うと、オブジェクトに紐づいた何らかの処理を行うコードの集まりのことで、時には何らかの値を返したり、引数を受け取ったりします。

ちなみに、今回の議題とは関係はないですが、引数とパラメータの違いについて少しお話します。引数は実際にそのメソッドの実行時にメソッドが受け取る値のことで、パラメータはその引数が入った変数のことを指します。言い換えると、メソッドが受け取った値を使うためにパラメータを使い、そのパラメータに入った値のことを引数と呼びます。例2でいうと、”2,” “4”が引数で”x,” “y”がパラメータです。

例2

	static void Main(string[] args)	{		Multiply(2, 4);	}	public static int Multiply(int x, int y)
	{
		var result = x * y
		return result;
	}

そもそもプロパティとは


メソッドの一種です。クラスや構造体の中に定義され、値を取得したり値をメンバ変数に代入できます。また少し脱線しますが、プロパティを定義すると暗黙的にメンバ変数とメンバ変数の値を取得するためのgetメソッドと、メンバ変数に値を代入するためのsetメソッドが生成されます。

メソッドとプロパティの違い


これらはほぼ同じで、”これは状態を表しています”、という約束があるかどうかです。
皆さんは今までにメソッドは主に処理を指すのに対して、プロパティは状態を表すと聞いたことがあるかもしれません。しかし、前述していますがプロパティはメソッドの一種です。つまり、実際はC#においてこれに関する技術的な制約はなく、例1のようにプロパティ内にメソッドに書くような処理でも記述できます。
しかしながら、この件に関しては開発者間の共通認識なるものが存在し、それが開発の最適化の役割を果たしています。わかりやすく言うと、”開発者の中でこういう共通認識を持っておいてね”というお約束のおかげで開発が楽になるということです。”メソッドはオブジェクトの操作であり、処理が多くなることもあれば、処理による副作用がある”という共通認識を、”プロパティはオブジェクトの状態を表しており、処理が軽く、重大な副作用はない”という共通認識を開発者の間で持つことで、コード上でより多くの情報を得られます。例えば、”ここでは、メソッドを実行しているのか。どこかの値が変わっているかもしれないな”、”ここではプロパティを読んでいるのか。特に副作用はない軽い処理なのだな”などを知れます。

まとめ

  • プロパティはメソッドの一種。
  • メソッド内で記述する処理をプロパティ内では記述できないなどの技術的制約はない。
  • メソッドは操作処理、プロパティは状態取得などの軽い処理をするという口約束を開発者が守ることで開発がより楽になる。

参考文献

Griffiths, I., ed. Programming C# 5.0: Building Windows 8, Web, and Desktop Applications for the .NET 4.5 Framework O’Reilly Media, Inc.: California

関連記事

プロジェクトストーリー

技術

コメント

この記事へのコメントはありません。

カテゴリー

TOP
TOP