ふらっと 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 だよな。普通に訂正、反論するだけでなんでもかんでもかんでもマウントはないよな。
喧嘩ごしでやってるならマウントって言ってもわかるけど。
だから>>652は別にマウントでもないな。まあ細かいとは思うが 初心者向けC#のサイトでGUIプログラムの例があったので入力してみました。
しかし
using System.Windows.Controls;
でコンパイルエラーになります。 Controlsなんてネーヨ!エラーです。
正しくは、どこでしょうか?
ちなみに環境なんですがubuntu16で、MonoDeveloperを使っております。 >>667
System.Windows.Controls名前空間以下の型(例えばControlクラス)は
PresentationFramework.dll というDLLで定義されているから
そのDLLを参照に追加する必要がある
どの型がどのDLLに属しているかは、MSDNやMicrosoft Docsでその型のページを探して
上の方にあるAssemblyの箇所を見ればわかる
例えばControlの場合は https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.controls.control?view=netframework-4.7.2
ただ肝心の、MonoDeveloperで参照を追加する方法は俺には分からない >>665-666
はいはいすごいでチュねー
これで満足か? w どうでもいいけどインナークラスなんて使うなよ
未来は誰にも予想できない Guid.NewGuid()が重複した人いますか? >>669
他人の満足とか他人の心配より自分の馬鹿な頭心配しとけよw 2点ほど、
pictureboxに書いた線やらマルやらを書き終えたらボタンを押しもう書けないようにロックするにはどうしたらいいですか?
フォーム2で書いたpictureboxの絵をボタン投下時にフォーム1に同じ絵をコピーしたい場合はどうしたらいいですか? >>674
最初のはpicturebox.Imageを書き込み不能にしたいってこと?そっちはわからない
2つめのは用途による
picturebox2.Image=picturebox1.Image;//これは1を書き換えるとそのまま2に反映される
picturebox2.Image=new Bitmap(picturebox1.Image);//これはいわゆる普通のコピー
ImageがBitmapでなくMetaFileならこれは使えないけど >>675
おまえの被害妄想の方が心配だわw
どうやったら>>652がマウントとかそこまで卑屈になれるかww >>677
だからその後のレス見ろよ…
> >>654-660見てもそれ言える? w それ以前に >>1 を読めよ。
>なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。 >>679
で、>>654-660はマウント合戦じゃないとな?
そうならもう見解の相違というしかない マウンティングか否かの議論を相談室送りにしてもあっち困るだろ >>676にキャスト不足とか誰も突っ込んでくれないw
>>674
Form1で書いたpictureboxの絵をボタン投下時にForm2に同じ絵をコピーの例
https://ideone.com/ifdvrf
Visual StudioでC#の新しいプロジェクトを作って自動生成されたcsを全部消して代わりにダウンロードしたcsを既存の項目として追加して実行
Form1ではマウス左クリック+ドラッグで描画、Form2でCopyをクリックするとその時点のイメージをコピー
Enableのチェック外すと描画中止 何だかんだでc#の勉強を始めることになったんですけど、なにぶんそういう知識はまるで無いのでどう勉強したらいいかさっぱりです
とりあえず初心者向けの参考書とc#を打てるなんちゃらスタジオがあれば大丈夫でしょうか >>684
自分に合った参考書やサイトを見て勉強しながら
VisualStudioで試行錯誤しながらやっていくしかない
自分の周りにC#について教えてくれる人がいるなら
どんどん聞いて吸収していくのが一番いい
とにかくサンプルコードを打ち込んだりしながら
想像力を働かせて覚えていくしかないよ
そのうち視界が開けて来て作りたいものが作れるようになる
作れるようになったらまず、簡単なものからにするべき
いきなり難しいものを作ろうとすると潰れるよ(天才なら別だが)
アラーム時計やカレンダーや画像ビューアあたりから始めるのがいいと思う >>685
ありがとう、帰りに初心者の自分に合いそうな優しい参考書を買ってみるよ。 とりあえず基礎からみっちり覚えることにするね コンソールアプリにてコンソール自身へのIME制御はハードル高いのでしょうか?
ひらがなモード、半角英数モードをコンソールアプリ側で切り替えたいと思い色々ググって試してみたところ、うんともすんとも行きません
大人しくFormアプリにするべきなのでしょうか 簡易HttpServerを作りたいのですが、以下のコードを実行してアクセスすると、"GET"が2回コンソール出力されます。
クライアントからのGETは1回しか受信していないと思うのですが、何故でしょうか。
https://ideone.com/Nr02QL 内容は分からんがConsole.WriteLine以外にOutputStreamのどれかがコンソール出力してたりはしないの? ブラウザでアクセスしたら最初の1回はfaviconリクエストが追加要求されたりするけど
RequestのUrl確認した? マーシャリングが面倒でも負荷の高い処理はC++とかで組むべき? >>690
おっしゃる通り、faviconリクエストでした。
本当にありがとうございます。 >>692
劇的に効果あるなら
マルチタスクにしてもいいし、GPGPUとか、openCL(作り方によればCPUでもGPUでも動かせるし、併用でフル実行させるとやりきった感半端ない)とか今なら色々あるよ >>692
まずはアルゴリズムの改良を検討する
スクリプト言語だとCPUバウンドな処理はC++に比べて数桁遅いから、
許容範囲の処理時間を達成するためにはスクリプトのままアルゴリズムの改良を頑張るよりもC++で力技の方が結果的に早い(速い、ではない)ことも多い
一方C#はせいぜいC++の数倍のオーダーであり、その程度ならアルゴリズムの改良によって簡単に逆転する 夢の最速目指すよりも
仕様決めないときりがないしな SecureStringは使うなって書いてあるんだけど
じゃあ代わりに何使えばいいの?教えて HANDLE CreateFile(
LPCTSTR lpFileName, // ファイル名
DWORD dwDesiredAccess, // アクセスモード
DWORD dwShareMode, // 共有モード
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // セキュリティ記述子
DWORD dwCreationDisposition, // 作成方法
DWORD dwFlagsAndAttributes, // ファイル属性
HANDLE hTemplateFile // テンプレートファイルのハンドル
);
lpSecurityAttributes
取得したハンドルを子プロセスへ継承することを許可するかどうかを決定する。
個プロセスへの継承とはどういう意味なのでしょうか ここでWin32とかの話はスレチだわな。
セキュリティ記述子の話をすると、所有者セキュリティID, グループSID, 任意 アクセス制御リスト, システムアクセス制御リスト, アクセストークンの話で本が書ける。無難にNULLを入れとけばよい。
C#だとSystem.Intptr.Zeroだな 子プロセスの継承の例は、パイプを使ったプロセス間通信とかでしょうね。
以上、スレチごめんなさい pictureboxの中に400☓800の四角を書き、線ボタン、丸ボタンを作って、それを投下したら四角の中に絵を書いくもの作りました。
@データ番号入力(001)3桁
A上記のpictureboxが表示
B線やら丸やら書く
Cデータ内容保存
この繰り替えし。
この時のCで書いた情報の保存方法はどうしたらいいと思いますか?座標点の他にどんな情報があったらいいですかね?
もう一回表示したい時とか 保存方法? 好きにしろとしか言えない
どんな情報って、そりゃ線やら丸やら書いたときに使った情報だろ 実行中は線引く際のストローク、円を描く際のパラメーターをリストで保存してくのが定番。アンドゥリドゥのために。
保存するときは、imageに変換しても良いし、描画履歴の情報を保存しても良い。
何がしたいかによるとしか >>698
https://github.com/dotnet/platform-compat/blob/master/docs/DE0001.md
> The general approach of dealing with credentials is to avoid them and instead rely on other means to authenticate,
> such as certificates or Windows authentication.
資格情報を扱う一般的な方法は、資格情報を回避し、代わりに証明書やWindows認証などの他の認証方法に依存することです。
回答になってないな…。 自作のコントロールでFontプロパティを実装しようと考えています。
FontはIDisposableを継承しているので適切なタイミングでDisposeを実行する必要があると思うのですが
・コントロールのDispose内
・プロパティのsetter
この2箇所でDisposeの呼び出しを実装すれば大丈夫ですか?他にDispose呼び出しが必要な所は無いですか?
具体的には↓のように実装しようと思っています
https://ideone.com/rJl7Fj >>707
別のオブジェクトが同じFontの参照を握ってる可能性もあるから
自分の都合で勝手にDisposeするわけにもいかんでしょう。
ほっておくしかないのでは。
どうしても気になるならFontプロパティのセッターでFontの参照そのものをバッキングフィールドに
キャッシュするのではなく、等価なFontを再構築可能な情報をキャッシュするようにするとか
本当はこういうプロパティーの実装はよくないみたいだけど(ゲッターの返す値が毎回別のオブジェクトになるから) A : myControl.Font = new Font("MS UI Gothic", 9);
B : myControl.Font = mainForm.Font;
毎回上記のAのようにするならDisposeしても大丈夫だけどBみたいなことをすると
mainFormのフォントが勝手にDisposeされることになるからまずいから
自動プロパティとかにしてDisposeはGCに任せるか、内部的にはフォント名、サイズとかの
情報だけ持たせてgetterで毎回newする形にするしかないってことですかね? >>707
Control継承するとFontプロパティもついてくると思うけど別に使うのかな?
>>709
蛇足気味だけど厳密にやりたいなら
set
{
Font ft = value as Font;
if (null != ft)
{
if (null != _myFont) _myFont.Dispose();
_myFont = new Font(ft.FontFamily, ft.Size, ft.Style, ft.Unit);
}
}
こんな感じかな。他はそのままで
set { _myFont = value; }でも大した問題起こらない気もする
もっとまじめに考察したいならILSPYでControlのFontプロパティがどうやっているか追っかけて確認してみるとか >>695
>>696
ありがとう
まずはアルゴリズムから見直してみます 効果音(WAVファイル)鳴らしたいのだけど、VisualStudioのどこからインポートすればいいのでしょうか? プログラム内に、リソースとして音楽ファイルを埋め込みたいのだと思われます ビルド完了時にファンファーレなどを鳴らしたいのだと思われます [Ctr]キー + [r]キーを押して、mmsys.cpl と入力して[Enter]キー
「サウンド」タブのプログラムイベントにあったはずだ
ってか、これはスレチだろ 単にwavファイルを頭から再生するだけならSoundPlayerクラスでいいだろうけど
ループポイントいじったり波形まで触るような凝った再生するならWin32APIを使わないとダメだろうな
ってことが聞きたいんじゃね? math.powでなくfor使ってa^b乗はどうやったらうまくいきます? たぶん>>718は
https://ideone.com/oocK7M
こういうのを求めているのでしょうか
うまくいく、の定義がよくわからないのでこんなんでかんべんしてけれ。 >>717
wav ファイルの波形パターンを取り出してプログラムで適当に加工したあと win32api に渡すと音がなる、とかできるのでしょうか?API関数名はなんですか? >>722
ググってすぐにソースが出てくんじゃん
やる気ねーなら消えろ For文でTaskの配列を使いたいんだけど
var task=new Task[10];
for(int i=0;i<10;++i)
{
int j=i; ←これ
task[i]=Task.Run(()=>{なんかjを使う処理;});
}
こんな風に変数の置き換えをしなきゃいけないのを処理する
なんか別のカッコいい方法ってありますか? >>726
var tasks = Enumerable.Range(0, 10)
.Select(j => Task.Run(() => {なんかjを使う処理;}))
.ToArray(); >>726
var task=new Task[10];
for(int i=0;i<10;++i)
{
task[i]=Task.Run(()=>{なんかiを使う処理;});
} >>728
残念ながら君より質問者のほうがC#をよく理解している
俺も727派だけど、別解としては for じゃなくて foreach (var i = Enumerable.Range( なら i をラムダ内でそのまま使っても問題ないよ(C#5以降) static void Main()
{
Console.WriteLine("Begin");
var tasks = new []
{
Task.Factory.StartNew(() => Console.WriteLine("Task1 is running")),
Task.Factory.StartNew(() => Console.WriteLine("Task2 is running")),
Task.Factory.StartNew(() => Console.WriteLine("Task3 is running")),
};
int index = Task.WaitAny(tasks);
Console.WriteLine("Index = {0}", index);
Console.WriteLine("End");
}
}
New[]ってなに? >> 731
new Task[]の省略形
型は{}の初期化部から推論してる ああそいうことなの、ありがとう。推論しすぎだよ。W tasks Newしてるのにスタートしてないのも推論? >>734
関係ない。単なる勘違い。
var tasks = new Task[]は配列の入れ物を作成してるだけで、
配列の中身はTask.Factory.StartNew()でスタート済み。 便乗で低レベルな質問してすまんが、なんでこれの実行結果って10のみになるの?
なんか0〜9の10行になりそうな気がしちゃったんだけど・・・・どうして!?
using System;
using System.Threading;
using System.Threading.Tasks;
public class Test
{
public static void Main()
{
var task = new Task[10];
for(int i=0;i<10;i++)
{
task[i]=Task.Run(()=>Console.WriteLine(i));
}
}
} たまたまメインスレッドで動いたやつだけConsole.WriteLineが動くとかそういうのなのかな? >>736
ラムダ式の変数のキャプチャを理解した方がいいよ ありがとう!なんで10になるのかはわかったよ
ただ次になぜ10が10個並んじゃわないのかが全然わかんなくなってきたぜ・・・・ >>740
forループの実行中にTaskが開始されてるからでしょ >>741
forループ中にTaskが開始されるとなぜ1つになっちゃうのか全然わからなんだ・・・・ メインスレッドが即座に終了して出力なしの方がザラだと思うが
明示的に待たないとTaskの完了など知った事ではないよ
というか徒に増やした所でメモリ帯域とかで躓くのがオチ
Taskは非同期だし、並列実行が望みならGPGPUなりを… たかが10要素だし、配列に入れてるんだからWhenAllとかで待てるだろ
直行する問題を分離できないおバカさんかな >>727-730
ありがとうございました。いい方法あったんですね
そろい踏みで
var task = new Task[10];
for (int i = 0; i < 10; i++)
{ int j = i; task[i] = Task.Run(() => Console.WriteLine("a={0}", j)); }
var tasks = Enumerable.Range(0, 10).Select(i => Task.Run(() => {Console.WriteLine("b={0}",i);})).ToArray();
var task2 = new Task[10];
for (int i = 0; i < 10; i++)
{ task2[i] = Task.Run(() => Console.WriteLine("c={0}", i)); }
foreach (var i in Enumerable.Range(0, 10)) { Console.WriteLine("d={0}", i); }
Console.ReadKey();
で何回か試してみると、foreachだけは必ずタスクの起動順が順番通りで揃うんですね
ちょっとこれを使ってみます >>745
foreachのはTask作ってない。他に合わせるなら
foreach (var i in Enumerable.Range(0, 10)) { Task.Run( () => {Console.WriteLine("d={0}", i); } }
でないとおかしい。 foreachだけはTaskどころか普通の同期処理だが…? >>745
いやそれforeachはTaskによる実行になってないぞ
foreach使うならループの中は>>728のおバカさん版と同じにしないといけない(ただし>>728とは違って意図通りに動作する) >>746-749
ああ、ほんとだ>>745で書いたの間違ってら。。。
何やってんだ俺。。。
var task3 = new Task[10];
foreach (var i in Enumerable.Range(0, 10))
{
task3[i] = Task.Run(() => Console.WriteLine("d={0}", i));
}
これであってんのかな そんな簡単なコード間違えるような記述方式なのに頭おかしい こんな簡単なコードでバグってるのかよ
やっぱりラムダはクソだな ラムダ式って
void method()
{
int x = 1;
int y = 10;
Action a = () => {Console.WriteLine( x + y); };
a.Invoke();
x += 100;
a.Invoke();
}
こうやってメソッド内に導入した瞬間にこのメソッドが
class クラス名が非表示のクラス
{
int x;
int y;
void a()
{
Console.WriteLine(this.x + this.y);
}
public void method()
{
this.x = 1;
this.y = 10;
a();
this.x+=100;
a();
}
}
みたいに勝手にクラス化されて変数が内部でフィールド扱いになるって理解でいい? >>755
そういう理解だと、例えば>>736のコードみたいな挙動は説明しづらいんじゃない?
機能的に等価なコードに置き換えるんじゃなくて、ありのままを理解した方が簡単だと思うよ。 生成されたアセンブリをILSpyで逆アセンブルすると参考になるよ こんな雑魚コードでそこまでしないと挙動のわからない欠陥品 雑魚はこんなこともりかいできないのか
生活が大変そうですね…
ああでも雑魚は特養で生活してるから大丈夫だね
よかった 質問です
staticなclassに機密情報を保持してプロジェクト内のすべてのコードから参照して利用できるようにしたいです
その場合、改竄を防ぐために決められた場所(コード)からしかsetできないようにしたいですがどうすればいいでしょうか?
また他プロセスからのメモリ改竄はどのように対策をすればいいでしょうか? >>761
書き込みじゃありません保持です
具体的には受け取った値をメモリ上に置いてそれを各所で参照します >>760
他プロセスからの保護は、System.Security.Cryptographyの
ProtectedMemory.Protect()でMemoryProtectionScope.SameProcessを指定するとかかな >>763
情報ありがとうございます
さっそく調べてみます 特定の呼び出し元からのみ設定に関しては、StackTraceで呼び出し元を確認かな。
Caller Infoだと微妙か。 メモリを直接書き換えてくるような攻撃だとアクセス修飾子なんて一切関係なく書き換えられるし、そもそもその後のif文自体を書き換えたりとかしてくるから一定レベル以上の攻撃は防げない
とりあえずxor暗号程度で保持しとくとかは?
get => 機密情報 ^ 0x01234567;
set => 機密情報 = value ^ 0x01234567; ■ このスレッドは過去ログ倉庫に格納されています