ふらっと C#,C♯,C#(初心者用) Part138
■ このスレッドは過去ログ倉庫に格納されています
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■関連スレ
C#, C♯, C#相談室 Part93
https://mevius.5ch.net/test/read.cgi/tech/1492818720/
■前スレ
ふらっと C#,C♯,C#(初心者用) Part137
https://mevius.5ch.net/test/read.cgi/tech/1523004019/
■コードを貼る場合は↓を使いましょう。
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 object型のメンバ?の値を文字列型に代入したいのですが
どのように書けば良いでしょうか?
static void Main(string[] args)
{
var obj = new { a = "a", b = "b" };
Hoge(obj);
}
static void Hoge(object obj)
{
string fuga = obj.b.ToString(); //この書き方で怒られてしまいました
}
object型は基本のようなので、根本的な所を理解していないのかも知れませんが
よろしくお願いします。 >>312
Hogeのobjはbを知らないから……かな? >>312
objectをdynamicに変えるといいよ 便乗質問していいですか?
> var obj = new { a = "a", b = "b" };
これってクラスとして扱われるんですか? インスタンスメソッドとstaticメソッドの使い分けがいまいちわからないので教えてください
public class Hoge {
private string Name { get; } = "piyo";
public Hoge(string name) {
Name = name;
}
}
上記のようなクラスがあり、これをvar hoge = new Hoge("foo"); とインスタンス化したとして、
public bool IsPiyo(){
return Name == "piyo";
}
上記のようなインスタンスメソッドを書いて、hoge.IsPiyo()とするのと、
public static bool IsPiyo(Hoge hoge){
return hoge.Name == "piyo";
}
上記のようなstaticメソッドを書いて、Hoge.IsPiyo(hoge)とするのでは、どう違い、どちらにするべきでしょうか?
なんとなく、staticの方が入力と出力がはっきりしてるのでわかりやすいのかなと思うのですが、オブジェクト指向ではないですよね インスタンスが必要かどうか。
stringクラスのCompareメソッドとCompareToメソッドが良い例。
前者はパラメータがnullでも通るが、後者はインスタンスが無いとダメ。 インスタンスメンバーを参照してないならstaticにしてる
でも必ずすべきとは思わない
仮に日本語にして考えてみる
人間クラスに "はピヨです()"メソッドをそれぞれ実装すると
if(人間.はピヨです(彼)) {〜}
と
if(彼.はピヨです()) {〜};
これを見るとstatic はおかしいと思うがstaticにすることが多い 誤解を招くような書き方だけど上のHogeなら間違いなくインスタンスメソッドにする あー、ちょっとわかってきたかもです
主語というか、意味的に、表現したい意図に近い方を選ぶ感じですかね
とりあえず今回の例で言うと、インスタンスメソッドにすることにします RuntimeHelpers.PrepareMethod(RuntimeMethodHandle)の挙動が理解できない・・・
このコードでm2にPrepareMethodを使うことは不可能ですか?
==
using System.Runtime.CompilerServices;
class B<T> { public void M() { } }
class C1 : B<int> { }
class C2 : B<string> { }
class Program
{
static void Main(string[] args)
{
var m1 = typeof(C1).GetMethod("M").MethodHandle;
var m2 = typeof(C2).GetMethod("M").MethodHandle;
RuntimeHelpers.PrepareMethod(m1); // 問題なし
RuntimeHelpers.PrepareMethod(m2); // System.ArgumentException: '指定されたジェネリックのインスタンス化は無効です。'
}
}
== >>322
別にそんなとこ気を使っても一円の利益にもならんというアドバイスも
心の片隅においておいてくれ Cでエクセルを扱っていろいろするときはやっぱcsvにしておいた方がいいのかね? >>325
何をやりたいか次第だけども、
csvで完結出来るのならcsvがいい 下手にxls使うと勝手に型変換してくれるからめちゃくちゃになるんだよな。 複数のアプリで1つのserial portを使いたくて、dllで受けて受信データによって別々のイベントを発生させ、複数のアプリに受信させようと考えました。
dll内のSerialPortをstaticで持てば共有できるかと思ったのですが、staticで宣言しても呼び出し元が別プロセスだと共有されないようですね。
何かいい手はないでしょうか。 シリアルポートと通信するサーバを作って
必要な数だけクライアントを待ち受けるのが楽なんじゃないの
プロセス間通信はソケットやパイプとか適当なものを使う 複数のアプリにどうやって通信データを振り分けるかの方が興味あるわ。 そもそもWindowsのシリアルポートって複数のアプリで共有(同時オープン)できるのか? だから質問してるんでしょw
質問者は他のアプリが占有中でも無理矢理割り込む方法を聞いてるわけじゃなく、
自作アプリの複数のプロセスで共有する方法を聞いてる だからそもそもシリアルポートは複数のプロセスで共有できないでしょって言ってるんだが
どうすべきかは>>330さんがとっくに示してるわ 言ってるんだが
いつも思うけど、こういう口調って馬鹿の間で流行ってるのかねw シリアルポートに限らずdllのstatic変数が共有できないのですが、共有したい需要ってないのでしょうか?共有したい場合はどうするのがよいのでしょうか? >>332
俺もこれが疑問だ
仮にサーバーが受けたとして
どうやって俺宛か判断するんだ? dllのstatic云々はおいといてメモリマップトファイルならC#でも使えたかな
C++ならデータセグメントを共有メモリにできる
どちらにしろプロセス間の排他制御が必要 >>342
宛先なんかなく、単に全部のアプリに同じデータがブロドキャストされれば
十分って場合もあるでしょ
例えばシリアル経由で計測器か何かのデータが送られてくるとして、
(1) 画面表示だけするアプリ
(2) エクセルにログを保存するアプリ
(3) 計測データを使って何か他の機器を制御するアプリ
何かの都合でこんな風に複数のアプリに分けて作る必要があるのかもしれない C#でのSelenium操作についても質問していいですか? >>331
レスどうもです!下のようにして上手くいきました
こうなってくるとm1に対する方法はたまたま問題が起きないだけで
m2やm3の方法のほうが望ましいように思えてきましたがそういう認識であってますか?
==
using System.Runtime.CompilerServices;
class B<T> { public void M() { } }
class C1 : B<int> { }
class C2 : B<string> { }
class C3 : B<int> { }
class Program
{
static void Main(string[] args)
{
var m1 = typeof(C1).GetMethod("M").MethodHandle;
var m2 = typeof(C2).GetMethod("M").MethodHandle;
var m3 = typeof(C3).GetMethod("M").MethodHandle;
RuntimeHelpers.PrepareMethod(m1); // 問題なし
RuntimeHelpers.PrepareMethod(m2, new[] { typeof(string).TypeHandle }); // 問題なし
RuntimeHelpers.PrepareMethod(m3, new[] { typeof(int).TypeHandle }); // 問題なし
}
}
== >>346
(確固たるソースに基づく訳じゃないので推測だけど)値型か、参照型かじゃない?
参照型の場合は TypeHandleを指定する必要がある、ってこと。 >>341
よく解らんけどdllってアプリごとにメモリに個別に展開されて初期化されるからソースコード上で同じ変数名にアクセスしても実態は違うので共有できないのは当たり前なきがする Cとかって共有されなかったっけ?よく覚えてないけど。 されるわけないだろ
何のためにプロセスがあると思ってるんだ ないって言ってんのにな
死ぬまで悪あがきしてればいいよ 何がしたいのか知らんけど、Win2k時代にシリアル通信のロガー作ったことある。あんときは、DLLをフックしてCreateFile,ReadFile,WriteFileのデータをトレースしたが、ハッキリ言ってやめたほうが良い。 ロガーだけならどこぞの口でforkすりゃいいだけだろ。
通信内容を振り分ける仕組みだと思ってたから無理って話してんだよな。 親がシリアル掴んで、名前付きパイプで子に振り分けるかなぁ。 >>332, >>342, >>353
受信データによって
って書いてるから何らかのプロトコル決めてて、アドレスとかポート番号とかの振分け用の情報あるんだろ
LANケーブルは1本でも複数のプロセスで共有してるのと同じ
ここまで書けばよほど頭の悪い奴でなければわかると思うが>>329が言うようなことは実現可能
http://nobikko-nobinobi.hatenablog.com/entry/2017/09/13/234555
ただC#だけでできるかどうかは知らん 同じDLLのstatic変数がそれを使ってることなるプロセス間で同じメモリの場所を参照するかってことじゃないの? >>356
残念だけどそれはプロセス間の共有メモリの話であってシリアルポート共有じゃないよ
シリアルポートは排他でしか開けないので他の人が書いてるようにシリアルポートをサービスで開いておくしかない
それがどのような形をとるかはいろいろある 通信量など条件にもよるけど、
シリアル受信プログラムは、データの種類によって接頭語+日時名のファイルを作る。
各アプリはファイル監視して自分用のを実行する。
とかユルイ連携にするのも手かと。同時開発しやすいしテストやトラブル対処も楽。 ASP.NET CoreにはJavaの@Transactionalのような仕組みはないのですか?
DispatchProxyを使ってトランザクション管理を自前実装してますがより一般的な手段があるなら乗り換えたいです 今時232C使ってるようなデバイスでそんな振り分けが必要なデータなんか送ってくる可能性は低いと思いうけどねw
I2Cとか485をエミューレートしてるとかなら知らんけど
そんなデバイス聞いたことないけどさ
アプリ作るのも、ブロードキャストして要らないデータはアプリ側で捨てる方が簡単で
保守性も高いでしょう どーせ、RS485/LAN変換器とか絡んでるんじゃね 普通のシリアル通信にコンフリクト回避のネゴエーショ等の機能は存在しないんだが、どうするつもりなんだろうな。
RS422規格の通信にするにしても、ドライバーが対応してないと難しいよな。ハードフロー制御なドライバーにして後はハードに頑張ってもらうのかな? >>358
>>329は受信によってイベントを発生させるとか書いてるからサービスでないといろいろ面倒だが、単にポートの読み書きを共有するだけならサービスなんていらんよ >>361
まーた、俺の環境ではそんなデータはあり得ない(キリッ
ってか
いちいちマウント取りに来なくていいよ >>347
ありがとうございます
いろいろ試してみたところ、書いてもらった通りメソッドを宣言したオブジェクトのジェネリック型引数が
全部値型ならPrepareMethodの第2引数は要らないみたいです
でも値型と参照型が混在する場合は参照型のハンドルだけ渡せばいいというわけではなくて
値型のものも含めて渡す必要があるみたいなので、
やっぱり基本的にメソッドを宣言したオブジェクトがジェネリック型引数を持つなら
第2引数は必要と考えたほうが安全な気がします >>367
こういう馬鹿みるちいつも思うけど、それやってるのはお前なんだけど...
馬鹿にも程があるなほんと >>372
これやるのも2chの馬鹿の特徴だよね
これ見るといつも思うが、こういう馬鹿には自分自身を見る自意識がないのかね。
お前自身がやってることは何なんだw
それ以前に必死だったら何なのかね。意味が分からん
まるで「お前ウンコした!!!」って騒いでる中学生だけど、ガチでそのあたりで精神年齢止まってる可哀想なお方なんだろうけどね 232C使うようなデバイスでアドレスだのポート番号だの、振り分けが必要なケースなんかレアだろう、
(質問者もそんなこと言ってない)ってのはごく普通の感想だと思うけど、異論があるならできれば
具体例上げて反論すればいい。
マウントがどうとか中学生じみたことしか言えない馬鹿は黙ってろって
いい歳こいて恥知らずかよ >>374
いう相手を間違えてるよ馬鹿
こういう馬鹿も2ch名物だな >C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください
読めないのは誰なのか 結局、物理的な線は一本なんだろ?
なんで他アプリ全員に配るんだ? >>377
お前自身も読めてない。いってるそばから「俺だけ特別」クンか
そもそもなぜ喧嘩を売った側でなく売られた側を非難するのか
馬鹿だろお前。 >>379
それは愚問。
ただ、昨日から言ってるように、現実的に考えれば質問者がやりたいことは
>>344みたいな感じである可能性が一番高いと思う。
もちろん、仮想的な複数の通信チャンネルを実現したい可能性も否定はできない 「自分自身」と「馬鹿」って来たら例外を握り潰す君だから
そいつこのスレに12年いるぜ 年いくつだろ
Hagexを刺した統失くらいはあるのかなw >>382
こいつもいつも思うけど、これで自分をおかしいと思わないんだから幸せでいいよねw
前から誰のこと言ってるのか知らんけど、この意味不明な粘着質、普通にストーカーと同じメンタルだ そもそも匿名掲示板で誰かを「特定」して付きまとってやろう、って動機が理解不能だけど、
普通の人間だったらそんな動機を持つ俺って異常なんじゃないかと悩むと思うんだけど...
いや悩まなくても、多少知恵がある人間なら、それって(2chにはよくいる)負けを認めるだけの
精神的強さを持たない弱者の「精神勝利法」なんじゃないか、とか思うと思うんだけど 遅レスですがobjectをdynamicに変えて値を取る事が出来ました
こんな便利な型があるんですね
ありがとうございました 動機ねえ、スレが荒れそうだからかな
俺に反応して貰って、俺が反応を無視すれば、とりあえず収まるんだよ
そう、いつものことだ >>375
232cは物理層の規格や。今だってモデムやTNC繋げる人もいるさ。 >>329
答え出てると思うけど
プロセスは3つにする
1つのプロセスはシリアル通信のサービスを提供
他の2つはクライアントとしてシリアル通信の要求をだす
要求はQueueで排他する等で安全策取る
プロセス間通信は適当に(ipc使えば簡単かな) >>391
あ、、、要求じゃなくてサーバーが自走して受信のイベントをクライアントに出すのか
でもそれも可能だからね おお、コンプリティッドタスク!!!
使ってみよう
ありがとうございました ipcは死んだ技術なのかと思ってたけどつかってる人いるんだね
デバッグ環境ではうまくいくけど実環境でこけることが多いから最近は使ってなかった 配列内の文字列がtargetStrに含まれてるかどうかを調べるコードなのですが
いまどき風な書き方ってありますか?
var words = new string[] { "ああ", "いい" };
foreach (var word in words)
{
if (targetStr.IndexOf(word) != -1)
{
// hit
}
} >>396
targetStrの中に"ああ"や"いい"が含まれている判定はIndexOfでいいんじゃね?
ループつかわないでLINQのAnyメソッドにしておくとか あ、すまん。おらの見ないでよかと。>>397見てなかったorz まぁ、words.Any(word => targetStr.Contains(word)) ですっきり書こう、が今時?なんかなぁ? >>400
それ、words.Any(targetStr.Contains) でいけるよ
仮引数いらん >>400-401
https://qiita.com/Temarin/items/4ac0de4f395dcecf5eec
このページでは
.Where( string.IsNullOrWhiteSpace );
よりも
.Where( x => string.IsNullOrWhiteSpace( x ) );
を推奨してるけどいまいちよく分からないから詳しい議論を聞いてみたい >>402
お前は何回Where呼ぶつもりやねんと
Whereの引数に渡すデリゲートのnewがネックになるほどタイトなループでWhere呼ぶなら、明らかにその設計自体が問題
どうでもいい机上の空論だから全く気にする必要はない
通常は、そんなことよりもラムダが間に一枚入ることによるメソッド呼び出しのオーバーヘッド増加のほうが問題になる 仮引数を省略してるというより渡してるものが違うだろ。
たとえフレームワークの関数でも、関数自体は俺も渡したくはないな。
xとか付けるやつは意識してないだろうが、引数名も有意義だし。
そもそもこれぐらいならインライン展開されるだろうし。 関数を第一級オブジェクトとして取り回したくないならLinqなんぞ使わず素直にループした方がいいよ 最近はクエリスタイルも悪くないかなって思えてきた
単純に記号が減って読みやすいし
ループで書いたらネストするようなクエリを書きやすい
Effective C#でもサンプルコードにクエリ形式を使ってるね >>404
関数型の世界では関数をそのまま渡すほうが好まれるよ
その方がより宣言的だからな
ラムダはダサい 一級オブジェクトとして関数渡してんじゃん?ラムダでも。Funcがdelegateなのが気に食わんのかな。
ダサいってのは主観的な気がする。 あれ、主張がわからんくなってきた
関数を引数にするのはいいけど、その場合必ずラムダで無名関数作ってから渡したいって話なのか ■ このスレッドは過去ログ倉庫に格納されています