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

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

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

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

スコープ

スコープとは、プログラム内で変数名など、参照可能な有効範囲のことを指します。

Q&A

解決済

3回答

3255閲覧

(C#)クラス、フィールド、コンストラクタ、メソッドのスコープに関しての質問です

widget11

総合スコア221

C#

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

スコープ

スコープとは、プログラム内で変数名など、参照可能な有効範囲のことを指します。

0グッド

0クリップ

投稿2018/12/18 08:08

非常に基礎的なことですが。。。C#のスコープに関して質問があります。
いつも自分は(大規模な開発をしたことがないのもありますが)とりあえず全てのクラスの要素を例えば以下のようにすべてをpublicにする節があります。

//class public class Logic { //field    public string Uri { get; set; } //constructor public Logic() { Uri = "https://sample"; } //method public void ConsoleLogic(Uri) { Console.Write(Uri); } }

もちろんクラスpublicにすれば当然外部からもどこでも参照できるようになると思います。
この時例えばこのLogicをLogic logic = new Logic();のようにインスタンス化して、外部のクラスからこのLogicクラスのフィールドやメソッドにアクセスしたい場合、とりあえずクラスさえpublicにしていれば
private string Uri { get; set; }private void ConsoleLogic(Uri)のようにしてもlogic.ConsoleLogic()のようにアクセスできるようなものなのでしょうか?(フィールドの場合はstatic付けなきゃ直接アクセスできないかもですが。。。)
クラスの外部アクセスは分かるのですが、メソッドやフィールドなどのスコープがいまいち分かっていません。。。
またクラスをpublicにしていたらコンストラクタもpublicにしなければダメなのでしょうか?
宜しくお願い致します。

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

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

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

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

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

guest

回答3

0

解決済みの質問でしかも質問への回答ではありませんが、他の回答者の皆さんが指摘せずにスルーしていますので書いておきます

フィールドの場合はstatic付けなきゃ直接アクセスできないかもですが。。。

staticの意味をどのように解釈しているのかわかりませんが、確実に間違っています
通常、classはnewして利用するのですが、それはclass定義に基づいてインスタンスを生成してメモリ上に保持されます。そのため、複数newしてインスタンスを生成した場合それぞれは別物なので別のメモリアドレスに保存されます
ですが、staticはインスタンスではなくclass定義自体に保持するものとなりますので、インスタンスを保持した場所へ存在するわけではありません
その為、インスタンス内で保持するプロパティやフィールドを直接参照することはできません(this.~では無理ってだけでpublicなどのインスタンスを保持した変数.~ではアクセスできます)
なのでインスタンスで保持した値を使用する必要が無いもの(メソッドだと引数だけで完結するもの:数値の引数を足した結果を戻すだけとかそういうの)にstaticを使います
上記の通り保持している場所がclass定義なのかインスタンスなのかの違いがあるため、class名.~でアクセスするかインスタンス変数名.~でアクセスするかはstaticかそうでないかで変わります

なお、上記の説明は僕が過去にZ80の機械語やVC++を触ったときの自分なりの解釈から説明していますので、C#のコンパイラの挙動をソースから読み解いたわけではありません
その為実際とは異なる部分があるかもしれませんがstaticを間違えて解釈するよりはマシかと思います

投稿2018/12/19 00:34

len_souko

総合スコア1348

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

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

0

ベストアンサー

とりあえずクラスさえpublicにしていれば

private string Uri { get; set; }やprivate void ConsoleLogic(Uri)のようにしてもlogic.ConsoleLogic()のようにアクセスできるようなものなのでしょうか?

いえ、publicなクラスでも、privateなメソッドやフィールドへは外部からアクセスできません。

またクラスをpublicにしていたらコンストラクタもpublicにしなければダメなのでしょうか?

必ずしもその必要はありませんコンストラクタをinternalprivateなものだけにすれば、外部からnewできなくなります。

投稿2018/12/18 08:18

maisumakun

総合スコア145183

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

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

widget11

2018/12/18 08:27

ありがとうございます!スッキリしました!
guest

0

フィールドもメソッドも、public にしないと外からはアクセスできません
コンストラクタも同様です

投稿2018/12/18 08:17

編集2018/12/18 08:17
y_waiwai

総合スコア87747

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問