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

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

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

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

Q&A

解決済

3回答

5820閲覧

readonly修飾子を用いたフィールドと、getterのみで書いたプロパティは同等かどうか。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2020/12/20 13:15

前提・実現したいこと

・質問1。
readonly修飾子を用いたフィールドと、getterのみで書いたプロパティは同等でしょうか?
どちらもコンストラクタと変数初期化子では値の代入が可能で、
それ以外は値の代入が不可能で読み取り専用となるという認識で合っていますか?

・質問2。

C#

1 public string myValue1 { get; } = "value1"; 2 public string myValue2 { get; }

上記と下記のコードは同等でしょうか?

C#

1 public string myValue1 { get; } = "value1"; 2 public string myValue2 { get; }

・質問3。

C#

1 class Sample1 2 { 3 public string myValue1 { get; } = "value1"; 4 public string myValue2 { get; } 5 public Sample1(string value){ 6 myValue2 = value; 7 } 8 }

 上記と下記のクラスは同等でしょうか?

C#

1 class Sample2 2 { 3 public readonly string myValue1 = "value1"; 4 public readonly string myValue2; 5 public Sample2(string value){ 6 myValue2 = value; 7 } 8 }

試したこと

下記のように試したところ、結果はコメントの通りとなったので、
一見すると、質問1の認識は合っていて、質問2と質問3もそれぞれ同等と思えるような結果になりましたが、
考慮漏れや勘違いしている部分があるかもしれないと思い、質問させていただきました。

C#

1using System; 2 3namespace SampleProject 4{ 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 // Console.WriteLine("Hello World!"); 10 11 Sample1 s1 = new Sample1("value2"); 12 Console.WriteLine(s1.myValue1); // value1 13 Console.WriteLine(s1.myValue2); // value2 14 15 // s1.myValue1 = "value3"; // 読み取り専用であるためエラー 16 // s1.myValue2 = "value4"; // 読み取り専用であるためエラー 17 18 Sample2 s2 = new Sample2("value2"); 19 Console.WriteLine(s2.myValue1); // value1 20 Console.WriteLine(s2.myValue2); // value2 21 22 // s2.myValue1 = "value3"; // 読み取り専用であるためエラー 23 // s2.myValue2 = "value4"; // 読み取り専用であるためエラー 24 } 25 } 26 27 class Sample1 28 { 29 public string myValue1 { get; } = "value1"; 30 public string myValue2 { get; } 31 public Sample1(string value){ 32 myValue2 = value; 33 } 34 } 35 36 class Sample2 37 { 38 public readonly string myValue1 = "value1"; 39 public readonly string myValue2; 40 public Sample2(string value){ 41 myValue2 = value; 42 } 43 } 44 45}

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

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

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

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

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

Zuishin

2020/12/20 13:36

プロパティとフィールドは違います。
guest

回答3

0

readonly修飾子を用いたフィールドと、getterのみで書いたプロパティは同等かどうか。

そもそも、フィールドに、

public readonly string myValue1 = "value1";

というように public 修飾子を付与することはないので、上の「同等か」という話は成り立たないと思ってます。

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

投稿2020/12/21 04:57

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/12/21 05:19

ご回答ありがとうございます。 フィールドにpublic修飾子を付与することはなく、直接アクセスは禁止するようにしておくのですね。 勉強になりました。 ありがとうございます。
guest

0

ベストアンサー

フィールドはクラスや構造体の保持する値そのもので、プロパティはフィールドにアクセスするためのメソッドなので、まず概念が違います。
一例としては、プロパティはメソッドなのでオーバーライド可能ですが、フィールドの場合は不可能です。

C#

1 class Animal 2 { 3 public readonly string NameField = "名前はまだない"; 4 public virtual string NameProperty { get; } = "名前はまだない"; 5 } 6 7 class Cat : Animal 8 { 9 public new readonly string NameField = "猫"; 10 public override string NameProperty { get; } = "猫"; 11 } 12 13 class Program 14 { 15 16 static void Main(string[] args) 17 { 18 Cat cat = new Cat(); 19 Console.WriteLine($"cat.NameField:{cat.NameField}"); 20 Console.WriteLine($"cat.NameProperty:{cat.NameProperty}"); 21 22 Animal animal = cat; 23 Console.WriteLine($"animal.NameField:{animal.NameField}"); 24 Console.WriteLine($"animal.NameProperty:{animal.NameProperty}"); 25 26 Console.ReadLine(); 27 } 28 } 29 30(実行結果) 31cat.NameField:32cat.NameProperty:33animal.NameField:名前はまだない 34animal.NameProperty:

まずは公式のプログラミングガイドを熟読してください。
プロパティ (C# プログラミング ガイド)
フィールド (C# プログラミング ガイド)

投稿2020/12/21 02:26

編集2020/12/21 02:48
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/12/21 05:19

ご回答ありがとうございます。 具体的なコードをご提示いただき、ありがとうございます。 とても勉強になりました。 ありがとうございました。
guest

0

動作的には似たような振る舞いをしますが、実装は全く別になってます。

なにをしたくてそれを聞いてるのか、というところを提示してくれれば、そこらへんのアドバイスができると思いますがどうでしょうか

投稿2020/12/20 21:46

y_waiwai

総合スコア88042

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

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

退会済みユーザー

退会済みユーザー

2020/12/21 00:39

ご回答ありがとうございます。 振る舞いが同じかどうかを教えていただきたいです。 振る舞いが異なることがある場合、その具体例を教えていただきたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問