ふらっと C#,C♯,C#(初心者用) Part147
■ このスレッドは過去ログ倉庫に格納されています
!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 WinformsやWPFは各々フレームワークのコンポーネントの初回呼び出しで
それぞれ専用の同期コンテキストを自動で現在のスレッドに設定して
await 式から自動生成されたコードで現在の同期コンテキストのSendやPostを呼び出してるって割と単純な話だわよ 質問失礼致します。
ttps://xr-hub.com/archives/20326
の2番目のサンプルコード「Person.cs」に
public Person(string name, Job job)
という行があるのですが、これは関数ですか?
publicの後の型やvoidを省略した時、どういう扱いになっているのでしょうか?
(暗黙的にvoidなど)
初歩的すぎる質問ですが知恵をお借し頂ければと思います。
よろしくお願い致します。 >>311,312
コンストラクタと言うキーワード自体を知らなかったので大変助かりました!
迅速なお答えありがとうございます。 >>313
コンストラクタ知らないとか煽り抜きで基礎からやり直せ。この先すぐに行き止まりやぞ コンストラクタは言語によってちょこちょこ違いがあるからなあ
それによって作法も、チームとかのなかでの使い方も違うんだよな 初心者で妥当な用語もよく分からないのですが、
Sytem.IO.File全体を Sytem.IO.FileInfoで上書きしたり
Sytem.IO.File全体を FileUtilsにリネームして利用ってできるでしょうか
多分歴史的経緯とかなんでしょうが、名前も機能も違和感ある・・・あるよね? >>319
名前空間の上書きは出来るよ
using に= を付ける。
マニュアル読むべし 進歩しろってことだろ
>>322には一生無理っぽいが… >>321
ありがとう! alias directiveで上書きになるのか
aliasって単語から、上書き用に使うという発想が出てこなかった・・・ >>319
すでにFileInfoは存在してるしUtilsみたいな抽象的な名称はあんま好きじゃない
あくまでもnamespaceなんだから個人的に違和感は無い >>319
あなたの違和感をなくすために他人に違和感を与えるコードを書いてはダメでしょうw
そういう尾崎豊的な「世の中間違ってる!」は義務教育で卒業しておけよw
インフラはみんなが慣れ親しんで知識を共有していることに意味があるんだよw
変なエイリアスを使うことはあなたの「俺流」を理解する手間を読む人に押し付けることになる。
それは1年後の自分自身かもしれないよw 自分だけのコードなら好きにすればとしか
チームで共有するならレビューしろとしか まさにそういう話で、(大多数が慣れ親しんだ知識である)自然言語で full path of a file だから
(FileInfo) hoge.FullName より
(File) file.FullPath の方が読みやすく、知識なく利用しやすくない? と思ったんだ
自分が知らないだけでFileInfoやFullNameの方が妥当な理由あるのかな 質問です。
visual studio2013 のWEBフォーム(.aspx)を使用しています。
以下のようなフォームを作りたいです。 どうやってつくったらよいでしょうか?
▼コンビニ ←選択すると▼マークになり、折り畳みのチェックボックスリストが出る
■セブンイレブン ←選択するとレ点でなく、□を塗りつぶす
□ローソン
■ファミリーマート
△ショッピングモール ←選択しないときは△マークでリストは折りたたまれている
△スーパー
よろしくお願いいたします。 チーム内でそれを浸透させる実力があるならいいんじゃね
俺はデフォルト推奨派なので、それだけの理由なら無意味な改変に見えるので
、それは賛成しないがな
「俺が見易い」は「皆が見易い」ではない CreateFontがMFCではCreateFontIndirect
でオーヴァーライドされている事を
知った時の驚き。😵
世の中広いからそういう常識の所も
あるのでしょう❤ windowsならpathってだけで他システムでもpathかどうか?
組み込み系OSだったらディレクトリ構造持ってないようなやつあったりしないかね?全然しらんけど
つうかその程度なら332と同じく公式に準拠する
IDEがヘルプ付きで候補出してくれるんだし、リファレンスもあるんだから困るほどのことじゃない
あくまでもプログラムであって自然言語じゃない PowerShell では、FullName
$files = ls -File
echo $files[ 0 ].FullName 共有フォルダに置いてる実行ファイルで、一人が起動している時に別の人が起動したら処理中ですとお断りメッセージ出したいのですが、どういう方法で実現できるでしょうか?
DBでフラグ監理しようかとも思っているのですが、世間様はどうしているのかなと思い 共有フォルダ内に、ファイルを置いて、それに記録すれば? ロックファイル的なものを起動時に作成・チェックさせるとかかねぇ?
異常終了したりしてロックファイルが残った時が面倒だけど
そもそも共有フォルダに実行ファイルを置いて、それを起動するって運用が微妙な気がするけど それな
ファイルおいたとこで実行ユーザはローカルとか、なにそれって感じ
なんでサーバにしないのとかね Unix環境とかならファイルオープン時に共有モード指定できないから、ロックファイルを「作成」できるかで排他制御するけど、
Windows環境なら共有モード指定できるから、「排他モードでオープン」できるかで排他制御できないの?
そうすれば、ロックの解放は単にファイルハンドルを閉じるだけでロックファイルを削除する必要はない。
で、異常終了してプロセスが終了した場合はOSがプロセスによって開かれてたファイルハンドルをクローズしてくれるので、
自動的にロックも解放されるってことにはならないの?? 途中共有モードを無視するような輩がいたらあれだけど、とりあえず全部Windowsで揃えてSMBで共有すればそれでいけそうな気がする 理論通りに動けば良いなぁ
なおopenfiles ってコマンドで強制解除出来る そうすれば、アプリ起動時にnew FileStream(特定のファイル、FileShare.None) アプリ終了時にStream.Closeの2行で実装終了
Windows最強 >>345
それって共有フォルダ側が安いNAS(≒samba)でも使えるの? >>346
それは知らない。
すべては要件次第。あくまで全部Windowsで揃えられる場合の一番簡単な実装を示しただけ。
安いNASでダメだったら、君のいうロックファイルのやり方でやればいい。ただし、君の方法もひょっとしたら安いNASで「ファイルの存在確認とファイルなければ作成」をアトミックにやってくれないSMBの実装があって使えない可能性もあるので。 >>339
> そもそも共有フォルダに実行ファイルを置いて、それを起動するって運用が微妙な気がするけど
バージョンアップの手間を省きたいとかでしょ
Web化しろとかの話もあるだろうけどそこまで工数かけられないとか普通にあると思う >>337
微妙に要件と違うけど、昔のアドビのアプリは同一ネットワーク内のPCでは
同じプロダクトキーでアクティベートされたソフトは同時に起動できなかった
あれと同じ仕組みを使うことは可能じゃないか
具体的にどういう仕組みか知らんけどw DBにログインIDと開始時刻を記録して処理が成功したら記録削除、失敗してたら20分経過で無効情報で良いかと思ってます
処理が20分超えたらアウトというイケてない部分をどうしようかとも思ってます
だったらファイル管理でも良いかなと思ってますが DBに処理対象を一意な文字列にして、ユーザIDとIPアドレスをもってロックを確保しに行ってるな。
弾かれた側に「誰々がどこでロックしてるから諦めるか直談判しにいけ」ってメッセージにしてる。
ロックが外れる時間は2分にしてるけど、ロック掛けてる側が、30秒ごとに延長するように更新してる。
トランザクションは増えるけど、強制終了してロックが残ったのを外す方が手間。
20分待ってくれる方が少ないと思うぞ。
1000人ぐらいが同時に使ってるが、それほど負荷は無い。ジャーナルの残し方だけ気にした方がいいぐらいか。 >>351
タイムアウトを含めて失敗したら即リソースを解放すればいいだけでは?
あと排他制御が必要なリソースの状態を管理するテーブルと
そのリソースを誰が使ってるかみたいな情報を管理するテーブルは別にしたほうがいいよ >>353
処理失敗とかイベント取れる所なら良いのですがパソコンがネットワークからいきなり外れた時とかどうしようかなと >>354
共有フォルダに実行ファイルを置くやり方だから
クライアント側でしかタイムアウト検知できないって話なのか
そうすると>>352が書いてるような方式になるけど
サーバー側で実行するやり方なら必要のない複雑性を抱える事になるから
テストや運用時の手間を考えるとアーキテクチャ見直したほうが早い気がする chartのX軸のスクロールバーを動かしたときのイベントハンドラ的なものってありますか?
具体的には、縦軸(Y軸)の範囲を表示されている範囲内の最大値と最小値に逐次変更したいです。 >>331
この問題どなたか教えていただけないでしょうか?
とくにレ点じゃないチェックボックスを作成したいです FormにWebboewserコントロールを張り付けて ↓のコードコピペしたのですがThis がFrom1を参照しているのでエラーになります。
正しく使うのはうすればいいのでしょうか?
https://todosoft.net/blog/?p=380 今時WebBrowserコントロールは古いんですね
とりあえず、これは勉強の為のなので、WebBrowserで大丈夫です。
上記コードの this を webBrowser1 に置換すれば問題なく動きますが、thisのまま使う場合はどのようなコードになるのでしょうか? >>362
リンク先のソースのメソッドは、おそらくはFormではなくWebBrowserを継承したコントロールに書くメソッド
WinForms標準のコントロール自体に機能追加することで、あちこちのFormでWebBrowserを使うつどそういうソースを書かなくて済むようにしてる
初学者でカスタムコントロールの作りかたとか未学習なら「this を webBrowser1に置き換え」で回避してよいと思う >>362
なるほど、このコードはカスタムコントロールを目的としているのですね。
納得しました。ありがとうございました。 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 の戻り値を変更出来ません」とエラーになります。 >>366の続き
しかし、以下のようにするとエラーは消えました。
Nortification nt = new Nortification();
nt = Form1.nort;
nt.OpenBrowser = true;
Form1.nort = nt;
いったん別のインスタンスを作ってそこに構造体ごとコピーし、
コピーのメンバなら値を設定出来ました。
最後に元のインスタンスへコピーし直します。
なぜ元の構造体のメンバに直接値を書き込めないのでしょうか?
そもそも構造体の使い方が間違っていますか? >>367
C#入門者が必ず嵌るポイント
c# 値型と参照型 とかでググれば腐るほど出てくる
構造体は特性をよく理解した上でパフォーマンス上のメリットがある場合のみ使うもの
今は忘れてクラスだけ使ってればいい このメモリ大容量時代に構造体プログラミングなんてすなや おっしゃるとおりクラスに変更したところエラーは出なくなりました。
ググると以下のページのような記述がありました
https://smdn.jp/programming/netfx/valuetype_referencetype/#value_type_property
値型では代入時にコピーが作成されますが、値型のプロパティやインデクサから値を
取得しようとする場合も同様にコピーが作成されます。
値型のプロパティ・インデクサはインスタンスそのものではなくインスタンスのコピーを
返すことから、直接インスタンスを変更することができません。
そのため、次の例のように値型のプロパティを直接変更しようとするとコンパイルエラーとなります。
参照型では変更しようとするインスタンスを参照によって取得することができるため、
コンパイルエラーとはなりません。
>値型のプロパティはインスタンスそのものではなくインスタンスのコピーを返す
ということなのでやはり構造体の型をプロパティにするのは使い勝手が悪そうですね
いっそインスタンス作成時にpublicにしたほうがいいかもと思いました >>373
コードを書く側の立場で考えると
>構造体の型をプロパティにするのは使い勝手が悪そう
これはむしろ逆の場合が多いと思うよ。
考えてもみてよ。
プロパティーの値が変更された時の処理をプログラマは普通プロパティーのセッターに書く。
ゲッター経由でプロパティーが実質的に変更されてしまう可能性があるとしたら? 値型で高速化の話が出てきたついでに教えて欲しいんだけどさあ
下のそれぞれの変数って、スタックとヒープどっちにメモリが確保されてるの?これであってる???
静的なint型の変数・・・・スタック
静的な構造体・・・・スタック
mainメソッド内に宣言されたint型の変数・・・・ヒープ
mainメソッド内に宣言された構造体・・・・ヒープ
インスタンス内で宣言されたint型変数・・・・ヒープ
インスタンス内で宣言された構造体・・・・ヒープ VisualStudioプロフェッショナル版以下使用時、
プログラムの概観を素早く把握したい時ってどうするのがベストなんでしょう?
ctrl + m → o ?
逆に把握してもらいたい時はDocFXとかに頼る形になるのかな 概要をさくっと把握する、にコード見ろになるの?
概要こそドキュメント、もしくはファイル先頭に概要コメントで詳細は各メソッドのコメントなりコード見ろじゃない?
docをコメントから自動生成するなら書いてある内容の粒度はコメントだろうがドキュメントだろうが変わらん
プログラマが見るならIDEで見れたほうがいい場合もあるしそうじゃないなたhtmlドキュメントみたいなのが良い場合もある >>376
ローカル変数以外は全部ヒープ
なおローカル変数もクロージャ等によりヒープになる場合がある >>376
ついでにいうとそもそもint自体も構造体だよ >>379
get,setしないとフィールドにアクセスできないじゃん >>373
structをref returnする方法もある
public ref Nortification nort{
get{ return ref _nort; }
} >>380
ローカル関数ってパフォーマンス上悪手だったんだ
てっきりcall前の引数のpush等がなくなる分有利かと勘違いしていたわ・・・ 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 を使用出来ますか? >>390
手で入れたことはないから確証はないけど、.NET Frameworkに含まれるC#コンパイラはRoslynになる前の旧世代のもので止まっているのだろう
普通、新しい.NETはVSのインストーラから入れるもので、そうすればRoslyn世代のコンパイラも勝手に入る
ちなみにC#8では.NET Coreのみに対応しており、.NET Frameworkは完全にサポート外になった > ちなみにC#8では.NET Coreのみに対応しており、.NET Frameworkは完全にサポート外になった
そんなわけあるか
普通にコンパイルできるわ >>392
非対応の機能使ってなければコンパイルできるよね >>391
.NET Standardも2.1なら対応してるやろ 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 でサポートされています。 .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を実装する Coreにさっさと移行すべきというのはその通りだが
C#8の文法に必要な大体のライブラリは.NET Framework用にバックポートされてNugetで公開されてる 作成したアプリの.NETのバージョンが4.6.2で古い4.5がインストールされている環境でも動作させたいのだけど、何もしなくても動かせますかね?使ってるc#のコードは、4.5以降なら動作するんですが。
アプリケーション構成ファイルのsupportedRuntimeとか書き換えるとか何か必要ですか? >>400
プロジェクトのプロパティでアプリケーションの対象フレームワークを4.5に変更してからリビルド >>401
ありがとうございます。
リビルド出来たらしたくないのですが。
インストールされている.NET毎にアプリリビルドが必要になるんですね。リビルドしないで配布する方法あればいいのですが。 古いバージョンならリビルドしないと無理。逆は大丈夫だけど。 ちなみになんでサポート切れのバージョン使ってんの? そのアプリが面倒みる最低バージョンでビルドしとけばいいよ
もちろんそれより上のバージョンでちゃんと動くことを保証するものではないけど >>403
ありがとうございます。
そーなんですね。では、4.5でビルドして配布することにします。
>>404
どーせなら、古い環境でも動く人用にもサポートしとこうと思いまして。 >>406
Windows10は最初のバージョンから既に4.6がプレインストールされてたはずだけど…まだ7使ってんの?しかもサポート切れのままで? ■ このスレッドは過去ログ倉庫に格納されています