C#, C♯, C#相談室 Part94
■ このスレッドは過去ログ倉庫に格納されています
!extend:checked:vvvvv:1000:512 ■Visual Studio 2017 Community(無償の統合開発環境)等はこちら http://www.visualstudio.com/downloads/ ■コードを貼る場合はこちら http://ideone.com/ ■前スレ C#, C♯, C#相談室 Part93 http://mevius.5ch.net/test/read.cgi/tech/1492818720/ ■次スレは>>970 が建てる事。 建てられない場合は他を指定する事。 VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured public struct Hoge { public int a = 123; public int b = 456; } でだめ? 暗黙的な既定のコンストラクタが挿入されないようにとのC#コンパイラの最適化の都合 特に回避策はない 標準ライブラリで struct Vector3 { ... public static Vector3 Up = new Vector3(0, 1, 0); } みたいなのはある レスくれたひととワッチョイ似てるけど別人です念のため >>13 あまり有難みが無いですが・・・とりあえずレスくれたみなさんありがとう class にしたくない理由は struct のネストをしたいのと そのとき struct を Marshal.StructureToPtr して使いたいのですが ネストの内側に class が含まれてると not blittable とか出て困ってるんです https://teratail.com/questions/251675 回答つかなかったから再投稿して古い質問を削除依頼って、今まであんまり見なかったな。 外側がクラスでも良いならラップするクラス作れば良いだけだけど すみません間違いました not blittable が出るのは struct s2 の中に class c1 があるとして GCHandle h = GCHandle.Alloc(s2, GCHandleType.Pinned); IntPtr ptr = hndl.AddrOfPinnedObject(); // ptr を利用 h.Free(); ちなみに struct s2 の中に struct s1 があるとして 同じことをしたときは問題無いです >>18 struct を定義するときにメンバに class があるとき その class を blittable にする方法を知りたいです そのclassの内容によるとしか… 無制限にマーシャリングできるわけでもないし classのメンバがblittableならそのままstructにすりゃいいだけだけど 参考になるか知らんがstringを含む場合 [StructLayout(LayoutKind.Sequential)] struct Foo { public int id; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] public string name; } class Program { static void Main(string[] args) { var sizeInBytes = Marshal.SizeOf<Foo>(); Console.WriteLine($"SizeOf={sizeInBytes}"); var coTaskMem = Marshal.AllocCoTaskMem(sizeInBytes); var foo = Marshal.PtrToStructure<Foo>(coTaskMem); foo.name = "John"; Console.WriteLine(foo.name); Marshal.DestroyStructure<Foo>(coTaskMem); Marshal.FreeCoTaskMem(coTaskMem); } } >>21 そもそも内側は struct で充分なんですが 初期値を入れたいのでそのためには class でないといけないとしたら class にするとエラーになるのでやっぱり困るっていう話です struct でデフォルト値入れられないと割り切れば済む話です 2度手間っていうか面倒くさいけどStructureToPtrでバイトストリームに一括で変換するのが 目的ならば、外に見せる部分はclassで作っておいて中にstructを定義する structの要素にはプロパティでget/setする初期値はclassのコンストラクタで設定 classにバイトストリームを取り出す(StructureToPtrに絡むロジック)メソッドかプロパティを 定義するみたいなのじゃダメなのかな class point { public point () { x = 0; y = 0; } private _point _Struct; public int x { get { return _Struct.x; } set { _Struct.x = value; } } public int y { get { return _Struct.y; } set { _Struct.y = value; } } public byte[] bytestream { get { return structToPtrFunc(_Struct); }//メソッドは別途作成 } [StructLayout(LayoutKind.Sequential)] private struct _point { int x; int y; } } むしろ StructureToPtr を使いたくないっていう話です やりたいのはこっちです GCHandle h = GCHandle.Alloc(s, GCHandleType.Pinned); IntPtr ptr = h.AddrOfPinnedObject(); // ptr 操作 h.Free(); 途中のレスで一回変な事を書いてしまったので混乱させてごめんなさい 意図がそれならそもそもなんで親に値型使ってんのってところまで後退しちゃうぞ 値型にGCHandleのピン付けってそこだけ見ると意味不明だし 省略している「ptr操作」の内容次第では初っ端からアプローチを間違えてる可能性がある Cの構造体って構造体の中に別の構造体入れてもコピーが発生する訳じゃない (子の構造体をいちいち作る訳じゃないから) C#をCと同じと思わない方が良い >>28 C#の場合、classは、Heapに実態を確保して変数は参照型で、 structは、スタックなどに実態を確保して、変数は値型だと 聞きました。 C++は、strucとclassは、protected/public などのaccess control以外に 違いが無いこととは対照的です。 というわけで、C#の場合でも、structに関しては別のstructの中に入れた場合 は、C++と同じような動作なのではないかと思われます。 そもそも、「無駄なコピー」ってのがどんな想定なのかわからん 質問いいですか? C#のアセンブリの読み込みってどういう手順で行われてるんですか? 同じバージョンの.net core から.net coreを呼び出してるのにTypeIntializationExceptionが発生します たぶん正しいアセンブリが読み込めてないのだと思うのですが、アセンブリの読み込みタイミングやバージョンを指定することは可能なのでしょうか 上のお話見てると突き詰めれば値型と参照型の定義の問題になってきそう C#の構造体は中に値型以外を詰め込むとその部分はCレベルで言うポインタのポインタを保持する形になってコピー時の挙動以外はclassと大差ないものになっちゃうよね ポインタのポインタの値型だと言えばそうなのかもしれないけど >>31 単に静的コンストラクタ内で例外が出てるだけじゃね? 例外型だけじゃなくて例外メッセージやスタックトレースも読んで 参照してるdllにエントリポイントがないと言われるだけでそれ以上検索してもなにも出てこないです こう聞いた方がいいのかもしれないです .net frameworkの時は自前でシステムのアセンブリ参照できましたが .net coreにも似たような仕組みはあるのでしょうか こういうアセンブリ関係の問題は.net frameworkの時は自前で参照加えたらできたんですけど .net coreになってフレームワーク二つしか選択肢がなくなって細かい参照が出来なくなってますがそれはどこがどういう風に解決してるのでしょうか? 特定のライブラリが使いたいというよりそこら辺の内部仕様が知りたいです あ、アセンブリが読み込めてないと思った一番の理由はdllでなくプロジェクトにcsで組み込んだらちゃんと動いたからです そういう意味で言語レベルでのミスはないです csc -reference:(.NetCoreのpath) hoge.cs でいけるよ WindowsFormで写真データ取り込みを作ってるんですが、 DriveInfo.GetDrives()してもWindows10に接続して認証したあとの iPhoneのドライブが読み取れず・・・ どうにか拾えないもんでしょうか? あれは普通のディスクとしてマウントされてるわけじゃなくてメディア転送プロトコルってやつだから、 それじゃアクセス出来ないと思う。 >>38 >>39 ありがとうございます よく調べてみます カレントディレクトリに \data¥ というディレクトリを作成したいのですが、 どうすればいいのでしょう? >>42 できました。ありがとうございました。m(_ _)m 機器構成の設定を記載したconfigファイルをアプリ上で作成して、 アプリ実行時にconfigの内容を変数に読み込むことを行おうと思ってます。 configファイルって普通どんなふうに書くんだろうと思って、 あるアプリのconfigファイルを覗いてみたところ下のような感じになっていました。 [Config] StartUpLeft=-2147483648 StartUpTop=-2147483648 StartUpWidth=640 StartUpHeight=480 SaveWindowPosSize=1 SaveWindowRectLeft=597 SaveWindowRectRight=3645 SaveWindowRectTop=1256 SaveWindowRectBottom=3436 SaveWindowMaximize=0 このテキストファイルを string line = sr.ReadLine(); // 読み込んだ一行をカンマ毎に分けて配列に格納する string[] values = line.Split('='); とすると偶数のvaluesに値が入ってるからこれを使用するみたいな感じでOK? 〇〇できちっと書けやぁ!みたいな形式があったら教えて下さい。 >>45 ググってみましたが難しい・・・。 アプリ内で変数を10個ぐらいもっていて int hoge1=100 int hoge2=12 等 これをテキストファイルに保存し、必要なときに int hoge1=100 int hoge2=12 にアプリ内で戻したいのですが、簡単に実現出来る方法があればいいなと思ったのですが・・・。 >>44 その形式は ini ファイルなので C# ini ファイルでググれば事例がいっぱい出てくるよ 基本はWin32APIのGetPrivateProfileString( )とかを使う もし設定ファイルの形式をこれから決められるならjsonおすすめ DataContractJsonSerializerクラスを使えば読み書きも簡単だし まずアプリケーション構成ファイルを検討するべきだと思うんだが なんかどんどん難しくなってきました。 最近だxmlで書くのがデフォルトなんでしょうか・・・。 iniで書くのも結構荷が重い、気合い入れて勉強するべきか・・・。 いまだとjson以外で書くことないな。 どんなプラットフォームでもjsonはサポートしてるし、どんなものでも入れられることがわかってるしね。 ものによるやろ。xmlで書くこともあるし、もちろんjsonも。yamlだって最近は多いでしょ? xmlはめんどくさすぎるから、DTDでちゃんと定義したいとかじゃなかったら使いたくないな。もちろんケースバイケースなのはそうだけど。 改行区切り、タブ区切りとかもまだまだ場合によっては使うしね。 カンマ区切りと固定長のまざった独自糞フォーマットでのIO書いたことはあるけど、自由に出来る時はjsonかxml 大体はjsonだけど、きちんと定義したデータ使いたいときにRelaxNGで定義してXMLで書いたことはある。 些細な枝葉で悩む時間あったら 本体のプログラムで悩め プログラマーはつい余計な事まで調べてしまう生き物なのです 調べるのはいいが掲示板で最初から聞くのは違うな そしてどうでもいいことにこだわり始めるのはだいたい行き詰っているとき global::クラス名で 2つがバッティングしてます 外部からのdll2つなんで namespaceつける等の変更できない どう解決できる? global::ファイル名.クラス名 とかできない? ちょっとくだらない質問で申し訳ないんだけど 構造体の定義のソースってどうしてる? クラス内に通信電文用の構造体をいっぱい作ったのだけど ソースがでかくなっちゃうからpartial使ってわけた方がいいのか あくまで一個のソース内にまとめるか・・・ どれくらいでかいのかわからんけどあんま分けないかなー? 1万行超えるとかなら分けること考える 分割しようかと迷う規模なら分割もありだと思う。 ベース部分は独立させて、機能毎に実装ファイルの頭に使用する下位レベルの電文を定義する。 電文は全部まとめるか?分割するか?ケースバイケースだね。 クラス内にネストさせるんじゃなくて 下位の名前空間作ってそこに構造体群を置けばいいよ >>68 クラス内に作らないで独立させれば良いのでは? だいたい >>73 方式で、基本的には ファイル名 = クラス名 を目指すな。自分は。 xamarin でTDDを勉強してるんだけど、 public event PropertyChangedEventHandler PropertyChanged; この PropertyChanged 自体がnullになって例外で終わるのって どういうパターンがあるんだろう・・・。 勉強したいことと全く別のところで長期足止め。わっけわからん状態。 >>76 ハンドラが1こも登録されてないとnullなんじゃないかな >>77 やめろよ、普通の質問なのに。 Xamarinの話題も良いじゃん。 ここで質問するより 直接ちょまどにツイートしろって意味かな? 返事来るかどうか知らんけど >>78 ありがとう。どうやら「どっかが+=してくれる」っていう前提なんだね、これ。 PropertyChanged?.invoke(this, e); で呼び出したら動いた。現役じゃなくなって長いもんで(趣味のプログラム)、 このへんの書き方に苦労するなあ。 >>81 null条件演算子が出来る前はeventに空のdelegateを代入しておくテクニックがあった public event PropertyChangedEventHandler PropertyChanged; = delegate {}; >>82 あ。やっぱそうなんだ。「これ、ダミー関数入れときゃエクセプション 投げられないで済むんじゃねえのか?」って思った。 ところで1つ目のセミコロンて要るの? フォームアプリで フォームAで検査をして、検査終了後に 「データを記録しますか?」 「はい」「いいえ」 というウインドウを表示して、 「はい」ならデータ記録 「いいえ」ならデータ廃棄 としたいです。 データはフォームAにあるので、 1. フォームAからフォームBを開く 2. フォームBは「はい」「いいえ」を戻り値としてAに渡す 3. フォームAでデータ記録、データ廃棄の処理を行う みたいな処理でいいのでしょうか? それとももっとよいやり方がありますか? ありがとうございます。 これですね。 なんかフォーム新たに作るとかこんなめんどくさいことしなきゃいけないのか? と疑問に思ってたんですが、聞いてよかったです。 ありがとうございます。 明日実装してみます。 C#からpythonのプログラムをコマンドライン引数hoge付きで実行したのですが、 System.Diagnostics.Process.Start("python.exe", @"""L:\main.py hoge""") とやっても実行できません。 なにかより方法ないでしょうか? なぜスクリプトファイル名と引数をダブルクォートでひとくくりにしてる? >>91 分けて書いたら第3引数は取らないとエラーが出たのですが、 どう書けばよいのでしょう? System.Diagnostics.Process.Start("python.exe", @"L:\main.py hoge") >>93 ありがとうございます! 解決しましたm(_ _)m var sb = new StringBuilder(); var c = 'a'; while (true) sb.Append(c); これで一番下の行に破棄'_'を使用っていうVSによるヒントが出てくるんだけど、 こういう場合の破棄って使用する場合としない場合でどういう違いがあるの? >>96 破棄は、未割り当ての変数と同等です。つまり、値がありません。 破棄変数は 1 つのみであり、破棄変数には記憶域も割り当てられないため、破棄を使用するとメモリの割り当てを減らすことができます。 また、コードの意図がわかりやすくなるため、読みやすさと保守性が向上します。 linqて出た頃はselectとか予約語になってたはずだけど、今は使わん方がいいの? LINQやクエリ式を連想するからやめといた方がいい あくまでコンテキストキーワードだから当初から識別子として使えたよ group辺りは変数名として割と使う groupって変数名としてほとんど何の情報も持たないし普通にバッドネーミングでは GroupTheoryのGroupとかの専門用語でもない限り >>101 右辺から意味がはっきりしてる寿命が短いローカル変数ならいいんじゃない?それこそlinqのグループバイの戻り値とか。まぁそんなんだったらgとかにしちゃうけど LINQの話題になってるから聞きたいんですが、LINQって結構遅い? ベンチマークとって襲いって主張してるブログとかはあるけど、実業務で遅さを実感する事ってどのくらいある? LINQ使わないで書くよりも遅いことは遅いんだけど、経験的にはあんまり問題にはならなかった 実際に使ってみてどうしてもLINQ使ってる辺りでネックになるようなら、 そこだけ書き直す感じでいいと思う Linq使ったほうが楽に高速化できることもあるし、場合場合じゃないかな。 PLINQは良くコア数指定せずにぶん回して「遅い」って言ってる奴いるけど、コア数指定したら割と良い線行く。 処理速度が求められるような部分だとネックになってると感じることもある シミュレーションみたいなのね そういうの以外では全く気にならない どうせ処理速度より通信やファイル読み書きのほうが圧倒的に時間かかるから linq to sqlだと気付かずにクエリがクライアント側で行われるなんてことが無くはない ループのコストを気にするレベルの処理(数値計算とか)だとLINQは遅いが 大半の処理は0秒の範疇で終わるし遅さを実感できるタイミングは少ない ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる