ふらっと 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 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; >>760
前者はセッターをinternalにするのが一番素直で分かりやすいと思う >>765
>>766
>>767
ありがとうございます
参考にさせていただきます >>767
アクセス修飾子での制限はリフレクションで簡単に突破される >>769
当たり前やん。
悪意と不注意は区別する必要がある。
前者に対する防衛法を語る能力を俺は持ってないので
後者について言ったまで >>770
>>760が訊いてるのは悪意対策だろ… >>778
マジガイジかよ…
生ゴミはとっととくたばれ ClassA,ClassB,,,のインスタンスをJsonで保存したい。
Class Ihozon{
void init(){} //変数を初期化
string serialize(ClassA str){ }
ClassA deserialize( string json){ }
}
というインターフェースを作って保存処理は共通化したいと思うのだが、Serializeするのにクラス名の
引数が必要になるので共通化できない。こういう場合どうしたらいいの? >>781
ちょっと何言ってるのかよく分からないところがあるので
勘違いかもしれないけど、普通にジェネリックメソッドにするだけじゃないの?
public static string JsonSerialize<T>(T obj) {...}
public static T JsonDeserialize<T>(string json) {...} jeneric interface をつかったらいいんだね。できました。ありがとう。 インスタンスを保存して何か良い事あるのか?
言葉の違いなだけならいいが…クラス内の値を保存するんだよな?
クラスのある位置を示すポインタを保存するんじゃないんだよな? public interface Ijson<T> {
T deserialize(string json);
string serialize(T js);
void init();
}
public class ClassA : Ijson<ClassA>
{ }
ClassAをシリアライズしたいのだけでど、Interfaseするんはわかったんだが内部に
つねに class ClassFile{ void FileSave() {} void FileLoad(){} } を継承もしたい。
(中が固定なのでいちいち実装したくない)
ClassA A = new ClassA();
A.FileLoad(); // これでAはファイルデータで初期化したい。
継承とinterfaceを同時にやるってどうやるの? System.Web.Mail.MailMessageクラスのFieldプロパティでCDOのFieldを追加してました。
System.Webは古いからSystem.Net.Mailを使えと警告が出るので置き換えようとしてみたところ、対応する方法が見つかりませんでした。
ご存知の方いないでしょうか。 >>786
自己解決:Interfaseやめてジェネリックのクラス使えばできました。 別のプロジェクトからCopy してきた Form1をNameSpace名をこのプロジェクトに
あわせて
var fm = new Form1();
fm.ShowDialg();
とやっても、空のフォームが立ち上がる。なぜなんだろう? >>789
エディタのキャッレットを
> var fm = new Form1();
この行のForm1の箇所に置いてF12を押す >>786
もう解決してるみたいだけど、一応。
Interfaceと継承を指定する場合は、カンマ(,)で区切って並べるだけ。 >>790
ありがとう。解決しました。
InitializeCompornent();の呼び出しが消えていた。
なんでだろ。消した覚えはないんだけど。 >>791
interfaceを使えないかトライしてみましたが、どうもうまく行かないです。
ClassFileはIjsonをインターフェースする必要があって、Ijsonのinit()はClassAのプロパティや
変数の初期化なのでClassAの中でしか実装できません。なので
ClassFile:Ijson<ClassA>
ClassA:ClassFile<ClassA>
のような構成になります。しかし問題があります。
問題:ClassFileの中ではinit()は実装したくないのに、実装を余儀なくされるが、初期化したい変数は
ClassAの中にあるので困る。 clsAのインスタンスに代入する方法ってこれでいいのでしょうか?
public class clsA: clsJson <clsA>
{
public void ParamLoad() {
clsGamenParam v = this;
v = base.ParamLoad();
}
}
public class clsJson<T>{
public T ParamLoad(string IniName = "") {
T param = default (T);
param = deserialize(json);
return param;
}
} splitcontainerで上下分割してて、
最大化させてもpanel1の方は縦幅(height)は変わらないようにしたいのだけど
どのプロパティで設定できるのでしょうか 初期化を隠蔽したい?
なら隠しメンバーに初期化済みフラグを持つことだな。 ピクチャーボックスに線を書くとか丸を書くとかした後にクリックで線を選択出来たりとかします?
エクセルで言うオートシェイプ見たいな感じで 出来るよ
日本じゃコード例殆ど無いけど海外ならそこそこ見つかる そりゃスクラッチで作ればできるだろうな
>>798のような質問をしてるレベルならまず無理だが >>798
円や直線みたいな単純な図形でアンチエイリアスとかも不要なら
確かVBer向けのシェイプコントロールってのがあったはずだから、それを使えば一発だね
http://www.atmarkit.co.jp/fdotnet/dotnettips/781winlineshape/winlineshape.html
描画するんじゃなくて子コントロールを加える形になると思うけど シングルトンパターン実装が面倒だからstatic実装をしてしまう私は雑魚なのでしょうか
いつインスタンスが作られるかぐらいの差しかないんじゃないのぉぉぉお起動時に一度だけ呼ぶ使われ方ならぁぁぁあ >>803
グローバル変数を作る目的でシングルトンにするくらいなら、Globalクラスでも作ってそのstaticフィールドとして持たせて共有したほうがマシ
シングルトンが用いられる大抵のケースでは、アプリでクラスAのインスタンスが一つしか必要とされないという要件を、
誤ってクラスA側に持ち込んでしまい不必要な制限をクラスAに対して与えている
基本的にシングルトンはアンチパターンであり、使うべきではないと考えておけばいい グローバル変数が必要になったケースというのが今までにない気がする ログとかデバッグ用情報とかあったほうがよくね?
引数にログ渡すのも面倒やし すべてのインスタンスをグローバル神クラスに突っ込む方法で管理してる現場も
案外良かったよ
リークの類に強いのがよかった
ひと目でわかるし >>803
C#のstaticクラス導入の理由の少なくとも一つがそれだったはずだから
いいんじゃないですか
>>805
おおむねその通りだと思うけど、質問の答えになってない気がするw えーリソースひとつしか無いのにあちこちで呼ばれて困るわ。セマフォ使うにもシングルトンにしないと意味ないし。 そこでPrism.Unity等のDIコンテナですよ そういやDIコンテナってどういう仕組みになってんのか全然わからん
コンストラクタの引数をインターフェイスにするだけで、登録済みのオブジェクトを自動的に注入してくれるわけだけど・・・・
あれってコンストラクタの呼び出し側は一体どんな仕組みになってるの?
そもそも引数のインターフェースを増やそうが減らそうがコンパイルエラーが起きないって、呼び出す側は一体どうなってるのかしら >>812
普通にリフレクションで引数の情報取ったりコンストラクタ呼んでインスタンス作ったり簡単にできる >>813
ありがとう
リフレクションは全然使ってなかったので勉強してくるよ デバッグ用に良さそうと思ってたら
winformにそのものがあるしね ■ このスレッドは過去ログ倉庫に格納されています