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

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

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

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

3回答

877閲覧

設定値の保存方法について

marvel

総合スコア13

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

2クリップ

投稿2019/06/22 18:17

ユーザーが自由に設定できる変数を設定を反映するためプログラムからのどこからでも参照できるようにし、プログラムが終了したときは外部ファイルに保存しておきたいと考えています。

1つしか存在しないことやどこからでも参照できる利点を考えれば静的変数がいいように思えます。しかし静的変数を直接保存する方法は私の知る限りありません。

インスタンスにすればXmlSerializerなどを利用して簡単に保存できますが、スコープを抜ける度に保存や読み込みをしなければいけないので億劫に感じます。

エントリポイントでインスタンスを作成することも自動生成されるものですから良い選択肢だとは思えません。

また、アプリケーション構成ファイルも自由度が低いことやマウスでの操作が多いので使いたくありません。

プログラムが開始するときにファイルから読み込みして静的変数に代入、終了するときには静的変数からインスタンスに代入し保存すれば、どこからでも参照できること、いちいち保存・読み込みしなくても良いことが両立できていますが、プログラム自体が回りくどくなってしまいます。

最後のものが1番いいように感じますが他にいい方法などあれば教えてくだい。
よろしくお願いします。

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

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

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

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

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

guest

回答3

0

普通これを使います。
Visual Studioでアプリケーションの設定を保存する

「自由度が低い」「マウス操作が多い」の意味がよく分かりませんが、自由度については、文字列のプロパティを作ってそれに XML を保存するのはどうでしょうか。

キーボードでの操作方法ですが、まず [Ctrl]+[Alt]+[L] でソリューションエクスプローラーを表示し、カーソルキーの上下で Properties を選択し、カーソルキーの右でそれを展開し、同様にして Settings.settings を展開して Settings.Designer.cs を編集すればコードで設定できます。

ただしこのファイルは通常はデザイナーの操作で自動生成されるものであり、デザイナーを使った方が簡単に編集できます。また、このファイルを自分で編集した後、デザイナー操作で編集すると、自分で編集した部分が場合によっては消えたりインデントが変更されたりすることがあります(コメントは消えると思います)。デザイナーでの編集をお勧めします。

これをデザイナーで操作するのはマウスを使わなくてもできます。まず Settings.settings を選択して [Enter] を押し、[TAB] を押して「名前」と書かれたところを任意の名前に変更します。変更し終わったら再度 [TAB] を押し、次に [Alt]+[↓] で「種類」を展開して任意の型を選択します。XML を保存するならこれは string のままでいいでしょう。

追記

上記ファイルの編集方法
ApplicationSettingsBaseクラスを使って設定を保存する

投稿2019/06/22 21:19

編集2019/06/22 22:01
Zuishin

総合スコア28660

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

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

marvel

2019/06/29 19:12

遅くなって申し訳ありません。 印象で考えていたこともあると思います。すみません。 保存する値を増やすといちいち同じ操作をしなければならず煩わしさを感じていました。また他のプロジェクトで再利用するときまた同じことをしなければならないのかと思っておりました。 自由度が低いとは状況は限られると思いますが暗号化、バイナリ化、zip化、ファイルの生成場所が指定できないということです。 教えていただいたサイトでバイナリ化ができるということは分かりました。カスタムもできるということなので上記のことすべてできるかもしれませんね。 また、設定ファイルのような1つしかファイルがなく一定の数の変数というようなものではなく、プロジェクトファイルのようなファイルが複数あり変数の数も決まっていない場合はどのようにすればよいでしょうか。 変数が複数あることに対してはジェネリックを利用すればいいと思いますが。
Zuishin

2019/06/29 21:43

質問が変わっていませんか? もう一度整理して、わかるように聞いてください。
Zuishin

2019/06/29 23:31 編集

> インスタンスにすればXmlSerializerなどを利用して簡単に保存できますが、 ということなので、XmlSerializer を使用した際に得られる自由度を超えた質問なら別の質問になります。設定ファイルは複数作れますが、回答するたびにこのレベルでの大きな追加仕様があるとすれば、きりがありません。 別の質問をするなら、この質問を閉じて新たに質問し直してください。
guest

0

.Net Core 3.0でJSONを扱うクラスが追加されたことだしJSONで保存してもいいのかも?

1つしか存在しないことやどこからでも参照できる利点を考えれば静的変数がいいように思えます。しかし静的変数を直接保存する方法は私の知る限りありません。

シングルトンなクラスにして設定変更時のみ設定ファイルのJSONを更新するようにすればいいだけだと思うので、プログラムの終了とかそんなタイミングである必要はないと思う(強制終了時に更新漏れが起きちゃうからね)
C#だとプロパティのsetterで別スレッド呼び出して保存させるといったこともできるし
設定に子要素が無いのならDictionary一個で行けるので

自由度が低いことやマウスでの操作が多い

これは意味が分からないのでもうちょっと具体的に書いてください
主観的な表現だと回答する側も質問者が不満に感じる点が分からないので
例)「おなかがすいて困ってます」で言ってる人はお弁当は持ってるけどご飯を食べても大丈夫な場所が見つからないだけだった場合、訊かれた人にその情報が無いと人によって「飯屋がみつからない」「弁当を買いに行きたいけどお店がどこにあるのか分からない」「歯が痛くて飯が食えない」等色々可能性を思い浮かべて回答をしても解決には至らない

あなたが避けたいと考えることもC#でなら多分やりようはいくらでもあると思うので具体的に~がいやだって話があれば回避策は誰かしらが思いつくはず

投稿2019/06/22 23:20

len_souko

総合スコア1348

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

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

marvel

2019/06/29 19:22

返信が遅くなり申し訳ありません。 .Net Core 3.0やJSONについての知識が乏しいので学習するところから始めないといけないようです。 .Net Coreについては.Net Frameworkと統合されるようなので避けられないようですね。 保存するタイミングについては適切なときになるよう気を付けたいと思っています。 「自由度が低いことやマウスでの操作が多い」という疑問点については下でコメントしたので重複になりますからそちらを参照いただければと思います。
guest

0

しかし静的変数を直接保存する方法は私の知る限りありません。
インスタンスにすればXmlSerializerなどを利用して

static classのメンバとしてシリアライズ可能なオブジェクトを持っておけばいいだけでは。

投稿2019/06/22 20:24

gentaro

総合スコア8949

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

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

marvel

2019/06/25 04:37

遅くなって申し訳ありません。 新たに変数を用意するのであれば保存する際にインスタンスを生成する方法と変わらないような気がします。 それよりもメンバーを利用したほうがいいのでしょうか。
gentaro

2019/06/25 05:12

static classを使う利点について > 1つしか存在しないことやどこからでも参照できる利点 とご自身で書いていらっしゃるじゃないですか。
marvel

2019/06/29 18:35

私が言いたかったことはstaticクラスとは別に、もう1つ、staticクラスと同じ変数を持ちインスタンスの作成できる、クラスを用意するということです。 プログラムが開始するときにXmlSerializerなどによってファイルからインスタンスに、そしてインスタンスからstaticに代入します。 値を保存するときにはstaticからインスタンスを作成し代入、そのインスタンスからファイルにシリアライズするということです。 またシリアライズ可能なオブジェクトがインスタンスメンバということであればstaticプロパティにオブジェクト参照が必要です。とエラーが出ます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問