ふらっと C#,C♯,C#(初心者用) Part134

■ このスレッドは過去ログ倉庫に格納されています
2017/11/29(水) 19:23:58.05ID:GNLsbK4F0
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください

>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっと C#,C♯,C#(初心者用) Part133
http://mevius.5ch.net/test/read.cgi/tech/1510056685/
■関連スレ
C#, C♯, C#相談室 Part95
http://mevius.5ch.net/test/read.cgi/tech/1508180530/
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/

■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/

■情報源
https://msdn.microsoft.com/ja-jp/library/gg145045.aspx
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2018/01/18(木) 23:58:27.78ID:x+1bimBw0
>>582
普通はアプリケーションフォルダにデータを置きます
てか、設定ファイルは.iniを使わなくなって10年以上経ちます
[C# 設定]で、普通の設定ファイルの使い方調べた方がいい
2018/01/19(金) 00:03:38.34ID:b8VvEepP0
訂正アプリケーションデータフォルダ(AppDataってやつね)
2018/01/19(金) 00:13:18.76ID:S8TUMubta
最近流行らないと思うけど、バイナリと同じ場所に設定ファイルを置くのは
バイナリ自体をUSBメモリに入れて持ち歩くような特殊な用途ぐらいだよね

iniファイルでも悪くないと個人的には思うけど、せっかく便利なシリアライザがいろいろあるのに
わざわざ機能的に劣るiniファイルを使う意味はないわなあ

読み書きするコードも自分で書かなきゃならんし
586デフォルトの名無しさん (ワッチョイ 239d-pQa0)
垢版 |
2018/01/19(金) 00:21:35.85ID:reZAGsN60
AppDataってVsのSetupプロジェクトでは作ってくれないですね。Apllicationフォルダーに設定用のデータも入れています。

「iniをつかわない」ってのがあまり意味がわかりませんがいま使っているのは単なるテキストファイルです。
(*.iniという名前にしていますが、)StreemWriterで書いています。XMLに落とすのが普通なのでしょうか?
 しかし単に改行だけのファイルで十分なのでXMLにはしていません。
XMLは設定ファイルとしてはわかり難いですし無駄が多いように思います。
それにエディターで気楽に追加ができないです。
587デフォルトの名無しさん (ワッチョイ 239d-pQa0)
垢版 |
2018/01/19(金) 00:26:38.77ID:reZAGsN60
>niファイルでも悪くないと個人的には思うけど、せっかく便利なシリアライザがいろいろあるのに
>わざわざ機能的に劣るiniファイルを使う意味はないわなあ

慣れなんですかね。どうも直観的にわかり難いように思います。だからJsonとかを使う人も多いんではないですか?
588愛知人
垢版 |
2018/01/19(金) 00:30:36.53ID:5Myz+qXq
VisualStudioの機能だが
589デフォルトの名無しさん (ワッチョイ 239d-pQa0)
垢版 |
2018/01/19(金) 00:32:41.68ID:reZAGsN60
”設定”, 20,
とかをStreemReaderで読みこむと何で ””設定””になるんですかね。ストリングにするためにわざわざ「”」をNULLにReplaceしています。
なんかいい方法はないですかね。
2018/01/19(金) 00:38:29.54ID:d7UJaemd0
>>586
俺はええと思うな
XMLは編集するツールがない
プログラマでない人間がぶっ壊したら
自分で直すのは至難の技だ
591デフォルトの名無しさん (ワッチョイ 239d-pQa0)
垢版 |
2018/01/19(金) 00:45:09.29ID:reZAGsN60
>VisualStudioの機能だが

・AppDataフォルダ:このフォルダは「C:\Users\ユーザー名\AppData」にあります。ほとんどのプログラムの設定ファイル
はここに置かれています(サブフォルダ「Roaming」の中)。プログラム名か開発企業名のフォルダの中に、設定ファイルや
関連データが保存されていますので、フォルダごとバックアップしておきましょう。

こういうもののようですね。だからSetupプロジェクトにはここに入れる設定データのフォルダーがあってしかるべきですがない?みたいですね。
592デフォルトの名無しさん (ワッチョイ 239d-pQa0)
垢版 |
2018/01/19(金) 00:46:26.55ID:reZAGsN60
すいません。ありました。w
593愛知人
垢版 |
2018/01/19(金) 00:51:07.58ID:5Myz+qXq
これな
https://dobon.net/vb/dotnet/programing/mysettings.html
2018/01/19(金) 01:25:20.86ID:LT72Z3Kia
バイナリと同じフォルダにiniファイルだと…

アプリケーション1つにつき設定が一個しかないのでユーザーが複数いると困る
たとえば年賀状ソフトで差出人が全てのユーザーで一つしか設定できない
2018/01/19(金) 02:08:01.69ID:IgZPOGcu0
今時複数ユーザーなんか考慮しなくていいだろ
健全なファミリーがお前の作ったアプリを使うとでも?
2018/01/19(金) 02:36:53.35ID:fKBFwOmr0
j時代の産物だよなあ >1PC複数ユーザ
597デフォルトの名無しさん (ワッチョイ 3deb-v7nw)
垢版 |
2018/01/19(金) 05:47:10.29ID:FgdJ6DNZ0
すまんが、列挙型って関数の引数の型に指定することはできないの?
enum A {B, C ,D};
void E(A a){}//ここでエラー
これを書く事ができれば、エディタのアシストが効きまくってミスが減る気がするんだけど・・・・・
2018/01/19(金) 06:28:55.06ID:0J18wCJz0
できるはず
エラーメッセージはどのようなものですか?
2018/01/19(金) 09:34:28.81ID:NgQA6vsH0
同名enumが複数あってエラーとなっているに一票
2018/01/19(金) 09:49:45.42ID:6WrKIIOGa
関数内に書いててpublicメソッドにしてるんだろうな
2018/01/19(金) 10:03:10.79ID:6WrKIIOGa
クラス内に書いててpublicメソッドの引数にしてるの間違い

それかenumをpublicにしてないか
2018/01/19(金) 15:16:19.49ID:6h+BHP540
Windows Form のコントロールたちって、ここ10年くらい全くもって変わり映えしてない気がするんだけど
もう改善する気がないのかねぇ

グレープシティ壊滅させるまでやらずとも
テキストボックスの縦位置とか枠線スタイルとか複数列コンボとか、そのくらい対応してくれてもいいと思うんだけど
2018/01/19(金) 21:40:19.48ID:o57JVoz30
>>602
UWPに注力してる以上まずやらんだろ。
2018/01/19(金) 21:52:43.88ID:AYT1nS2wa
XPに対応したVS2005の時代から変わってないのに何をいまさら感w
2018/01/19(金) 22:00:59.10ID:NgQA6vsH0
>>603
Windows 10 Mobile が事実上終了したんだからUWPに注力する必要ないよね
2018/01/19(金) 22:02:05.49ID:4CF5m12I0
Chartがその後で増えたよ
いやまあBCLに入っていなかっただけで前からあった奴だけど
2018/01/19(金) 22:27:33.99ID:o57JVoz30
>>605
GoogleやAppleのまねしたいみたいだから、あがき続けるんじゃないか。
2018/01/19(金) 23:30:36.57ID:199CJjI/0
WinFormsって長いこと触ってないが
今でも線引くのにLabel使うとかアホなことしてるの?
609愛知人
垢版 |
2018/01/19(金) 23:45:07.67ID:5Myz+qXq
線なんか引くか?
無い物は使わなくてよくね?
2018/01/19(金) 23:59:59.32ID:6WrKIIOGa
底辺の人は底辺の環境で不思議なことをしてる


普通の人は普通の環境で普通なことをしてる
2018/01/20(土) 00:13:34.30ID:2ckAjxI3a
>>608-609
ラベルでヘアライン引くのはよくあるしアホでも何でもない
2018/01/20(土) 00:20:13.00ID:1eaJngIj0
MSがUWPの宣伝しているのを見る度に
ユニバーサルプラットフォームっていうけど
お宅の会社ってPC以外のプラットフォーム持ってましたっけ?
って煽りたくなる
2018/01/20(土) 00:23:44.04ID:2ckAjxI3a
実態はともかく構想的にはMS以外ノプラットフォームも対象なんで
その批判は当たらないかと
2018/01/20(土) 00:26:56.64ID:j23dmrcl0
とは言え、ギョーミーなアプリ書く上で、マストなものは粗方揃ったわけだし
クライアントがWindows10で揃えられるなら選択肢として悪くない
2018/01/20(土) 01:06:06.62ID:5JusgAfv0
とはいえUWPで作れるアプリならWebで十分なんだよね
タッチパネルでの利用を想定しないのであれば、現実的にはあえて選ぶメリットはほとんど無い
2018/01/21(日) 06:37:48.04ID:eh2o3Efy0
解像度2560×1440のモニタを使っているのですが、Formアプリの解像度が合いません。
原因はサイズを125%に拡大していることで、通常の倍率に戻すとぼやけません。
FormのAutoScaleModeをDpiに設定してみましたが改善されませんでした。
対策をご存知の方がいましたら教えてください。
2018/01/21(日) 08:46:46.21ID:0JbPJogq0
VSの吐くWinformsのテンプレだと自分でdpiAware仕込まなあかんのじゃなかったっけ
2018/01/21(日) 09:07:41.53ID:eh2o3Efy0
>>617
app.manifestを設定したらモニタの解像度に対応できました。
ありがとうございます!!
2018/01/21(日) 09:16:30.01ID:dyzIneF20
>>616
exeを右クリしてプロパティの中の互換設定を弄ると直る
2018/01/21(日) 09:41:48.00ID:eh2o3Efy0
>>619
なるほど、互換の設定でも対応できるのですね。
勉強になります。
621愛知人
垢版 |
2018/01/21(日) 12:27:01.84ID:w5iluM1L
つまり他のソフトもボヤけてるんだな。
XPExplorerインストールすればいいのに。
622デフォルトの名無しさん (ワッチョイ 630f-Qwpo)
垢版 |
2018/01/21(日) 19:16:00.62ID:eh2o3Efy0
>>621
さっそくインストールしました
ありがとうございます!
623デフォルトの名無しさん (ワッチョイ 630f-Qwpo)
垢版 |
2018/01/21(日) 19:17:14.71ID:eh2o3Efy0
早速インストールしたら好調でした
ありがとうございます!
624デフォルトの名無しさん (ワッチョイ 630f-Qwpo)
垢版 |
2018/01/21(日) 19:18:01.63ID:eh2o3Efy0
>>621
早速インストールしたら好調でした
ありがとうございます!
625デフォルトの名無しさん (ワッチョイ a3d4-4jNr)
垢版 |
2018/01/22(月) 01:46:46.64ID:B9qWH8zv0
>>621
早速インストールしたら好調でした
ありがとうございます!
626デフォルトの名無しさん (ワッチョイ a3d4-4jNr)
垢版 |
2018/01/22(月) 01:47:44.83ID:B9qWH8zv0
>>621
早速インストールしたら好調でした
ありがとうございます!
627デフォルトの名無しさん (ワッチョイ a3d4-4jNr)
垢版 |
2018/01/22(月) 01:48:45.74ID:B9qWH8zv0
>>621
早速インストールしたら好調でした
ありがとうございます!
628愛知人
垢版 |
2018/01/22(月) 01:49:30.11ID:f1RuTEDX
うっせーよカス
629デフォルトの名無しさん (ワッチョイ a3d4-4jNr)
垢版 |
2018/01/22(月) 01:50:19.37ID:B9qWH8zv0
>>621
早速インストールしたら好調でした
ありがとうございます!
630デフォルトの名無しさん (ワッチョイ a3d4-4jNr)
垢版 |
2018/01/22(月) 01:51:06.43ID:B9qWH8zv0
>>621
早速インストールしたら好調でした
ありがとうございます!
631デフォルトの名無しさん (ワッチョイ a3d4-4jNr)
垢版 |
2018/01/22(月) 01:52:13.61ID:B9qWH8zv0
>>621
早速インストールしたら好調でした
ありがとうございます!
2018/01/22(月) 07:20:56.54ID:2aQrNvno0
普通にNGID
633デフォルトの名無しさん (ワッチョイ 5bd6-pQa0)
垢版 |
2018/01/22(月) 15:17:28.34ID:rsQqa0Zv0
public static SqlConnection connect = new SqlConnection("接続文字列");
public static SqlDataAdapter sda = new SqlDataAdapter("SELECT * FROM Table", connect);
public static DataTable dt = new DataTable();

private void Form_Load(object sender, EventArgs e)
{
sda.Fill(dt);
DataGridView1.DataSource = dt;
}

private void button_publish_Click(object sender, EventArgs e)
{
connect.Open();
〜Tablesへの改変処理
connect.Close();

dt = new DataTable();
sda.Fill(dt);//★
}

Table内容をSqlDataAdapterを使い、データテーブルに入れ込んで、DataGridViewに表示させた後、

Table内容を変更後、再びDataGridViewに表示させるとき、例外がスローされます。

★の部分で、「System.InvalidOperationException: 'ConnectionString プロパティは初期化されていません。'」が出ます。

最新のデータを同じDataGridViewで見るには、どのようにすればよいのでしょうか?
2018/01/22(月) 15:55:14.43ID:O29q6QQC0
>connect.Close();
接続切ったらそりゃエラーになるでしょ
635633 (ワッチョイ 5bd6-pQa0)
垢版 |
2018/01/22(月) 16:09:10.00ID:rsQqa0Zv0
connect.Open();//★
sda.Fill(dt);
connect.Close();
としたら、★マークのところで、またエラーが出ました。
2018/01/22(月) 16:33:20.49ID:R+95xE7/0
まずコネクション以下全てのオブジェクトはクローズしたら再度newしないと使えません
よってスタティックじゃなくて普通のインスタンスとして管理
使う度にnewで新たに作ります
637633 (ワッチョイ 5bd6-pQa0)
垢版 |
2018/01/22(月) 16:46:28.18ID:rsQqa0Zv0
そうだったんですね、使いまわせると思ってました・・・
2018/01/22(月) 17:15:57.30ID:rsQqa0Zv0
インスタンス内で、宣言したら、うまくいくようになりました。
ありがとうございます。
639デフォルトの名無しさん (ワッチョイ 239d-pQa0)
垢版 |
2018/01/23(火) 08:14:55.18ID:y6LiRRs70
デバッグで完全に動作するのにインストールして動かすと、途中で落ちる。多分データベースのアクセスではないかなと
思っているんだが、インストールした実行プログラムのデバッグをやろうとしているんだがどうやるのか不明。

VS2013の「デバッグ」から「インストールされているアプリケーションパッケージのデバッグ」に入ってもリストに何もでてこない。
なにか設定があるのだろうと思うが、どこを設定すればいい?
アタッチするまでが分からない。
2018/01/23(火) 08:58:36.28ID:Un6nXOVAd
>>639
どうやってインストールしたん?
結局Console.WriteLine()をあちこちに埋め込むのが早かったりする
2018/01/23(火) 09:29:37.11ID:2MiHwZpp0
>>640
ConsoleよりTraceの方が使い勝手良いぞ。
Trace.WriteLine()とかの情報をDebugViewで時間情報付きで見れる。
フィルターやハイライトとかもかけられる。
2018/01/23(火) 09:36:15.82ID:XJEe+tMu0
CallerMemberNameAttribute class
2018/01/23(火) 09:37:24.58ID:XJEe+tMu0
っていうか
リリース版でデバッグしたいって聞いてるんでしょ?
2018/01/23(火) 09:50:04.23ID:2MiHwZpp0
Trace出力でのデバッグはリリース版でやることが多いぞ。
ビュワー立ち上げなければ、ユーザーからは見えないし。
2018/01/23(火) 09:59:10.73ID:iDuW9Lrl0
mono入れたLinuxでmscでコンパイルした実行ファイルを
WindowsにもってこようとするとMicrosoft Defenderでトロイ扱いされてブロックされます
同じコードをWindowsでcscでコンパイルした場合は問題ありません
WindowsでコンパイルしたものはmonoでLinuxでもちゃんと実行できます
なんでmscでコンパイルしたものがトロイ扱いされるんでしょう?
646愛知人
垢版 |
2018/01/23(火) 11:14:45.36ID:ZHqgRH1x
どうやって受け渡してる?
zipで渡したらどうなる?
2018/01/23(火) 11:48:58.28ID:iDuW9Lrl0
>>646
scp(ssh)とhttp経由でダウンロードしましたがだめで
その後拡張子を変えたりしましたがだめでした
アーカイブは試しませんでしたが
ダウンロードできても解凍するところでアウトと思われます
軽いプログラムだったのでbase64エンコードした文字列を
Windows側でデコードして出力しようとしたのですが
ファイルに出力した時点でウイルス判定され隔離されました
2018/01/23(火) 12:35:41.92ID:IdUgpQhE0
C#アプリからCTRL+V以外のホットキーでSendMessageでWM_PASTEを送っても
ペーストできるアプリとできないアプリがあるのですが
ペーストできない原因とどうすればペーストできるのか
分かる方がおられましたらお教えいただけないでしょうか

自作C#アプリ ○
FireFox ○
ThunderBird ○
IE11 ○
Mery ○
秀丸ファイラ ○
MDIE ○


V2C ×
Chrome ×
Vivaldi ×
Everything ×
2018/01/23(火) 12:43:02.47ID:+k2ngROKa
いやいや、原因は普通に当該アプリがWM_PASTEを処理しないからでしょうw
泥臭いけど素直にSendKeysを使ったらよいのでは?
650デフォルトの名無しさん (アウアウカー Sa21-zP08)
垢版 |
2018/01/23(火) 12:43:45.53ID:w7MKK31Na
シリアル通信のプログラムで問い合わせ付のコマンドを送信する場合に、送信結果(bool)とレスポンス結果(string)を取得したいのですが、返り値boolでレスポンス結果をoutで返すといった感じにすればいいでしょうか
2018/01/23(火) 12:44:53.41ID:S3NIjRwTM
WM_PASTEじゃなくて直接キーをハンドリングしてるんだろ
最近のメジャーなアプリは開発者がMacをメインで使ってるケースが多かったりして、
ファッキンドザのために必要以上の特殊な対応はしないというスタンスのものが増えてるよ
2018/01/23(火) 12:50:10.67ID:X0br0i8Q0
>>650
ValueTuple
653デフォルトの名無しさん (ブーイモ MMe9-VZYS)
垢版 |
2018/01/23(火) 13:01:37.24ID:P/8oxsShM
>>650
送信結果は例外で
2018/01/23(火) 13:31:40.71ID:+k2ngROKa
>>650
成否だけ分かればいいなら、失敗した時はnullを返せば十分じゃない?

enum Acknowledgement {ACK,, NAK, NoResply, Offline};
みたいなのを返したいなら、

Class Response
{
  public string Received{get; private set;}
  public Acknowledgement Acknowledgement{get; private set;}
}

みたいなのを返すとか
2018/01/23(火) 14:27:23.36ID:jwCBe9IF0
メインメニューにコピーの項目ないなら
直接ペーストするウインドウに送らんと
656デフォルトの名無しさん (アウアウカー Sa21-zP08)
垢版 |
2018/01/23(火) 21:20:31.90ID:doIreqsya
>>652-654
ありがとうございます
試してみます
657デフォルトの名無しさん (ワッチョイ 25b3-pQa0)
垢版 |
2018/01/24(水) 22:02:38.70ID:pOW1jrho0
classをforeachで回したいのですがGetEnumeratorの書き方はこういう形が一般的なのでしょうか?
プロパティが増える度にGetEnumeratorのyield return追加しないといけないですが
うっかり追加し忘れてバグの元になるから別の書き方があるのかも?と少し気になったので
https://ideone.com/etKQWk
2018/01/24(水) 22:13:23.39ID:N2tfbGLJM
>>657
普通はそんなことはしない
まともな作り方をしていれば、次元の異なるものを列挙することはない
2018/01/24(水) 22:16:06.84ID:BwYqU5Fv0
>>657
リフレクション使う
https://qiita.com/dolls/items/c7b3cf2520baae158a3a
2018/01/24(水) 22:21:49.07ID:pOW1jrho0
>>658
すっごい単純なものだと
int id
string name
みたいなものでクラス保持してて、そこに他にも付属品が付いてるイメージです
たまにforeach使えないと不便な時があるのでその為に継承させてるのですが

DBから読み出したデータをそのままforeachで出力させたいって時とかに使います
わざわざ全部の項目を関数で読み出して表示ってのも大変な時があるので
2018/01/24(水) 22:38:24.91ID:pOW1jrho0
>>659
Typeの使い方色々調べましたけど、指定方法がイマイチわからなかったのでもうちょい調べておきます
2018/01/24(水) 22:51:55.14ID:V1Cqs6+da
>>660
質問してるんだから人の言うこと素直に聞いた方がいいと思うよw
少なくとも>>658は正しい。

一般的なのでしょうか?
一般的どころかそんなこと誰もしないよw

どうやったらそんなアホなことをせずに目的の仕様を実激できるかを考えた方がいい
2018/01/24(水) 23:04:36.97ID:pOW1jrho0
>>662
すいません、目的の事をしたいのにそうではないと提示してもらったのはありがたいのですが
他の実現方法が分からなかったのでとりあえず現状何をしてるかを更に明確に伝えた方がいいと思ったで

その回答がただ否定してるだけに見えたのなら少し発言が悪かったでしょうか?

>>659
で更に回答いただけたのでTypeの使い方を調べています
とりあえず動くものだけ>>657で暫定で動かしておいて、使い方を理解したら置きかえて行く予定です
個人的に作ってるものなのでとりあえずは手の届く範囲で扱えるので
2018/01/24(水) 23:07:14.93ID:E4B4d2jG0
>>660
やりたいことはこんな感じかな?
https://ideone.com/EfpdAq
2018/01/24(水) 23:23:34.07ID:pOW1jrho0
>>664
ビルドして動作確認しました
この通りの動きです、ありがとうございます
Linqの渡してるところ調べながら読み直して何してるか理解します
2018/01/25(木) 12:22:13.44ID:bvB9i9l+r
>>662
質問されてるんだから屁理屈いってないで素直に答えろよw低能らしいなw
2018/01/25(木) 12:32:11.99ID:867zoX3ca
こうしてまた一人変態プログラマーが世に放たれた
668デフォルトの名無しさん (ワッチョイ e39d-1ipv)
垢版 |
2018/01/25(木) 14:20:59.96ID:uboI0CmN0

//描画先とするImageオブジェクトを作成する
Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);
//ImageオブジェクトのGraphicsオブジェクトを作成する
Graphics g = Graphics.FromImage(canvas);

//画像ファイルを読み込んで、Imageオブジェクトとして取得する
Image img = Image.FromFile(@"C:\test\1.bmp");
//画像のサイズを2倍にしてcanvasに描画する
g.DrawImage(img, 0, 0, img.Width * 2, img.Height * 2);
//Imageオブジェクトのリソースを解放する
img.Dispose();

//Graphicsオブジェクトのリソースを解放する
g.Dispose();
//PictureBox1に表示する
PictureBox1.Image = canvas;


g,imgはNEWしてないのに何でdispose()する必要があるの?
2018/01/25(木) 15:01:28.26ID:rd0qfL0Fa
>>668
Graphics.FromImageもImage.FromFileも直接コンストラクタ呼んでないだけのこと。
中で非公開のコンストラクタが呼ばれてインスタンスが作られてることに変わりないじゃん

お片付けしていいタイミングが分かるのは作った人だけ。
だから作った人がお片付けする責任を負うのが合理的
670デフォルトの名無しさん (ワッチョイ e39d-1ipv)
垢版 |
2018/01/25(木) 15:12:28.67ID:uboI0CmN0
そういうことなの。
Graphics g = Graphics.FromImage(canvas);
こいつが内部のコンストラクタでNewしてるかどうかなんてどうしたらわかるの? 分からんよな。
マニュアルをみると確かにこいつだけ「Creates a new Graphics from the specified Image.」と
なってるな。わかり難く紛れ込んでるんだね。

しかも
g.dispose()
PictureBox1.Image = canvas;
と御片付けした後に表示するとはまた不思議な気がする。なんで片づけてから表示するん?
どのみちNEWしたCanvasはDisposeしないといけないでしょ。それならそのときに自動的に全部Dispose()する
とかできないのか?
671デフォルトの名無しさん (ワッチョイ e39d-1ipv)
垢版 |
2018/01/25(木) 15:29:46.72ID:uboI0CmN0
これはGraphicsクラスの説明にあるMSのサンプルだけどImageもulCornerもDispose()していないのは何故。
private void DrawImagePointF(PaintEventArgs e)
{
// Create image.
Image newImage = Image.FromFile("SampImag.jpg");
// Create point for upper-left corner of image.
PointF ulCorner = new PointF(100.0F, 100.0F);
// Draw image to screen.
e.Graphics.DrawImage(newImage, ulCorner);
}
2018/01/25(木) 15:31:19.68ID:867zoX3ca
別に使い終わってもリソース気にしないなら放置でいいよ
実害は普通の使い方してる限りでない

一個二個リソースが握られただけでは問題ないけど
数千数万とかレベルだと問題がでる
でもわざわざ勘定したり場合わけしながらコード書いているのか?
だったら正しいコードを書こう

newしてるかどうかわからなくても使ってることはわかるだろ?
いつかは自動で解放されるけどタイミングが不明
コード書いてる途中にg,imagを使い終わったと判断できるのは自分だけだから

片づけた後に使うのは当たり前だな
基本的にgなどはつかみっぱなしが良くないので短い範囲で手放してるだけ
2018/01/25(木) 15:35:45.15ID:867zoX3ca
これは基本的にwindowsのGDIという仕組みに乗ってるだけなので
他でも使ってる

c#に文句を言うのは筋違い
でもc++スレに行くのも筋違い

30年近くさかのぼってMSの設計者に文句を言ってくればいい
どうしても嫌ならwindowsの仕組みに乗ってないものを使えばいい
2018/01/25(木) 15:46:40.99ID:y1oROuxV0
こういう自分とこでインスタンス作成しといて始末しない設計ってクソだね

って話で終わりだな
2018/01/25(木) 15:56:14.66ID:867zoX3ca
もう少し説明
>と御片付けした後に表示するとはまた不思議な気がする。なんで片づけてから表示するん?
仮にgをファイル操作に置き換えたとしよう

ファイル開く
ファイル読み書き処理
ファイル閉じる
表示

これを
表示
ファイル閉じる
にした場合、表示がもし5年かかった場合、ファイルは意味もなく5年間開かれっぱなしで他から操作できない
2018/01/25(木) 15:59:37.81ID:867zoX3ca
さらに言えば自動でファイルを閉じる仕組みを作ったにせよ
表示が終わるまで5年間ファイルは閉じられる機会がない

これでもすべて自動でやれという意見は変わらないかな?
677デフォルトの名無しさん (ワッチョイ e39d-1ipv)
垢版 |
2018/01/25(木) 16:00:10.16ID:uboI0CmN0
そういう話ではなくて意味が解らないという話だね。
例えばこれは何故当たり前なのかが不明。

>片づけた後に使うのは当たり前だな
>基本的にgなどはつかみっぱなしが良くないので短い範囲で手放してるだけ

折角グラフィック表示するためにgを作ったのに、表示する前に解放するというのが意味不明だ。
Msのサンプルコードではまさにこのgに対してDRAWしている。これで表示が機能しているのに
この例では、PictureにCanvasを代入して表示が完了することになっている。表示する前にg
をdisposeしているから、gの役割が二つの例で意味が不明だ。
2018/01/25(木) 16:04:31.21ID:867zoX3ca
gは数が限られている

鉛筆みたいなもの
鉛筆が5本あってみなで共有している
使い終わったらすぐ放棄しないと絵が描けない人がでて困る

必要なくなったのに5年鉛筆を持ちっぱなしが望ましい状態だろうか?
2018/01/25(木) 16:08:15.76ID:867zoX3ca
鉛筆5本をそれぞれが持ちっぱなしで
6個目のアプリが起動したらどうなるか?

鉛筆がないのでまともに動かない
2018/01/25(木) 16:14:06.03ID:rPbpnmYW0
一つ勘違いがあるけど、newやコンストラクタとDispose()は直接関係ないよ
C#にdeleteは無いし、それに相当するものでもないので、インスタンスを解放する訳じゃない
Dispose()は主にガベージコレクション管理外となるアンマネージリソース等を解放するためのメソッド

そしてGraphicsはBitmapというキャンバスを弄るために用意したに過ぎない、表示するのはBitmapの中身
モノによってはDispose()すると内部バッファとかの書き出しとかもやるし、using等も使いつつ明示的にやりましょう

ちゃんとしたIDispose実装クラスならデストラクタ(ファイナライザ)でもDispose()を呼び出すコードが入ってるけど
タイミングがガベコレ次第になるし高コストなので明示的に呼ばれるとファイナライズキューから外すように設計されてる
2018/01/25(木) 16:20:19.01ID:rd0qfL0Fa
>>670
だから、「Disposeする必要があるのは自分がnewしたもの」という勝手な思い込みが間違ってる。
Disposeは作成したオブジェクトが必要なくなった時に呼ぶ。
オブジェクトを作成する方法はコンストラクタ呼び出しだけじゃない。

MSDNの説明にある通り、Graphics.FromImageもImage.FromFileも新しく作成されたオブジェクトを
返す。使いまわしされる共有オブジェクトを返すわけじゃない。

> どのみちNEWしたCanvasはDisposeしないといけないでしょ。それならそのときに自動的に全部Dispose()する
> とかできないのか?
usingステートメントを使う
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/using-statement
2018/01/25(木) 16:22:44.43ID:867zoX3ca
C#でたころにGDIの限界までオブジェクト作ったことがあったな
画面がおかしくなって黒いところがあちこちにできる
リソースがないと怒られる

それともc++だったかないずれにせよ20年ぐらい前かな
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況