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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

4回答

38595閲覧

staticな変数、メソッドを実装するデメリットについて教えてください

necos

総合スコア52

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

2グッド

6クリップ

投稿2018/02/27 13:45

質問内容
Staticな変数やメソッドを用いる際のデメリットや、気をつけなければいけない点について、どなたか教えて頂けないでしょうか?

凄く漠然とした質問で申し訳ないのですが、staticな変数、メソッドに対して、どういうアプローチで調べれば良いか、そのとっかかりがつかめれば、と考えています。

現時点での理解度
staticなものに対する自分の理解は、

アプリの実行中、決して破棄されず、
インスタンスを生成せずとも、どのクラスからでも直接参照できる

といった程度です。

もしあれば、質問の仕方に対する指摘も併せていただけると幸いです。

どうぞよろしくお願い致します。

dotnetuseryamag, Apple_Candy👍を押しています

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

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

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

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

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

guest

回答4

0

ベストアンサー

こんにちは。

まず、例えばMath.Sqrt()のような副作用のないstaticメソッドは自由に作ってもstaticであることが原因による問題はまずでないです。
次に、privateなstaticフィールドやprivateなstaticメソッドも同様です。

そして、publicなstaticフィールドや副作用のあるpublicなstaticメソッドについては要注意です。
全てのところから設定したり呼び出したりできるので、想定外のところからアクセスされて痛い目にあうことがあります。(改造する際に当初の想定外の箇所へ影響するため、それを回避する設計に苦労するなど)
ですので、大半のクラスからアクセスしたり呼び出したりするものだけに限定しておいた方が、無駄な苦労を減らせます。

投稿2018/02/27 14:54

Chironian

総合スコア23272

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

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

necos

2018/02/28 03:16

返信遅くなりました。問題を考慮しなくてよいケース、注意するケースそれぞれの解説ありがとうございます。 1点お願いがあるのですが、文章内で使われている「副作用」について、もう少し詳しく教えていただけ無いでしょうか? 現在の私のイメージでは、Math.Sqrt()等のメソッドは、ただ計算して、結果が返ってくるだけなので、実装に対して副作用がない、といったものです。 よろしくお願いいたします。
Chironian

2018/02/28 07:41

「副作用」は、その関数が終了した後に影響が残ることです。グローバル変数等の値の変更などなどが副作用を生みます。 「Math.Sqrt()はそのような影響がないので副作用がない」でOKです。
guest

0

static の変数、やメソッドはそのインスタンスは一つだけとなってしまいます。
そのため、マルチスレッド、マルチタスクなどの非同期処理で複数のスレッドやタスクで実行するときは特別の配慮が必要となります
staticでなければ、それぞれのスレッドで個別にインスタンスを生成すれば簡単ですが。

#ましかし、staticだから非同期で全くダメということでもないし、static でないから非同期で
#なんでもOKというわけでもないので注意

投稿2018/02/27 14:48

y_waiwai

総合スコア87774

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

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

necos

2018/02/28 03:28

返信遅くなりました。staticの変数やメソッドは、インスタンスが一つだけになってしまうので、 たとえば、非同期処理の際に、「一つになることがまずい状況」のときは、別途考慮する必要がある(きちんとインスタンスを生成して管理する)と理解しました。
guest

0

静的メンバーの方が使いやすいのになぜわざわざインスタンスを作る手間をかけてまでインスタンスメンバーを使うのかということですか?

結論だけ簡単に言うと、オブジェクト指向プログラミングをするためです。

オブジェクト指向の利点については多くの情報があるので詳しくは自分で調べてください。
これも簡単に言うと読みやすく再利用性の高いプログラムを書けることです。

つまり今は読みやすく再利用性の高いプログラミングができていないということです。
ポリモーフィズムを使いこなすにはインスタンスが必須ですから、静的メンバーのデメリットだの何だのというレベルの話ではありません。
ある程度以上のプログラミングにインスタンスは必須です。

投稿2018/02/27 14:42

Zuishin

総合スコア28660

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

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

necos

2018/02/28 03:39

返信遅くなりました。インスタンスメンバーを使うのは、オブジェクト指向プログラミングをするためということですね。 オブジェクト指向については、いろいろ読んでいて、なんとなくはわかっている(ということはきっとまだわかっていない)状態です。 引き続き、その辺を勉強していきたいと思います。
guest

0

何に対する「デメリット」ですか?

アプリの実行中、決して破棄されず、
インスタンスを生成せずとも、どのクラスからでも直接参照できる

これだけで重要な性質です。加えて言うならば「インスタンス生成、破棄時に影響を受けない」といったところでしょうか?これだけ性質がある以上、別の機能で代替えするということ自体難しいはずです。

比較対象が存在しないならば、デメリットとはいえないと思います。

投稿2018/02/28 14:28

HogeAnimalLover

総合スコア4830

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問