C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: 静的クラスについて


(過去ログ 105 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■62899 / inTopicNo.1)  静的クラスについて
  
□投稿者/ 初心者 (3回)-(2011/11/09(Wed) 10:53:10)

分類:[C#] 

初めての投稿になりますが、よろしくお願いします。
現在C#を勉強しているのですが、基本的な概念がどうもわかっていなく今回投稿させていただきました。

内容は、現在データベーステーブルに存在しているTaskテーブルに、
Id,Title,Contents,Limitの列名があるのですが、静的クラスからフィールド変数とプロパティの設定をする場合、
下記のコードのようになぜ、staticをつけるのでしょうか?
また、他のクラスからたとえばGetTitle()を呼ぶときは、そのままGetTitle()とコードを書いても良いものなのでしょうか?
また静的クラスのメリットとは、インスタンスの複数生成しないで済むほかにメリットはあるのでしょうか?

初歩の初歩での質問で申し訳ありませんが、アドバイスよろしくお願いします。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.IO;

namespace TaskManage
{
static public class Dialogs
{
// 静的フィールド変数_titleを宣言
// メッセージボックスのタイトル文字列を格納
static private string _title;
// メッセージボックスのタイトルを取得できる静的なTitleプロパティを宣言
static private string Title
{
get
{
// フィールド変数_titleの値がnullか空白だった場合は、GetTitleメソッドの戻り値を格納します 
if (string.IsNullOrEmpty(_title))
{
_title = GetTitle();
}
return _title;
}
}
// Jbc27-1001
static private string GetTitle()
{
// GetExecutingAssemblyメソッドで、
// 現在実行中のコードを格納しているアセンブリ(コンパイル済みのコードライブラリファイル)を取得。
Assembly assembly = Assembly.GetExecutingAssembly();
// 次にPathクラスのGetFileNameWithoutExtensionメソッドを使用して、
// 拡張子を除いたファイル名を取り出した結果を返す。(TaskManage.exe)→(TaskManage)という文字列を取得。
return Path.GetFileNameWithoutExtension(assembly.CodeBase);
}
}
}

引用返信 編集キー/
■62900 / inTopicNo.2)  Re[1]: 静的クラスについて
□投稿者/ shu (1079回)-(2011/11/09(Wed) 11:24:59)
No62899 (初心者 さん) に返信

何が分かっているのか、何が分からないのかが分からないのですが、
static = 静的
です。
クラス内でstaticが付加されていないメンバはインスタンス化されないと
アクセス出来ません。なのでstaticクラスのメンバにはstaticが必要です。

引用返信 編集キー/
■62905 / inTopicNo.3)  Re[2]: 静的クラスについて
□投稿者/ NF64 (21回)-(2011/11/09(Wed) 17:16:36)
メリットといってもケースバイケースでしょう。
私の場合はインスタンスを必要としないのであれば、staticとします。
OOPとして、不自然にならない設計にすれば良いのではないでしょうか。

以下は静的クラスではなく静的メソッドの議論ですが、ご参考までに。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=33293&forum=7

引用返信 編集キー/
■62917 / inTopicNo.4)  Re[2]: 静的クラスについて
□投稿者/ 初心者 (4回)-(2011/11/10(Thu) 12:58:50)
shu さん

アドバイスありがとうございます。
質問内容が上手く表現できなかっため、
質問返しにさせてしまいましてごめんなさい。
引用返信 編集キー/
■62918 / inTopicNo.5)  Re[3]: 静的クラスについて
□投稿者/ 初心者 (5回)-(2011/11/10(Thu) 13:05:18)
NF64 さん

参考URLありがとうございました。

インスタンスの生成を必要としない場合は、
メッセージダイアログのクラスだったり、
様々なFormからの連携の必要性がない場合に静的クラスを作成するような感覚で良かったのでしょうか?

お手数をお掛けしますがよろしくお願いします。
引用返信 編集キー/
■62922 / inTopicNo.6)  Re[3]: 静的クラスについて
□投稿者/ 774RR (623回)-(2011/11/10(Thu) 14:12:07)
そのクラスのインスタンスは複数個存在するのが普通か?させるべきか否か?
原理・原則的に1つであるべきか?
あたりから分析段階に入るものだと思う。

従業員クラスなら、インスタンスが複数個あるのがあたりまえ。
社長クラスなら、インスタンスは1個しかないだろう。

従業員クラスを静的クラスにすることはあり得ない。
社長クラスは静的クラスに [することができる] が [多分絶対にしない]
理由:従業員から社長に昇格する、という状況がありえるから。

組み込み系なら [機械の構造上原理的に1個しか存在し得ない基幹重要部品] があって、
それの制御を行う [クラス] を作るような状況がごく普通にありえて、
そういう場合なら静的クラスを採用することになるだろう。

例題の [ダイアログ] だけど
・およそダイアログであるもの --- は複数個ありうる = 静的クラスになったりはしない
・特定のダイアログ --- は1個しかない (ので静的クラスにしたくなるわけだが)
 が、それを [およそダイアログであるもの派生] として実装するなら静的クラスにはなれない。
ということになる。

[文字の加工を行うクラス]とか、そういうのをどうしてもクラスとして実装する羽目になったら、
それは静的クラスになるかもしれない。
引用返信 編集キー/
■62925 / inTopicNo.7)  Re[4]: 静的クラスについて
□投稿者/ ふるふる (2回)-(2011/11/10(Thu) 16:08:49)
No62922 (774RR さん) に返信
> 例題の [ダイアログ] だけど
> ・およそダイアログであるもの --- は複数個ありうる = 静的クラスになったりはしない
> ・特定のダイアログ --- は1個しかない (ので静的クラスにしたくなるわけだが)
>  が、それを [およそダイアログであるもの派生] として実装するなら静的クラスにはなれない。
> ということになる。

そのアプリケーションで表示されるメッセージダイアログは常に一つである、しかしメッセージの作成にあたり、
複数のクラスを動的に利用する(たとえばメッセージ取得のためにデータベースにアクセスするなど)ような場合、
静的クラスにはなりえない、ということでしょうか?




引用返信 編集キー/
■62927 / inTopicNo.8)  Re[5]: 静的クラスについて
□投稿者/ 魔界の仮面弁士 (2401回)-(2011/11/10(Thu) 17:15:19)
2011/11/10(Thu) 17:18:06 編集(投稿者)

No62925 (ふるふる さん) に返信
>>・およそダイアログであるもの --- は複数個ありうる = 静的クラスになったりはしない
>>・特定のダイアログ --- は1個しかない (ので静的クラスにしたくなるわけだが)
>> が、それを [およそダイアログであるもの派生] として実装するなら静的クラスにはなれない。
>>ということになる。
>
> そのアプリケーションで表示されるメッセージダイアログは常に一つである、しかしメッセージの作成にあたり、
> 複数のクラスを動的に利用する(たとえばメッセージ取得のためにデータベースにアクセスするなど)ような場合、
> 静的クラスにはなりえない、ということでしょうか?

static クラスを派生させたクラスを作ることはできません(コンパイルエラー CS0709)し、
static クラスに他のクラスを継承させることもできません(コンパイルエラー CS0713)が、
static クラスが他のクラスを呼ぶことは、相手が static であろうとなかろうと可能です。
引用返信 編集キー/
■62931 / inTopicNo.9)  Re[6]: 静的クラスについて
□投稿者/ NF64 (24回)-(2011/11/10(Thu) 18:41:49)
例えば、設定ファイルから設定値を取得するためのConfigクラスがあったとします。
設定ファイルがアプリケーションに対して一つしか存在しないなら、当然Configクラスのインスタンスも一つしかありません。
それなら、staticにしない理由はないですから、staticとします。

一概にメリット・デメリットでは語れませんので、そのアプリケーションに相応しい設計をするべきでしょう。
MSDNでどのようなクラスがstaticとして実装されているのか、調べてみるのも良いかも知れません。
引用返信 編集キー/
■62959 / inTopicNo.10)  Re[7]: 静的クラスについて
□投稿者/ Soda (1回)-(2011/11/13(Sun) 14:28:17)
Soda さんの Web サイト
No62931 (NF64 さん) に返信
> 設定ファイルがアプリケーションに対して一つしか存在しないなら、当然Configクラスのインスタンスも一つしかありません。

ん?そうとは限らないのではないかと。
一時的にしか使わない設定データであれば、必要なときにしか読み込まないという設計もありますよね。
同時に存在するインスタンスは1つかもしれませんが、インスタンスを作る場所は複数になる可能性もあるわけで(^^;
メモリの使用量を気にする時代ではないかもしれませんがー
staticだと常にメモリにあるのはデメリットにもなりえますね。

・・・といっても、頻繁にアクセスするデータならstaticのほうが楽というか、効率的なわけでw

自分が使い分けてるイメージとしたら、staticにするのは、使用頻度が高いものや複数のclassから使われるようなライブラリのようなものかなぁ。
こー考えが古いせいか、シングルトンパターンとやらを使うよりもグローバルデータとしてstaticなもののほうが楽だったり(^^;
もっともシングルトンパターンを使う場合、使うべき場所で使われるのが明確になるので、時代的にはそちら・・・なのかな?


引用返信 編集キー/
■62961 / inTopicNo.11)  Re[8]: 静的クラスについて
□投稿者/ NF64 (27回)-(2011/11/13(Sun) 15:14:26)
ご指摘ありがとうございます。

確かに、そのような想定であれば仰る通りですね。
「アプリケーション内で唯一であり、永続的に存在するデータ」という意図だったのですが、記述が不十分でした。
例えもあんまり適切な気がしないんですが、文章力が乏しいので何卒ご了承を...。


#元々は組み込み屋さんだったのですが、.NETに触れるようになってからはメモリまわりを気にする機会がなくなってしまいました。
#ダメな事なんでしょうけども...。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -