ふらっと C#,C♯,C#(初心者用) Part140
■ このスレッドは過去ログ倉庫に格納されています
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■関連スレ
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/
■前スレ
ふらっと C#,C♯,C#(初心者用) Part139
https://mevius.5ch.net/test/read.cgi/tech/1533466544/
■コードを貼る場合は↓を使いましょう。
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 >>58
var asc = Enumerable.Range(lower, upper - lower);
var dec = asc.Reverse().Skip(1);
var seq = asc.Concat(dec).Repeat(100);
foreach (var x in seq) Console.WriteLine(x); >>60
訂正
一行目は (lower, upper - lower + 1); の間違い >>58
ベタに書くのが一番でしょ
難しく考えるのも変な技巧を凝らすのもよくない
IEnumerable<int> AlternatingSequence()
{
const int min = -10;
const int max = 10;
for (;;)
{
for (int i = min; i < max; i++) yield return i;
for (int i = max; i > min; i--) yield return i;
}
} >>60-62
ありがとうございました
とくに>>62さんの案がしっくりきました
yieldは見たことはありましたが実装したことがなかったので勉強になりました int f(int x) {
int xx = x % 20;
if (xx < 10) return xx - 10;
else return 20 - xx;
}
Enumerable.Range(0, n).Select(f) 初心者なりにSQLiteに接続したくて以下のような最低限のコード書いたのですが、
この時点で明らかにおかしい場所はありますか?
https://ideone.com/w70wHX 情報処理試験の勉強をしていてセマフォというものを知ったのですが、C#の実務で使うシチュエーションはあるでしょうか?
いつ使うのかなと疑問に思いまして 使わないよ
ドカタ現場で使っても誰も理解できないだろうし、業務アプリのアプリケーションコードのレベルでそんな細かい排他制御が必要になることはまず無い
普通にロックすればよい 他にスマートな並列処理制御が沢山有るからセマフォ、ミューテックス、lockは最後の手段という感じ WindowsFormでテキストボックスのスクロールバーを切り離したいのですが
テキストボックスとは別に配置したVScrollBarをコントロールの
スクロールバーと連動させるにはどうすればいいですか?
スクロール位置については調べて出てきた物を弄ればいけそうなのですが、
長さをどこで読めば良いのかわからず……
用途としてはテキストの折り返し位置を数値指定したくて無理矢理実装した状態です。
テキストボックスのサイズ自体を変更し、ワードラップを利用して無理矢理テキストの折り返しを作ってるので
テキストボックス自体のスクロールバーは隠してしまって
目に見える場所に操作用のスクロールバーを置きたい具合です。
Textboxをオーバーライドしてテキストの表示領域そのものを弄る事ができるなら
そちらのほうが理想なのですが、自分ではどこをどう弄ればいいのかわからず……
よろしくお願いします。 >>72
すみませんPaddingとか右余白で散々ググって出てこなかったので
無いものと思い込んでたんですが>>73を見てプロパティ漁り直したら
普通にRightMarginを発見して解決して顔真っ赤にしてるので無かった事に……
俺の半月はなんだったんだ…………
スレ汚し失礼しました!! >>74
スクロール位置はそのページとかで沢山サンプルがあるのですが
スクロールバーの長さを連動させる方法が分からなかった具合です……!
結果そんなことをする必要はなかったのですが
色々応用が利きそうなので今後のために知っときたさはあります…… IntPtrからList<int>に変換する方法を教えてくださらんか... >>77
IntPtr型の値が指すアドレス基準に、指定個数分のデータを、という話なら
Marshal.Copyで配列にコピーしたあとにListに変換する >>77
unsafe { var list = new ReadOnlySpan<int>((void*)ptr, n).ToList(); } VBA上がりでC#勉強中なんですが、
別クラスに書いたコードを使いたい時、
○○ △△ = new ○○を記述して使ってるんですが、form Loadとかchangeイベント等で復数回登場する時でも都度使う所の近くで書いた方がいいんですか?それとも上部のpublicの所に書くのがいいんですか? >>80
どうでもいい
人間の操作によって発生するイベントの頻度なんぞコンピュータの時間スケールからすると全く無視できる >>80
メソッド間でインスタンスを共有すべき理由がないなら個々のメソッドでインスタンス化したほうがいい
メソッドの独立性が高まり変更しやすくなるから namespaceまで作ってプログラムしたことが無いのですが、プロは駆使するのが普通なのでしょうか?
アニマルインタフェース実装した猫クラスと犬クラスを人クラスがメッセージ出して鳴かせるレベルの超初歩設計しかした事無いので、どこでnamespace使うのかなと悩んでおります ファイルいっぱいあったらフォルダ分けして整理するやろ?
namespaceもおんなじようなもん >>80
変数宣言や初期化の位置と
使用場所との距離の質問だとして
宣言箇所と使用箇所はなるべく近くにするのが言語に限らずセオリーだよ
可読性とリファクタリングの点で >>80
C時代の名残りはVBAに強く引き継がれ
VBA使いがC#に引き継いで行く
最初からpythonやる人間を雇うのが正解 JavaをやっていてJavaらしいコードを書ける人は大勢いるだろうけどさ
C#らしいコードを書ける人って、C#でプログラミングをしてる人の1割もいないんじゃねえのか? 千行近いメソッドで変数が先頭でまとめて宣言されてるC#のコードみるとゲンナリ だってBasicから始めた自分は
変数は頭にまとめて書いてある方が分かりやすいモン! >>80は
>それとも上部のpublicの所に書くのがいいんですか?
と書いているので、質問の意図はメソッド内の変数の宣言や初期化の位置についてではなく、
同じクラスのインスタンスを複数のメソッドでnewして使ってる時に、
これをローカル変数ではなくフィールドにした方がいいのか?ってことじゃないのかな。
そうであるなら答えはNo。
フィールドにしなくても要件を満たせるものをフィールドにしてはいけない。
何にしても、質問は意図が分かるように書いて欲しいね。 forのループ変数がループの外で宣言されて使い回しされてるのわろた クソコーダーのこだわりなんざどうでもいいからさっさと動くのリリースしろよ。テストできねーじゃねぇか。 W indows Fromアプリを作っています。
途中でアイコンを変更しました。Formプロパティ部分とプロジェクトのプロパティ-アプリケーションのアイコンの2か所です。
実行時のFormとエクスプローラでも詳細表示は変更後のアイコンになるのですが、エクスプローラでの大アイコンやショートカット、ドラッグした時のアイコンが古いままです。
どうすれば新しいアイコンに更新できますか。 一度Windows標準のアイコンに戻して
再度新しいアイコンを選択してSaveしてから
再起動すれば更新されてない? >>94
アイコンファイル自体に問題がある、なんてオチだったりしない? >>94
アイコンが変更されるのはWindowsの気まぐれだから変更されるまで待て >>95>>96>>97
レスありがとうございます。
アドバイス試してみましたがダメでした。気長に待ってみます。 アイコンってどっかでキャッシュクリア的なことできなかったっけ? >>99
やってみたけどダメだった
気長に待つしかない 質問ですが
デバッグ構成でのexeとリリース構成でのexeは
デバッグ情報が邪魔する分、デバッグexeの方が遅いという話は知っていましたが
「微々たるもんだろ」とあまり気に留めてませんでしたが
それが原因と思われる現象に当たりまして・・・
デバッグは問題無く通るので実行すると、データが混雑すると固まるのです
試しにリリース構成のexeにしたら問題無く動きます
どうやらデリゲートのBeginInvokeを使っているので
非同期処理になりタイミングずれにデバッグ情報が相まって固まってるようなんだけど
こういう場合
「リリースexeで問題無いならいいじゃん!」なのか
「いやいや、タイミングがずれるとエラーが出る可能性があるなら対処しておくべき!」なのか
どうなんでしょうね? Html Agility Pack を使ってHTMLのスクレイピングをしているのですが、
↓のソースだと<h1>タグが存在していないとNULLエラーになります。
Try Catch を使わないでエラーを出さずに済む方法ってありますか?
// Html Agility Pack
var htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.LoadHtml(htmlText);
var elm = htmlDoc.DocumentNode
.SelectNodes(@"//h1")
.Select(a => a.InnerText); SelectNodesがnull返すなら
.SelectNodes(...)?.Select(...) >>104 .
SelectNodes(...)?.で解決しました
var elm?とか .Select()?とはやったのですがうまくいかず、わからなかったのですが
そこで使うんですね
ありがとうございました。 >>101
原因の予想をそう考えているなら、CPUクロックを 1GHzとか遅くしてリリースexeで試してみるとか
(PCに負荷がかかっててもうまく動作するかってこと) XMLを読み込んで編集して保存する方法はいくつか有るようだけど制約なければXDocument使っとけばOK?
ちなみに構造が複雑なので静的モデルを作ってデシリアライズ->シリアライズが難しい場合の話 >>101
それReleaseでも負荷高くなったら起きるんじゃないのか >>109
それでいい
XMLを使わなければならない制約もないなら今のMSはJSON.NETを強く推奨してるけど PC版Lineに来る最新メッセージを読み取る方法ってある?
調べても出てこず... >>112
Kakaotalkのメッセージはやったことあるけど
暗号化されいて凄くめんどくさいよ。
俺なら素直に諦める。 >>113
APIみたいなのはやはり準備されていないのね
把握した
調べまくる時間とか無駄にせず助かりました console.writeってコンパイルの最適化時に削除されますか? >>115
されたら困る
それデバッグ用の機能じゃないよ 最終リリースする時は、console.writeの類のものは削除しないとexeの中に入ってしまうんかな? #if DEBUG
Console.WriteLine("Debugにゃん");
#endif >>117
Debug.Writeの方を使えばよいのでは?
https://docs.microsoft.com/ja-jp/dotnet/api/system.diagnostics.debug.write
見ての通りConditional属性が付いてるから、Release時にはこいつを呼び出すコードそのものが消える >>119
ありがとうございます、Debug.Writeを使うようにします。 工数一週間以上の開発ならちゃんとしたロギングライブラリ使ったほうがいいよ >>121
全部クソ
なんでキューに入れんねん
キューに積む形のログ出力ライブラリは全部クソ
ログアウト id223しました
ログイン id223しました
ってアホかw どのログ出力ライブラリの話をしているかは知らないが
キューで実装されているならログ順序は保証されるだろうに
もしくはスレッドセーフでないライブラリを複数スレッドから触っているか >>123
え?スレッド間で?
お前ちょっとだけ頭使ってレスしろよ >>123
情報が小出しかつ不明瞭だからエスパーしているが
複数スレッドからログ出力する場合の順序が未保証だからじゃないか
それがログ出力ライブラリとして妥当かどうかは更に別の話になるが
キューに積む積まない問わず、いいログ出力ライブラリって何がある? 最近だとSerilogかな
ファッキンビチグソlog4jのパクリ系じゃないからシンプルで使いやすいし、
後でログの解析が非常に容易 私たち日本人の、日本国憲法を改正しましょう。
総ム省の、『憲法改正國民投票法』、でググって
みてください。拡散も含め、お願い致します。 log4系はネット上に情報が沢山あるのと
自分が溜め込んだ資産が沢山あるからつい使いまわしちゃうな
仕様は確かにファッキンだが >>128
使い方間違えててマルチスレッドモードになってない率95%のlog4さんじゃないですか GUIアプリケーションでのawaitについて教えてほしいんだけどさあ
↓この処理をボタン等のイベントから実行した場合、JklあるいはAsdfasyncが終了したかどうかってどうやってメインスレッドから取得するものなの?
async Task Asdfasync(){
await Jkl();//終わるまで画面をロックさせたくないが、これが終わっていない段階で他のボタンを押されると困る
} それが使えるのならありがたいけど、ボタンのイベントから呼び出されたメソッドの戻り値って取得できるものなの? 素直ににawaitの前後でボタンをDisable/Enableではあかんの?
そもそもそのためのawaitでしょう。
もちろん、常にそうできるわけじゃない(JKが終わったからって無条件でボタンをEnableに
できないような要件もありうるから)だろうけどほとんどの場合はそれでいいでしょ await は非同期処理を、同期的に書けるもの
await で検索すれば? >>133
そのAsdfasyncとやらは直接イベントに接続せずに
別のイベントハンドラから自分で呼び出すんやろ? 先に云っとく、良いソースじゃない。
こういう雰囲気?
Formにボタンを2つつけて動かしてみて
private Task __results;
private void button1_Click(object sender, EventArgs e)
{
if ((null == __results) || (__results.IsCompleted))
{
System.Diagnostics.Debug.WriteLine("Pass");
__results = Task.Run(() =>
{
this.Invoke(new Action
(() =>
{
button2.Enabled = false;
}
));
Task.Delay(5000).Wait();
this.Invoke(new Action
(() =>
{
button2.Enabled = true;
}
));
});
}
else
{
System.Diagnostics.Debug.WriteLine("Fail");
}
} ごめんなさい。
たぶん、全然検討違いだな。
スレ汚しごめん コンボボックスが20個。
エクセルシート2の指定列の内容を各コンボボックスに入れる。
※cbo1には4列目、cbo2には10列目などバラバラ。
closedExcel?で読み込んで入れたんですけど、うまい作り方を教えてください。
Clsdata.CboAdd(this,tarPath,tarShtname,”4”,cbo1)
みたいに引数違いを20個書き、別クラスに追加するコード書いたんですけど、データだけ取ってきてクラスじゃなくフォームの方に書いた方が分かりやすいですかね?
別フォームでもコンボボックスに同じように追加するのがあるので使い回してるんですけど...
説明下手で申し訳ないですが、ご教授下さい。 >>139
ワークシートを操作するクラスを作って、そこに列のデータをobject[]かstring[]で返すメソッドを書く
public object[] GetColData(int col) { ... }
それをコンボボックスにセットするコードはForm側に書く。
コンボボックスを引数で渡すような馬鹿なことはしちゃだめ >>139
1クラスでlist<string>を作る
シート番号、セル開始行、列、セルの終わりを入れる
combobox1.items.AddRange( )で
2 コンボボックスをList化しておく
コンボボックス番号を入れるとitemsにかえしてくれるクラスにする
3 エクセルにコンボボックス番号、シート番号、セル範囲をかいておく
それをコンボボックスのアイテムに入れてくれるクラスを作る
エクセルをいじるだけでコンボボックスのデータができる
こんな感じかな? C#やってきたけどjava土方のが仕事あって羨ましい
シンタクスは似てるけど採用側はjava経験者しか見ないし
最初の開発重要だな >>142
Javaは絶対やっといたほうがいいよ。
c#perであれば2日で基本はマスターできるよ。c#と違ってawt,swing,fxは全部使い物にならないからパスでいい。
後はspringframeworkぐらい理解しといたら間違いなし。
Javaは21世紀のCOBOLなんだからあと30年はやっていける。 ユニットテストやらリファクタリングやらデザインパターンの本は大抵Javaで例示してあるからそっち勉強するならJava知ってて損はないな いや、そもそもJavaの案件なんかやらない
やれって言われてもやらない へーJava勉強してみようかなー
ってJavaとJava Scriptの違いをさっき調べて知ったくらいだけどwww ババ引いてくれる底辺労働者一人確保出来て良かったね まずこの本で、オブジェクト指向を学ぶのが、Java の定番!
スッキリわかる Java入門 第2版、2014 >>140
>>141
ありがとうございます。やっぱコンボボックスの引数はよろしくないですよね。
内容を取ってくるコードって一回で読み取る事は出来ますか?上から繰り返しで配列に入れるんですかね? ずっとC# + Windows FormsでGUIやってたけど、C++とWin32API使い始めたら、めっちゃ高速でびっくりだよ。
GIUI使いたい人はC#なんて捨てちまえ。 >>151
できる
コンボボックスを配列化する
シート名 列番号をエクセルにデータで書いておいて
あとはforで繰り返す >>152
このスレC++,MFC,ATL,COM+を経て、C#のやつも結構おるだろ 個人で作るならだけど、納期に間に合わせる。
バグ作って責任取らされる。
そう言うリスクから離れたいから、仕事じゃ使いたく無いな。
いあ、もう辞めたけど。 リアルタイム通信系なら少しでも高速化するのは理屈通ってるけど
そうでないのなら安定感捨ててまでコンマの差を取るかというと……
って印象であってる? 一般的にはその認識は間違ってる
納期の制約があるなら最初の開発段階での最適化は結果的にアプリケーションのパフォーマンスや品質を下げる原因になることが多い
一度組み上げてから余った時間で最適化やバグ取りをした方が品質はほぼ間違いなく高くなる .NETの黎明期から耳タコのはずだけど、そもそも大半のケースは
起動の遅さをパフォーマンスの悪さと錯覚されてるだけw
>>151
プログラムはシンプルに。
何を言ってるのかよく分からないけど、複数の列のデータを一度に返すメソッドを書きたい、
と言ってるなら、そんなことは出来てもやらない方が吉。
そんなのは多分可読性を下げるだけ。
ベタに、
ComboBox1.Items.AddRange(xlSheet.GetColData(5));
ComboBox2.Items.AddRange(xlSheet.GetColData(1));
ComboBox3.Items.AddRange(xlSheet.GetColData(9));
...
こう書いた方がぱっと見て何やってるかわかるでしょ。
こういう羅列がどうしても許せないならTagに対応する列の番号を入れておく方法もあるが、
個人的にはお勧めしないなあ ■ このスレッドは過去ログ倉庫に格納されています