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

■ このスレッドは過去ログ倉庫に格納されています
2020/02/19(水) 17:25:41.55ID:IsrGexiaF
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっと C#,C♯,C#(初心者用) Part146
https://mevius.5ch.net/test/read.cgi/tech/1576069931/
■関連スレ
C#, C♯, C#相談室 Part95
https://mevius.5ch.net/test/read.cgi/tech/1508168482/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/

■情報源
https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://docs.microsoft.com/en-us/dotnet/standard/class-libraries
http://referencesource.microsoft.com/
・Insider.NET > .NET TIPS - @IT
https://www.atmarkit.co.jp/ait/subtop/features/dotnet/dotnettips_index.html
・DOBON.NET .NET Tips
https://dobon.net/vb/dotnet/index.html
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/04/16(木) 07:47:41.61ID:tywb42E30
共有フォルダ内に、ファイルを置いて、それに記録すれば?
2020/04/16(木) 08:37:52.82ID:vjXf34hg0
ロックファイル的なものを起動時に作成・チェックさせるとかかねぇ?
異常終了したりしてロックファイルが残った時が面倒だけど
そもそも共有フォルダに実行ファイルを置いて、それを起動するって運用が微妙な気がするけど
2020/04/16(木) 09:47:16.73ID:ADqfPc91r
それな
ファイルおいたとこで実行ユーザはローカルとか、なにそれって感じ
なんでサーバにしないのとかね
2020/04/16(木) 10:45:00.68ID:+RUJOV4w0
Unix環境とかならファイルオープン時に共有モード指定できないから、ロックファイルを「作成」できるかで排他制御するけど、
Windows環境なら共有モード指定できるから、「排他モードでオープン」できるかで排他制御できないの?
そうすれば、ロックの解放は単にファイルハンドルを閉じるだけでロックファイルを削除する必要はない。

で、異常終了してプロセスが終了した場合はOSがプロセスによって開かれてたファイルハンドルをクローズしてくれるので、
自動的にロックも解放されるってことにはならないの??
2020/04/16(木) 11:06:22.69ID:+RUJOV4w0
途中共有モードを無視するような輩がいたらあれだけど、とりあえず全部Windowsで揃えてSMBで共有すればそれでいけそうな気がする
2020/04/16(木) 11:06:44.41ID:X8YLxQCs0
設計が悪い
2020/04/16(木) 11:07:10.39ID:tiZKLZWE0
理論通りに動けば良いなぁ

なおopenfiles ってコマンドで強制解除出来る
2020/04/16(木) 11:17:40.23ID:+RUJOV4w0
そうすれば、アプリ起動時にnew FileStream(特定のファイル、FileShare.None) アプリ終了時にStream.Closeの2行で実装終了

Windows最強
2020/04/16(木) 11:28:29.69ID:vjXf34hg0
>>345
それって共有フォルダ側が安いNAS(≒samba)でも使えるの?
2020/04/16(木) 11:51:08.70ID:+RUJOV4w0
>>346
それは知らない。

すべては要件次第。あくまで全部Windowsで揃えられる場合の一番簡単な実装を示しただけ。

安いNASでダメだったら、君のいうロックファイルのやり方でやればいい。ただし、君の方法もひょっとしたら安いNASで「ファイルの存在確認とファイルなければ作成」をアトミックにやってくれないSMBの実装があって使えない可能性もあるので。
2020/04/16(木) 12:10:19.37ID:7ingXuoIM
>>339
> そもそも共有フォルダに実行ファイルを置いて、それを起動するって運用が微妙な気がするけど
バージョンアップの手間を省きたいとかでしょ
Web化しろとかの話もあるだろうけどそこまで工数かけられないとか普通にあると思う
349デフォルトの名無しさん (アウアウウー Sa1b-V/21)
垢版 |
2020/04/16(木) 12:11:00.19ID:qm5c5Rqxa
>>337
微妙に要件と違うけど、昔のアドビのアプリは同一ネットワーク内のPCでは
同じプロダクトキーでアクティベートされたソフトは同時に起動できなかった

あれと同じ仕組みを使うことは可能じゃないか
具体的にどういう仕組みか知らんけどw
2020/04/16(木) 12:45:50.28ID:tiZKLZWE0
udpでマルチキャストする
2020/04/16(木) 18:51:55.07ID:9ICqslwr0
DBにログインIDと開始時刻を記録して処理が成功したら記録削除、失敗してたら20分経過で無効情報で良いかと思ってます
処理が20分超えたらアウトというイケてない部分をどうしようかとも思ってます
だったらファイル管理でも良いかなと思ってますが
2020/04/16(木) 19:13:42.88ID:jOE4Vo+O0
DBに処理対象を一意な文字列にして、ユーザIDとIPアドレスをもってロックを確保しに行ってるな。
弾かれた側に「誰々がどこでロックしてるから諦めるか直談判しにいけ」ってメッセージにしてる。
ロックが外れる時間は2分にしてるけど、ロック掛けてる側が、30秒ごとに延長するように更新してる。
トランザクションは増えるけど、強制終了してロックが残ったのを外す方が手間。
20分待ってくれる方が少ないと思うぞ。
1000人ぐらいが同時に使ってるが、それほど負荷は無い。ジャーナルの残し方だけ気にした方がいいぐらいか。
2020/04/16(木) 22:10:16.88ID:phPWx1q30
>>351
タイムアウトを含めて失敗したら即リソースを解放すればいいだけでは?

あと排他制御が必要なリソースの状態を管理するテーブルと
そのリソースを誰が使ってるかみたいな情報を管理するテーブルは別にしたほうがいいよ
2020/04/17(金) 07:33:58.48ID:sST11acE0
>>353
処理失敗とかイベント取れる所なら良いのですがパソコンがネットワークからいきなり外れた時とかどうしようかなと
2020/04/17(金) 15:28:13.52ID:xgpGiYXu0
>>354
共有フォルダに実行ファイルを置くやり方だから
クライアント側でしかタイムアウト検知できないって話なのか

そうすると>>352が書いてるような方式になるけど
サーバー側で実行するやり方なら必要のない複雑性を抱える事になるから
テストや運用時の手間を考えるとアーキテクチャ見直したほうが早い気がする
356デフォルトの名無しさん (ワッチョイ d777-Ho7r)
垢版 |
2020/04/17(金) 23:54:48.06ID:66fHRI6x0
chartのX軸のスクロールバーを動かしたときのイベントハンドラ的なものってありますか?
具体的には、縦軸(Y軸)の範囲を表示されている範囲内の最大値と最小値に逐次変更したいです。
2020/04/18(土) 15:39:00.86ID:9PsozTHm0
これで解決しそうです。
https://stackoverflow.com/questions/5363209/chart-control-y-axis-auto-scale-on-scrolling
358デフォルトの名無しさん (アウアウウー Sa1b-7wDT)
垢版 |
2020/04/18(土) 23:09:11.85ID:fgVpQ9I4a
>>331
この問題どなたか教えていただけないでしょうか?
とくにレ点じゃないチェックボックスを作成したいです
2020/04/18(土) 23:47:30.29ID:Fpx5gr7r0
>>358
cssで装飾したら?
2020/04/19(日) 17:56:07.02ID:a5Bxo0wQ0
FormにWebboewserコントロールを張り付けて ↓のコードコピペしたのですがThis がFrom1を参照しているのでエラーになります。
正しく使うのはうすればいいのでしょうか?


https://todosoft.net/blog/?p=380
2020/04/19(日) 18:02:11.94ID:jRRmPQvY0
今時、IE7ベース?
cefsharp使ったら?
2020/04/19(日) 18:32:01.51ID:a5Bxo0wQ0
今時WebBrowserコントロールは古いんですね
とりあえず、これは勉強の為のなので、WebBrowserで大丈夫です。
上記コードの this を webBrowser1 に置換すれば問題なく動きますが、thisのまま使う場合はどのようなコードになるのでしょうか?
363デフォルトの名無しさん (アウアウウー Sa1b-V/21)
垢版 |
2020/04/19(日) 19:46:35.97ID:E7TwXw1va
ちょっと何言ってるのか
2020/04/19(日) 19:56:24.71ID:3Oe7CVmea
>>362
リンク先のソースのメソッドは、おそらくはFormではなくWebBrowserを継承したコントロールに書くメソッド
WinForms標準のコントロール自体に機能追加することで、あちこちのFormでWebBrowserを使うつどそういうソースを書かなくて済むようにしてる
初学者でカスタムコントロールの作りかたとか未学習なら「this を webBrowser1に置き換え」で回避してよいと思う
2020/04/19(日) 21:42:29.85ID:a5Bxo0wQ0
>>362
なるほど、このコードはカスタムコントロールを目的としているのですね。
納得しました。ありがとうございました。
366デフォルトの名無しさん (ワッチョイ 779b-+5sX)
垢版 |
2020/04/21(火) 13:34:05.32ID:3bJr7zNG0
Form1に以下のような構造体を作ったんです。

// ----------通知方法の構造体--------------------
public struct Nortification
{
  public bool OpenBrowser;
  public bool MessageboxShow;
  public bool ToolchipBaloonShow;
}

次にメンバ変数として以下を定義しました

  static Nortification _nort = new Nortification(); //構造体のインスタンス

で、プロパティを作ったんです

public static Nortification nort
{
   get
   {
     return _nort;
   }
   set
   {
     _nort = value;
   }
}

ところが、このプロパティをForm2で書き込もうとすると
  Form1.nort.OpenBrowser = true;

「変数ではないため Form1.nort の戻り値を変更出来ません」とエラーになります。
367デフォルトの名無しさん (ワッチョイ 779b-+5sX)
垢版 |
2020/04/21(火) 13:38:13.11ID:3bJr7zNG0
>>366の続き

しかし、以下のようにするとエラーは消えました。

   Nortification nt = new Nortification();
   nt = Form1.nort;
   nt.OpenBrowser = true;
   Form1.nort = nt;

いったん別のインスタンスを作ってそこに構造体ごとコピーし、
コピーのメンバなら値を設定出来ました。

最後に元のインスタンスへコピーし直します。

なぜ元の構造体のメンバに直接値を書き込めないのでしょうか?
そもそも構造体の使い方が間違っていますか?
2020/04/21(火) 13:51:21.58ID:cdjEy/7BH
>>367
C#入門者が必ず嵌るポイント
c# 値型と参照型 とかでググれば腐るほど出てくる
構造体は特性をよく理解した上でパフォーマンス上のメリットがある場合のみ使うもの
今は忘れてクラスだけ使ってればいい
2020/04/21(火) 15:53:17.78ID:1MDMdwK80
このメモリ大容量時代に構造体プログラミングなんてすなや
2020/04/21(火) 16:02:20.66ID:LjsiMFkA0
必要なとこでは必要なんだよ
2020/04/21(火) 16:39:28.13ID:tax3JV1pr
でもまあここでは要らないわな
2020/04/21(火) 16:39:46.61ID:LjsiMFkA0
そだね
373デフォルトの名無しさん (ワッチョイ 779b-+5sX)
垢版 |
2020/04/21(火) 16:44:50.57ID:3bJr7zNG0
おっしゃるとおりクラスに変更したところエラーは出なくなりました。

ググると以下のページのような記述がありました

https://smdn.jp/programming/netfx/valuetype_referencetype/#value_type_property
値型では代入時にコピーが作成されますが、値型のプロパティやインデクサから値を
取得しようとする場合も同様にコピーが作成されます。
値型のプロパティ・インデクサはインスタンスそのものではなくインスタンスのコピーを
返すことから、直接インスタンスを変更することができません。
そのため、次の例のように値型のプロパティを直接変更しようとするとコンパイルエラーとなります。
参照型では変更しようとするインスタンスを参照によって取得することができるため、
コンパイルエラーとはなりません。

>値型のプロパティはインスタンスそのものではなくインスタンスのコピーを返す

ということなのでやはり構造体の型をプロパティにするのは使い勝手が悪そうですね

いっそインスタンス作成時にpublicにしたほうがいいかもと思いました
374デフォルトの名無しさん (アウアウウー Sa1b-V/21)
垢版 |
2020/04/21(火) 16:56:16.12ID:K2Bh67Tta
>>373
コードを書く側の立場で考えると

>構造体の型をプロパティにするのは使い勝手が悪そう
これはむしろ逆の場合が多いと思うよ。
考えてもみてよ。
プロパティーの値が変更された時の処理をプログラマは普通プロパティーのセッターに書く。
ゲッター経由でプロパティーが実質的に変更されてしまう可能性があるとしたら?
2020/04/21(火) 17:27:49.13ID:2AP1dLJq0
もしかして: notification
376デフォルトの名無しさん (ワッチョイ ff2d-QsZ8)
垢版 |
2020/04/21(火) 17:34:55.97ID:Q9kb1Yoh0
値型で高速化の話が出てきたついでに教えて欲しいんだけどさあ
下のそれぞれの変数って、スタックとヒープどっちにメモリが確保されてるの?これであってる???

静的なint型の変数・・・・スタック
静的な構造体・・・・スタック
mainメソッド内に宣言されたint型の変数・・・・ヒープ
mainメソッド内に宣言された構造体・・・・ヒープ
インスタンス内で宣言されたint型変数・・・・ヒープ
インスタンス内で宣言された構造体・・・・ヒープ
2020/04/21(火) 18:06:24.10ID:3Z0ku97Y0
VisualStudioプロフェッショナル版以下使用時、
プログラムの概観を素早く把握したい時ってどうするのがベストなんでしょう?
ctrl + m → o ?

逆に把握してもらいたい時はDocFXとかに頼る形になるのかな
2020/04/21(火) 18:43:14.63ID:gorOElOo0
概要をさくっと把握する、にコード見ろになるの?
概要こそドキュメント、もしくはファイル先頭に概要コメントで詳細は各メソッドのコメントなりコード見ろじゃない?
docをコメントから自動生成するなら書いてある内容の粒度はコメントだろうがドキュメントだろうが変わらん
プログラマが見るならIDEで見れたほうがいい場合もあるしそうじゃないなたhtmlドキュメントみたいなのが良い場合もある
379デフォルトの名無しさん (ワッチョイ ff8e-eUuY)
垢版 |
2020/04/21(火) 18:50:11.10ID:XAeWC18v0
>>366
なんでget,setしとるの?
2020/04/21(火) 18:52:56.43ID:cdjEy/7BH
>>376
ローカル変数以外は全部ヒープ
なおローカル変数もクロージャ等によりヒープになる場合がある
2020/04/21(火) 18:57:38.36ID:gorOElOo0
>>376
ついでにいうとそもそもint自体も構造体だよ
2020/04/21(火) 19:18:17.27ID:mEER3mJt0
>>381
mjd?
2020/04/21(火) 19:36:44.84ID:DjpYKR7GM
意識しすぎてstringクラスでまた勘違いする
384デフォルトの名無しさん (ワッチョイ b7cf-RulI)
垢版 |
2020/04/21(火) 20:51:10.54ID:E4gE2B8j0
>>379
get,setしないとフィールドにアクセスできないじゃん
385デフォルトの名無しさん (ワッチョイ ff2d-QsZ8)
垢版 |
2020/04/21(火) 20:56:24.99ID:Q9kb1Yoh0
>>380
全然わかってなかったぜ、ありがとう!
2020/04/21(火) 21:28:08.07ID:Vo0c0hBga
>>382
組み込みの値型
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/builtin-types/value-types#built-in-value-types
2020/04/21(火) 21:44:15.58ID:9fcQjJm80
>>373
structをref returnする方法もある

public ref Nortification nort{
get{ return ref _nort; }
}
2020/04/21(火) 22:34:21.97ID:gnqBqFRT0
>>380
ローカル関数ってパフォーマンス上悪手だったんだ
てっきりcall前の引数のpush等がなくなる分有利かと勘違いしていたわ・・・
389デフォルトの名無しさん (ワッチョイ ff8e-eUuY)
垢版 |
2020/04/21(火) 23:09:05.72ID:XAeWC18v0
>>384
structだぞ
2020/04/22(水) 02:26:50.40ID:C83u6fr40
https://dotnet.microsoft.com/download/dotnet-framework/net48
のDeveloper Pack をインストールしました。

C#の言語バージョンは 8.0 になると思ったのですが、現在は 5 のようです。
--------------------------------------------------------------
C:\Windows\system32>csc
Microsoft (R) Visual C# Compiler version 4.8.3752.0
for C# 5
Copyright (C) Microsoft Corporation. All rights reserved.

This compiler is provided as part of the Microsoft (R) .NET Framework,
but only supports language versions up to C# 5,
which is no longer the latest version. For compilers that support newer versions of the C# programming language,
see http://go.microsoft.com/fwlink/?LinkID=533240
--------------------------------------------------------------

どうすれば、C# 8 を使用出来ますか?
2020/04/22(水) 09:28:54.12ID:lrNM/Ez+a
>>390
手で入れたことはないから確証はないけど、.NET Frameworkに含まれるC#コンパイラはRoslynになる前の旧世代のもので止まっているのだろう
普通、新しい.NETはVSのインストーラから入れるもので、そうすればRoslyn世代のコンパイラも勝手に入る
ちなみにC#8では.NET Coreのみに対応しており、.NET Frameworkは完全にサポート外になった
2020/04/22(水) 15:03:54.78ID:Tc3u/Tz90
> ちなみにC#8では.NET Coreのみに対応しており、.NET Frameworkは完全にサポート外になった
そんなわけあるか
普通にコンパイルできるわ
2020/04/22(水) 15:23:15.27ID:NZfVsFFq0
>>392
非対応の機能使ってなければコンパイルできるよね
2020/04/22(水) 15:23:51.48ID:NZfVsFFq0
>>391
.NET Standardも2.1なら対応してるやろ
2020/04/22(水) 15:25:45.83ID:M4wrH+Xp0
C# 8.0 の新機能
https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-new/csharp-8

>C# 8.0 は .NET Core 3.x と .NET Standard 2.1 でサポートされています。
2020/04/22(水) 20:18:39.80ID:oGjFYrP4M
.NET Frameworkは.NET Standard2.1はサポート対象外なのか

非同期ストリームやインデクサやrange等は.NET Standard 2.1なので、C#8.0を.NET Framework 4.8に設定すると使用できなくなる

.NET Core 3.0やXamarin、Unity、Monoはすべて.NET Standard 2.1を実装する
2020/04/23(木) 13:32:04.15ID:UY53iXGX0
coreに行っとけってこった
2020/04/23(木) 17:51:59.15ID:YT2pRfjo0
Coreにさっさと移行すべきというのはその通りだが
C#8の文法に必要な大体のライブラリは.NET Framework用にバックポートされてNugetで公開されてる
399デフォルトの名無しさん (アウアウエー Sa6a-0GGu)
垢版 |
2020/04/23(木) 19:26:18.65ID:iR4g/Ykka
言いたいことは判るがそれは論点ずらしだ
2020/04/23(木) 19:57:39.98ID:m302zc2R0
作成したアプリの.NETのバージョンが4.6.2で古い4.5がインストールされている環境でも動作させたいのだけど、何もしなくても動かせますかね?使ってるc#のコードは、4.5以降なら動作するんですが。
アプリケーション構成ファイルのsupportedRuntimeとか書き換えるとか何か必要ですか?
2020/04/23(木) 20:04:56.27ID:ngI9YQpk0
>>400
プロジェクトのプロパティでアプリケーションの対象フレームワークを4.5に変更してからリビルド
2020/04/23(木) 20:17:04.06ID:m302zc2R0
>>401
ありがとうございます。
リビルド出来たらしたくないのですが。
インストールされている.NET毎にアプリリビルドが必要になるんですね。リビルドしないで配布する方法あればいいのですが。
2020/04/23(木) 20:26:13.85ID:AGd9KY8X0
古いバージョンならリビルドしないと無理。逆は大丈夫だけど。
2020/04/23(木) 20:26:49.41ID:AGd9KY8X0
ちなみになんでサポート切れのバージョン使ってんの?
2020/04/23(木) 20:38:44.94ID:YT2pRfjo0
そのアプリが面倒みる最低バージョンでビルドしとけばいいよ
もちろんそれより上のバージョンでちゃんと動くことを保証するものではないけど
2020/04/23(木) 20:39:33.00ID:m302zc2R0
>>403
ありがとうございます。
そーなんですね。では、4.5でビルドして配布することにします。

>>404
どーせなら、古い環境でも動く人用にもサポートしとこうと思いまして。
2020/04/23(木) 20:50:49.64ID:AGd9KY8X0
>>406
Windows10は最初のバージョンから既に4.6がプレインストールされてたはずだけど…まだ7使ってんの?しかもサポート切れのままで?
2020/04/23(木) 21:12:57.93ID:YT2pRfjo0
Windows 8.1さんを忘れるんじゃない
409デフォルトの名無しさん (ワッチョイ 968e-iRnL)
垢版 |
2020/04/23(木) 21:18:36.78ID:A1RPJ5qa0
>>384
答えろよ
2020/04/23(木) 21:22:31.43ID:AGd9KY8X0
>>408
ごめんわざと
2020/04/23(木) 21:29:24.37ID:tIS/wRWha
あれれ、たしか数年前の時点で
.NETFramework4.5.2以下のサポートは強制打ち切りになったはず・・・・
いまは最低4.6にしとけば全環境カバーできるものとばかり思ってたけど、俺なにか勘違いしてる?
2020/04/23(木) 21:34:01.17ID:AGd9KY8X0
>>411
4.5.2はまだサポートされてるっしょ
2020/04/23(木) 21:39:29.55ID:tIS/wRWha
ごめん自己レス
4.5.2「以下」じゃなくて4.5.2「未満」が2016年1月13日でサポート終了だった・・・間違えて覚えてたわ
https://www.atmarkit.co.jp/ait/articles/1503/04/news141.html
2020/04/23(木) 23:58:26.72ID:9prkr8SY0
7もまだESUってのがあるからあと3年弱は現役だぞ
2020/04/24(金) 01:05:13.24ID:agN2oJUo0
>>414
でも4.5はサポート切れ
416デフォルトの名無しさん (ワッチョイ d49b-Ue8b)
垢版 |
2020/04/24(金) 11:08:50.08ID:VS+6OBXT0
メソッド内でnewしたインスタンスはメソッド抜けたら破棄されるから
disposeしたりnull代入したりする必要はありません!

っていうネット記事を見たんですが本当ですか?
メソッド抜けたら破棄されるのは値型の変数だけで
インスタンスが消費するメモリは解放されないと思っていました
2020/04/24(金) 11:12:48.04ID:0XMd7UjD0
GCが気が向いたときに掃除してくれるんじゃなかったっけ?
2020/04/24(金) 11:22:24.63ID:jeeSLMOH0
Disposeやnull代入してもそのクラス自体のメモリは解放されない
C#においてはそこはガベコレの担当であって基本プログラマはコントロールできないので少なくともnull代入は完全に不要
Marshal.AllocHGlobalのような明示的に解放しなきゃいけないアンマネージドリソースを使ってる場合にはIDisposable.Disposeが必要になる訳だけど、
ただそれも明示的にDispose()を呼ばずとも一応GCによる破棄タイミングで自動的にDispose()が呼ばれるので絶対呼ばなきゃいけない訳ではない(なんかの理由でDisposeに関しては明示的に呼んだ方が良かったはずだけど)
2020/04/24(金) 11:41:15.89ID:agN2oJUo0
>>418
Disposeで破棄せずに(保険用の)ファイナライザーに任せると、実際に破棄されるタイミングがgen0→gen1みたいに後回しになっていって高コストになるからね
420デフォルトの名無しさん (アウアウウー Sab5-BpYI)
垢版 |
2020/04/24(金) 12:08:50.65ID:hmKdXDZUa
>>416
ネット記事じゃなくてちょっと前のここのレスじゃないのそれw
421デフォルトの名無しさん (アウアウエー Sa6a-0GGu)
垢版 |
2020/04/24(金) 12:14:59.67ID:FFBNt2WCa
>>416
スコープ抜けてからでも使用される戻り値とかはそうだね
スコープ内で完結してたら?
422デフォルトの名無しさん (ワッチョイ d49b-Ue8b)
垢版 |
2020/04/24(金) 12:25:56.45ID:VS+6OBXT0
>>420
この記事だったかも

https://qiita.com/7of9/items/ed4aa75852ae92c9cc58#comment-3cd34c69333eaf1c2d1e
nullを入れるのはやめましょう。
そんなことしなくてもローカル変数なら最後に登場した箇所以降はスコープ抜けたのと同じ扱いに最適化されます。

入門書にはnullを入れるよう書いてあるのもあるのですが・・・
https://i.imgur.com/VMOSHDY.gif
423デフォルトの名無しさん (アウアウウー Sab5-BpYI)
垢版 |
2020/04/24(金) 13:00:24.56ID:hmKdXDZUa
>>422
null代入は無意味は(ほとんどの場合)本当
それ言ってるのたぶんVB上がりの人
メモリーの管理はシステム任せでOK

Dispose無意味は(ほとんどの場合)間違い。
IDisposableをわざわざ実装しているのは、不要になったら可及的速やかにDisposeして欲しいから。
コンピュータのリソースにはシリアルポートみたいに数個しか存在しなかったり、拡張スロットやUSBにぶら下がってる
ハードウェアみたいに排他的にしか使用できないものがある。

そういうのは使い終わったらとっとと解放してやらないと他で使えないことになる。
IDisposableはそういう使い方を想定している
2020/04/24(金) 13:11:21.82ID:agN2oJUo0
>>422
何その画像…デタラメやん
2020/04/24(金) 13:15:41.83ID:5EQwPUhVa
間違ってはいないだろ
nullを代入しておけば、メソッドを抜ける前にGCが走った場合に早期に解放されるかもしれない
ほとんどのメソッドは一瞬で抜けるため無意味だが、極一部の長時間抜けないメソッドではnull代入は必ずしも無意味ではない
2020/04/24(金) 13:22:18.77ID:rjwoLxqDH
null代入して直後にGC.Collect呼ぶのはやったことある
古い.NETのバージョンだと、画像処理とかで巨大なオブジェクトを何度も確保しようとするとメモリ不足で落ちるケースがあった
2020/04/24(金) 13:47:27.48ID:agN2oJUo0
「インスタンスを解放するためには、b=null; とする必要があります」ってのは明らかに間違いやろ
2020/04/24(金) 13:49:36.10ID:DJ6Oa20x0
>>422
参考のためにその本のタイトルと著者を教えてもらえるかな?
2020/04/24(金) 14:38:19.92ID:+jmL6Bae0
bがこの後どのような使われ方するのか分からんことには何とも言えん
2020/04/24(金) 14:56:29.99ID:DJ6Oa20x0
この本はその1ページで説明が完結していて、そこでnullを代入しないとメモリリークが発生すると誤解されるような記述の仕方をするのは、入門書としてNGだろう。
2020/04/24(金) 15:17:25.33ID:ANXSn9cW0
>>428
右端の「4日目 オブジェクト指向(1)」という柱でググると、インプレスの『1週間でC#の基礎が学べる本』がHitするな
あってるかどうかは知らん
432デフォルトの名無しさん (アウアウウー Sab5-BpYI)
垢版 |
2020/04/24(金) 15:49:58.69ID:hmKdXDZUa
10年ぐらい前、本屋で結構挑発的なタイトルのCの入門書を見つけたので
立ち読みしてみたら前書きでnullと\0を混同してる記述を見つけてひっくり返ったことがあるw

学校の教科書じゃないんで本に書いてあるからって鵜呑みにしない方がいいねこの分野は。
433デフォルトの名無しさん (アウアウエー Sa6a-0GGu)
垢版 |
2020/04/24(金) 16:15:17.70ID:3fWjsT92a
>>427
b=null; にしておけばいつの間にかインスタンスが解放されるかも知れません

くらいですね
2020/04/24(金) 16:28:15.46ID:qTnWiq4N0
>>425
その認識が間違いだよ
GC目的でローカル変数にnull入れるのは無意味
https://devblogs.microsoft.com/oldnewthing/20100810-00/?p=13193

ローカル変数じゃなければ意味がある場合もあるが入門書で書く内容ではない
2020/04/24(金) 16:41:13.14ID:agN2oJUo0
>>433
別にそうする必要はないから誤解を招くような記載は不要
2020/04/24(金) 17:05:36.49ID:+Mxb0Kwr0
>>418
たとえ null 代入がガペコレの契機にならなくとも、ヒューマン側では意図を明確に記述している点で、null 代入は推奨できる記述方法なのでは?
2020/04/24(金) 17:08:09.05ID:WBygUvPh0
sync;sync;sync; みたいな物か
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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