質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

5回答

5517閲覧

C# 自動実装プロパティの必要性

piglet

総合スコア47

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

1グッド

3クリップ

投稿2017/08/07 03:17

C#の自動実装プロパティについて疑問な点があります

class Book1 { public string Title { get; set; } = "Untitled"; public int Price { get; set; } = 100; } class Book2 { public string Title = "Untitled"; public int Price = 100; }

Book1はBook2に対してアクセサを使っていて強そうに見えますが
このクラスを使う側からしてみれば、どちらも

book.Title = "Name"; book.Price = 500;

と同じように使えますよね
ならメソッドの呼び出しをする分、コストがかかるだけではないのでしょうか?

普通のプロパティを使い、値のチェックや加工をしてから代入したり返したりするのが
有効であることはわかります。しかし自動実装プロパティの意義だけはわかりません・・・
値の代入と返却をするだけの機能に何らかの実質的メリットはあるのでしょうか?

usamino👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

同じような質問が以下のスレッドにあります。

C# プロパティ 自動実装 意味は?
https://teratail.com/questions/81207

そこに書いたことですが、それを以下に書いておきます。

(1) オブジェクト指向の概念の一つ「カプセル化」を実現するため、通常クラス内の各フィールドへの直接アクセスは禁止するようにしておき、外部からはパブリックプロパティで各フィールの値を取得したり設定したりするということがもともとのプロパティの目的のはずです。

(2) プロパティを使う目的には、開発者が意図した規則に基づいてフィールドを正しく使用できるよう保証するということもあります。例えば、以下の記事ように、ユーザーが Visual Studio でプロパティを設定する際、範囲外であると例外をスローするようなこともできます。

Web Custom Control の例外処置
http://surferonwww.info/BlogEngine/post/2010/08/06/Exception-handling-by-web-custom-control.aspx

(3) 自動実装プロパティを利用する意味は、プログラミングガイドに書いてありますが、"プロパティ アクセサーに追加のロジックが必要ない場合は、プロパティをより簡潔に宣言できます" ということに尽きると思います。例えば、最近の Entity Framework Code First でのモデルの定義に使うようなケース(下記記事参照)で有用だと思います。

新しいデータベースの Code First
https://msdn.microsoft.com/ja-jp/data/jj193542.aspx

投稿2017/08/07 03:31

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

piglet

2017/08/07 16:32

解説をありがとうございました
guest

0

ベストアンサー

しかし自動実装プロパティの意義だけはわかりません・・・

すべてのプロパティが値チェックなどの追加処理が必要とは限りません。自動実装プロパティはタイプする手間が省けます。それは単純に便利です。便利というのは非常に意義深いことです。

値の代入と返却をするだけの機能に何らかの実質的メリットはあるのでしょうか?

メリット云々以前に、設計上プロパティであるべきものはプロパティにすべきです。追加の処理を行うかどうかは仕様の問題です。そして、仕様が変わることはよくあることです。

判りやすい例として、例えばユーザーコントロールにプロパティを実装したい場合、当然のことながらプロパティとして実装しないとデザインに反映されません。

それと、

ならメソッドの呼び出しをする分、コストがかかるだけではないのでしょうか?

これについては検証したわけではありませんが、Releaseビルドにおいては最適化によりメソッド呼び出しが省略され、フィールドのアクセスとパフォーマンス的には変わらないと思います。

投稿2017/08/07 14:34

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

piglet

2017/08/07 16:22

備えあれば憂いなしってことですね デメリットがないのなら積極的に使ってみようと思います
guest

0

A. インターフェースで使える。
B. getのみ、またはprivete setにして使う

投稿2017/08/07 03:31

ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

piglet

2017/08/07 16:24

ごもっともです 確かにインターフェイスで使っていました・・・
guest

0

WPF或いはUWPではプロパティでないとデータバインドができません。
また、外部からのデータ変更を許容したくない場合についてはデータ変更を次のようにクラス内でのみ変更できるように設定できます。

C#

1public int SampleProperty { get; private set; }

投稿2017/08/07 16:11

編集2017/08/07 16:12
Argent

総合スコア59

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

piglet

2017/08/07 16:23

なるほどWPFとUWPに対応するという点もあるんですね 参考になりました
guest

0

ならメソッドの呼び出しをする分、コストがかかるだけではないのでしょうか?

と、思うのであれば、使わなければ良い。
実装する際に便利だと思えば使えば良い
(疑問を持つのは、有用です。疑問を持って質問するだけでは、、、)
昔から、MSの言語系は、代替え可能な機能を実装したり、便利機能を実装したりしている。
そこで悩む時間を、.NETライブラリの学習に充てた方が有用では?

自動実装するプロパティ (C# プログラミング ガイド)
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/auto-implemented-properties
自動プロパティ
http://ufcpp.net/study/csharp/oo_property.html#auto
↑++C++; // 未確認飛行 C の各項目は、目を通しておいた方が良いです。
過去記事には、C#の変遷等も書かれています。

投稿2017/08/07 03:38

daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問