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

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

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

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

Q&A

解決済

3回答

1288閲覧

C#のプロパティの必要性

atushi3333

総合スコア15

C#

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

0グッド

0クリップ

投稿2020/07/11 09:21

編集2020/07/11 09:22

現在C#を勉強中です。
C#にプロパティという機能がありますが調べた感じだと
フィールドと、それに対するゲッター・セッターを冗長性なく実装できる機能
と解釈したのですが、
疑問がいくつか出ました。

  • プロパティを使うのとプロパティを使わず実装することに見た目以外に違いはあるのか
  • プロパティを使う必要性はあるのか。普通に使わずに行うと何か問題はあるのか
  • プロパティを使わないとできないことがあるのか。(はたまたプロパティだとできないことはあるか)
  • どちらがスタンダードなやり方か(現場でも個人でも)

まだC#は勉強し始めたばかりなのでおかしいところがあるかもしれませんが、C#に詳しい人教えてください。
宜しくお願いします。

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

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

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

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

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

Zuishin

2020/07/11 10:15 編集

メソッドとの違いでパッと思いつくのは、オブジェクトの状態を表すことを明示できること、初期化子が用意されていること、INotifyPropertyChanged など各種イベントが使えることを示唆できることなどです。詳細は「メソッドとプロパティの違い」を調べるのではなく、メソッドについて、そしてプロパティについて独立して調べればいいのではないかと思います。それらがどう違うかはさほど重要ではありません。
atushi3333

2020/07/11 10:17

なるほど、ありがとうございます
guest

回答3

0

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

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

(3) ちょっと具体例が出てきませんが、例えば JSON を .NET のオブジェクトにデシリアライズするような場合、クラスにプロパティ定義が必要ということがあるはずです。あと、Entity Framework Code First でのモデルを定義を行う場合もフィールドではダメで、プロパティの定義が必要です。

いちいちプロパティを定義するのは面倒と思うかもしれませんが、自動実装プロパティを利用すれば簡単です。

投稿2020/07/11 09:43

編集2020/07/11 09:52
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

len_souko

2020/07/11 12:28

WPF等のデータバインドでもフィールドやメソッドだと無理ですね まれにプロパティ否定主義の人が居ますが、そういう人はこういったデータバインドによるデータとUIのフレームワークで楽にしてくれる部分を自力でコードビハインドからいじるしかない状態になるという所でしょうか?デメリットしかないと思うんですけどね
guest

0

ベストアンサー

プロパティを使うのとプロパティを使わず実装することに見た目以外に違いはあるのか

見た目以外に違いはありません。が、見た目の影響は意外と広いと思います。例えば、元はフィールドで実装したもので、こう使えましたら:

c#

1class PositiveInt { 2 int value 3} 4PositiveInt n = new PositiveInt() 5n.value = 3 6n.value = -3

クラスは正整数ですけど、最後の行では負整数を入れてしまいました。この状況を防ぎたい。プロパティで実装すれば、使う側は何もしなくてもいいです。セッターで実装すれば、使う側も全部セッターを使わなければなりません。リファクタリングの作業量はかなり違います。

プロパティを使う必要性はあるのか。普通に使わずに行うと何か問題はあるのか

上記のように、プロパティでフィールドに条件の追加ができます。プロパティを使わなくてもその条件を追加するのなら、新たな条件付きクラスを作るか、その条件をすべてのメソッドでチェックしなければなりません。もちろん、条件を捨てればいけません。プロパティを使わないと色々作業量が多くなります。

プロパティを使わないとできないことがあるのか。(はたまたプロパティだとできないことはあるか)

プロパティを使わないとできないことがありませんが、使わないと作業量が多くなります。

どちらがスタンダードなやり方か(現場でも個人でも)

ゲッターセッターよりはプロパティがスタンダードです。

投稿2020/07/11 10:00

YufanLou

総合スコア464

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

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

atushi3333

2020/07/11 10:14

まさに私が知りたかったことです。 ありがとうございますm(__)m
退会済みユーザー

退会済みユーザー

2020/07/11 10:24

> プロパティを使わないとできないことがありませんが、 できないことはいろいろありますけど? あなたが書いた「プロパティでフィールドに条件の追加」もその一つだと思いますが、違いますか?
Zuishin

2020/07/11 10:26

ほかにも色々ありますが、これがまさに知りたかったことで既にベストアンサーが決まっているなら、回答者をこれ以上振り回す前に解決したらどうでしょうか。
Zuishin

2020/07/11 10:59 編集

ちなみに > プロパティを使わないとできないことがありませんが 初期化子を使用した初期化はメソッドではできません。プロパティを使用するインターフェースを実装する時もプロパティを使わざるを得ません。PropertyChanged イベントを発行するのはプロパティでなくては変です。匿名クラスはメソッドやフィールドではなくプロパティを使用します。その他省略。
guest

0

C#に限定される話でなく、オブジェクト指向の問題だと思います。
ググればこんなのが見つかりますが

要は「カプセル化」を行うことで、そのプロパティを利用する他のクラスへの影響を与えることなく内部データ(フィールド)を変更できたり、プロパティへのget/set時に特定の動作(イベント等)を発生させたりする事が可能になります。

より詳しく学びたい場合はC#という言語に限らず、オブジェクト指向そのものを学習してください。

投稿2020/07/11 09:29

gentaro

総合スコア8947

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

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

atushi3333

2020/07/11 09:35

回答ありがとうございます。 もちろんプロパティを使えばカプセル化はできますが それはプロパティを使わなくても フィールドをプライベートにしてpublicなゲッター・セッターを自分で作ってしまえば カプセル化はできるのでは?と感じてしまいます... 私が知りたいのはプロパティを使うのと使わないので、どんな違い(メリットデメリット)があるのか知りたいのです。
gentaro

2020/07/11 09:41

getter/setterの糖衣構文(簡単に実装できるようにしたもの)がプロパティです。 いちいちメソッドを作る手間を省いているだけです。
gentaro

2020/07/11 09:45

メリットデメリットについて言えば、カプセル化のメリットがわかっているならそれに準じます。 「それを簡単に実装できる」のがプロパティで、これがプロパティ自体のメリットです。
atushi3333

2020/07/11 09:51

ありがとうございます。 違いはそこだけで、使っても使わなくても 出来ることに差はないという認識で問題ないですかね?(Qiitaで少しプロパティのほうが早い的な記事は見ましたが...) もし現場などでC#を使われていたら教えてほしいのですが、 書き方としてはプロパティを使うのがスタンダードですかね?
退会済みユーザー

退会済みユーザー

2020/07/11 09:55

横レス失礼します。 > 出来ることに差はないという認識で問題ないですかね? もちろん問題大ありで認識が間違ってます。差がなければプロパティの存在意義がないじゃないですか。
gentaro

2020/07/11 09:58

普通はプロパティを使います。 使わない事によるメリットを享受できるケースがほぼないので。 言語の内部実装によって速度の差が出るケースはありえますが、学習を始めた段階で気にする内容ではないです。気にする必要があるのは上級エンジニアだけだと思ってください。 何万回もアクセスして1秒そこらの差がつくのが許容できないような場合は考慮することも有ると思いますが、それは実際にパフォーマンス要求がとてもシビアなケースで、かつ実測してそこに問題が有ることがわかった時に考える内容です。 通常の業務アプリケーションの世界でそのような事はほぼ起きません。
atushi3333

2020/07/11 10:01

SurferOnWwwさん 出来ることにどんな違いがありますか?
atushi3333

2020/07/11 10:02

gentaroさん ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/07/11 10:03

> 出来ることにどんな違いがありますか? 私の回答は読んでないのですか?
atushi3333

2020/07/11 10:12

すいません私がおかしいかもしれません。 私は 「プロパティを使っても使わなくても出来ることに差はなくて 見た目の違いしかない」 と認識しているのですが。何かおかしいところはありますか? 私は 「できることの違い」に「見た目の違い」は含めていません。 プロパティの存在意義は見た目が簡潔になるということですよね?
退会済みユーザー

退会済みユーザー

2020/07/11 10:28 編集

> 「プロパティを使っても使わなくても出来ることに差はなくて見た目の違いしかない」と認識しているのですが。何かおかしいところはありますか? 全くおかしいですね。私の回答を読んでないか理解できてないかのどっちかだと思いますけど。
atushi3333

2020/07/11 10:28

すいません。 回答をこっちのコメントと勘違いしてました。 読んだら(大体ですが)わかりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問