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

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

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

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

Q&A

解決済

2回答

2926閲覧

クラス内でプロパティを通してフィールドにアクセスすることの是非

xxx.ty

総合スコア1

C#

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

0グッド

1クリップ

投稿2020/11/16 11:58

前提・実現したいこと

はじめまして。
c#で、あるクラスを作成しているのですが、
プロパティの扱いに関して質問があります。

プロパティは一般には、クラス内のメンバ変数に外からアクセスするときの
インターフェース的なもので、クラス内部のコードでは対応するメンバ変数を
使うという理解なのですが、クラス内部でそのままプロパティをメンバ変数のように
使用するのは良くないのでしょうか。

該当のソースコード

例えば、あるクラスの中身が以下のようだとして、
クラス内で、プロパティ"Name"をそのまま使っていますが、
何か問題あるのでしょうか。

csharp

1private string _name; 2public string Name 3{ 4 get { return this._name; } 5 set { this._name = value; } 6} 7 8private string Hogehoge() 9{ 10 Name = "yamada"; // this._name = "yamada";のほうが適切? 11 var xxx = Name; // var xxx = this._name;のほうが適切? 12 13 return xxx; 14} 15

またそもそも、特にアクセスレベルの制限などする必要のないような場合、
以下のように、メンバ変数を省略するというのはありでしょうか。
(この場合、単にメンバ変数pulic string Name;を使うのとほぼ同じ・・・?)

csharp

1public string Name { get; set; } 2 3private string Hogehoge() 4{ 5 Name = "yamada"; 6 var xxx = Name; 7 8 return xxx; 9} 10

よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/11/16 12:28 編集

> プロパティは一般には、クラス内のメンバ変数に外からアクセスするときのインターフェース的なもので、クラス内部のコードでは対応するメンバ変数を使うという理解なのですが、 オブジェクト指向プログラミングの「カプセル化」という考えに沿って、フィールドは private それに外部からアクセスする必要がある場合はパブリックプロパティを使うという基本で良いと思いますよ。
guest

回答2

0

ベストアンサー

質問のコメント欄に書いたことを含め、プロパティを使う理由を以下に書いておきます。

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

(2) プロパティを使う目的には、開発者が意図した規則に基づいてフィールドを正しく使用できるよう保証するということもあります。

(3) プロパティでなければダメというケースもあります。例えば、Entity Framework Code First でのモデルを定義を行う場合はフィールドではダメで、プロパティの定義が必要です。他には、ASP.NET Web Forms アプリのデータバインド式でもプロパティでないとダメです。

【追記】

下のコメントで書いた「自動実装プロパティでフィールドが定義してないという場合はプロパティを使わざるを得ないですね」の件です。Configuration プロパティは Visual Studio のテンプレートで生成されるコードです。

イメージ説明

投稿2020/11/16 12:34

編集2020/11/16 13:28
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

xxx.ty

2020/11/16 12:43

コメント欄含め、ご回答ありがとうございます。 クラス内ではやはり、プロパティでget,setするのではなく、 フィールド変数を直接使うのが普通なのでしょうか。 「クラス内からであっても、private のメンバー変数には直接アクセスせず、 プロパティを通してアクセスする方が後々の保守がしやすかったりします」という記事を見つけまして、どっちがいいのかなと思いまして。。
退会済みユーザー

退会済みユーザー

2020/11/16 13:13

> クラス内からであっても、private のメンバー変数には直接アクセスせず、 プロパティを通してアクセスする方が後々の保守がしやすかったりします クラス内からしかアクセスしないフィールドにわざわざパブリックプロパティを定義するということはないのでは? クラス外からアクセスするのでパブリックプロパティも定義してあるような場合は、そういう話(クラス内でもプロパティを使う)もあるかもしれませんけど。それと、自動実装プロパティでフィールドが定義してないという場合はプロパティを使わざるを得ないですね。
退会済みユーザー

退会済みユーザー

2020/11/16 13:24

上のコメントで書いた、 > 自動実装プロパティでフィールドが定義してないという場合はプロパティを使わざるを得ないですね。 という例を回答欄に追記しておきます。
xxx.ty

2020/11/16 13:25

なるほど、ありがとうございます。 >クラス外からアクセスするのでパブリックプロパティも定義してあるような場合 主にこちらの意味で質問しておりました。 こういう場合で、フィールド変数も特に定義していなかった場合(自動実装プロパティ)、 プロパティをそのままクラス内で使っても別に変ではないんですね。 すっきりしました。ありがとうございます。
fana

2020/11/17 02:04

> 「クラス内からであっても、private のメンバー変数には直接アクセスせず、 プロパティを通してアクセスする方が後々の保守がしやすかったりします」 クラスの内側でも「プロパティ」による抽象化の恩恵に与りたいのか否か,程度の話なんじゃないかな,と.
guest

0

特段の問題は無いと思います.

投稿2020/11/16 12:17

fana

総合スコア11656

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

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

fana

2020/11/17 01:38

(速やか且つ簡潔に答えたというのにこの扱いw)
Zuishin

2020/11/17 01:51

プロパティに副作用がある場合、問題のあるケースとないケースがあると思います。
fana

2020/11/17 01:56

> 該当のソースコード というのが本件の想定している話の範疇であろうという認識のもとでの回答となっております.
xxx.ty

2020/11/17 09:07

すみません、、お礼をし忘れていました、ありがとうございます。 上の方が、詳しい回答をくださったので、ベストアンサーとさせていただきました。
fana

2020/11/17 09:32

(BAだとかお礼だとかいうような方面の事柄を指したつもりでは無かった) 何か余計な心配(?)をさせてしまったみたいで申し訳ない.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問