ふらっと C#,C♯,C#(初心者用) Part140

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 9e9f-LwdJ)
垢版 |
2018/10/04(木) 18:56:38.41ID:JnxMNCXd0
「どんなにくだらない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
2018/11/28(水) 13:26:20.94ID:cyvzVFzDM
>>692
まずはアルゴリズムの改良を検討する
スクリプト言語だとCPUバウンドな処理はC++に比べて数桁遅いから、
許容範囲の処理時間を達成するためにはスクリプトのままアルゴリズムの改良を頑張るよりもC++で力技の方が結果的に早い(速い、ではない)ことも多い
一方C#はせいぜいC++の数倍のオーダーであり、その程度ならアルゴリズムの改良によって簡単に逆転する
2018/11/28(水) 15:38:58.09ID:e/TO460qM
夢の最速目指すよりも
仕様決めないときりがないしな
698デフォルトの名無しさん (ワッチョイ 839f-nfAC)
垢版 |
2018/11/28(水) 16:41:31.36ID:JaydQRfC0
SecureStringは使うなって書いてあるんだけど
じゃあ代わりに何使えばいいの?教えて
2018/11/28(水) 17:06:53.33ID:BP3XEZ+Jd
HANDLE CreateFile(
LPCTSTR lpFileName, // ファイル名
DWORD dwDesiredAccess, // アクセスモード
DWORD dwShareMode, // 共有モード
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // セキュリティ記述子
DWORD dwCreationDisposition, // 作成方法
DWORD dwFlagsAndAttributes, // ファイル属性
HANDLE hTemplateFile // テンプレートファイルのハンドル
);


lpSecurityAttributes
取得したハンドルを子プロセスへ継承することを許可するかどうかを決定する。

個プロセスへの継承とはどういう意味なのでしょうか
2018/11/28(水) 18:13:59.61ID:KWr5egyF0
スレチ
2018/11/28(水) 18:19:28.62ID:urROSKq40
ここでWin32とかの話はスレチだわな。

セキュリティ記述子の話をすると、所有者セキュリティID, グループSID, 任意 アクセス制御リスト, システムアクセス制御リスト, アクセストークンの話で本が書ける。無難にNULLを入れとけばよい。

C#だとSystem.Intptr.Zeroだな
2018/11/28(水) 18:34:17.60ID:urROSKq40
子プロセスの継承の例は、パイプを使ったプロセス間通信とかでしょうね。
以上、スレチごめんなさい
2018/11/28(水) 19:36:37.13ID:whfYkWqO0
pictureboxの中に400☓800の四角を書き、線ボタン、丸ボタンを作って、それを投下したら四角の中に絵を書いくもの作りました。


@データ番号入力(001)3桁
A上記のpictureboxが表示
B線やら丸やら書く
Cデータ内容保存
この繰り替えし。

この時のCで書いた情報の保存方法はどうしたらいいと思いますか?座標点の他にどんな情報があったらいいですかね?
もう一回表示したい時とか
2018/11/28(水) 19:47:06.26ID:G4kzubka0
保存方法? 好きにしろとしか言えない
どんな情報って、そりゃ線やら丸やら書いたときに使った情報だろ
2018/11/28(水) 21:24:08.05ID:WfNZCJmP0
実行中は線引く際のストローク、円を描く際のパラメーターをリストで保存してくのが定番。アンドゥリドゥのために。
保存するときは、imageに変換しても良いし、描画履歴の情報を保存しても良い。
何がしたいかによるとしか
2018/11/28(水) 21:33:46.64ID:wlMFFO6p0
>>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認証などの他の認証方法に依存することです。

回答になってないな…。
2018/11/29(木) 11:59:38.79ID:w8w+eTQL0
自作のコントロールでFontプロパティを実装しようと考えています。

FontはIDisposableを継承しているので適切なタイミングでDisposeを実行する必要があると思うのですが
・コントロールのDispose内
・プロパティのsetter
この2箇所でDisposeの呼び出しを実装すれば大丈夫ですか?他にDispose呼び出しが必要な所は無いですか?

具体的には↓のように実装しようと思っています
https://ideone.com/rJl7Fj
2018/11/29(木) 12:58:03.97ID:GYTobZd0a
>>707
別のオブジェクトが同じFontの参照を握ってる可能性もあるから
自分の都合で勝手にDisposeするわけにもいかんでしょう。

ほっておくしかないのでは。

どうしても気になるならFontプロパティのセッターでFontの参照そのものをバッキングフィールドに
キャッシュするのではなく、等価なFontを再構築可能な情報をキャッシュするようにするとか

本当はこういうプロパティーの実装はよくないみたいだけど(ゲッターの返す値が毎回別のオブジェクトになるから)
2018/11/29(木) 13:59:52.58ID:w8w+eTQL0
A : myControl.Font = new Font("MS UI Gothic", 9);
B : myControl.Font = mainForm.Font;

毎回上記のAのようにするならDisposeしても大丈夫だけどBみたいなことをすると
mainFormのフォントが勝手にDisposeされることになるからまずいから
自動プロパティとかにしてDisposeはGCに任せるか、内部的にはフォント名、サイズとかの
情報だけ持たせてgetterで毎回newする形にするしかないってことですかね?
2018/11/29(木) 20:54:36.67ID:LaO1Tjsi0
>>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プロパティがどうやっているか追っかけて確認してみるとか
2018/11/30(金) 00:32:08.25ID:gtVMbwTAd
>>695
>>696
ありがとう
まずはアルゴリズムから見直してみます
2018/11/30(金) 05:27:00.98ID:V3k5uXuMa
効果音(WAVファイル)鳴らしたいのだけど、VisualStudioのどこからインポートすればいいのでしょうか?
2018/11/30(金) 06:15:02.76ID:J243joLf0
解読班お願いします
2018/11/30(金) 08:02:22.89ID:6sbZJ6hoM
プログラム内に、リソースとして音楽ファイルを埋め込みたいのだと思われます
2018/11/30(金) 08:18:04.02ID:ntAUD0F8p
ビルド完了時にファンファーレなどを鳴らしたいのだと思われます
2018/11/30(金) 09:21:26.51ID:u/ExA4KN0
[Ctr]キー + [r]キーを押して、mmsys.cpl と入力して[Enter]キー
「サウンド」タブのプログラムイベントにあったはずだ

ってか、これはスレチだろ
717デフォルトの名無しさん (ワッチョイ 5fa5-DrDc)
垢版 |
2018/11/30(金) 20:20:52.54ID:3yrtWl4o0
単にwavファイルを頭から再生するだけならSoundPlayerクラスでいいだろうけど
ループポイントいじったり波形まで触るような凝った再生するならWin32APIを使わないとダメだろうな
ってことが聞きたいんじゃね?
718デフォルトの名無しさん (スププ Sdba-aHfj)
垢版 |
2018/11/30(金) 21:33:39.29ID:7tGVT0o8d
math.powでなくfor使ってa^b乗はどうやったらうまくいきます?
2018/11/30(金) 21:48:55.31ID:6sbZJ6hoM
誰か答えてやってくれ
俺には無理だ
2018/11/30(金) 22:09:20.57ID:lmmOnpkX0
たぶん>>718
https://ideone.com/oocK7M
こういうのを求めているのでしょうか
うまくいく、の定義がよくわからないのでこんなんでかんべんしてけれ。
721デフォルトの名無しさん (スププ Sdba-aHfj)
垢版 |
2018/11/30(金) 22:17:19.14ID:n5lF99wkd
天才あざす
2018/11/30(金) 23:14:00.97ID:MkfLpznc0
>>717
wav ファイルの波形パターンを取り出してプログラムで適当に加工したあと win32api に渡すと音がなる、とかできるのでしょうか?API関数名はなんですか?
2018/11/30(金) 23:27:45.95ID:t8hABf910
>>722
ググってすぐにソースが出てくんじゃん
やる気ねーなら消えろ
2018/12/01(土) 00:01:20.94ID:J8cQMvWo0
>>723
thx!
waveOut がよさそうですね http://eternalwindows.jp/winmm/wave/wave00.html
2018/12/01(土) 01:36:14.22ID:fxOs/Chqd
>>718
マクローリン展開かな
2018/12/01(土) 15:10:50.09ID:BBiFvNwv0
For文でTaskの配列を使いたいんだけど

var task=new Task[10];
for(int i=0;i<10;++i)
{
int j=i; ←これ
task[i]=Task.Run(()=>{なんかjを使う処理;});
}

こんな風に変数の置き換えをしなきゃいけないのを処理する
なんか別のカッコいい方法ってありますか?
2018/12/01(土) 15:24:16.02ID:ueqzOD9Qa
>>726
var tasks = Enumerable.Range(0, 10)
.Select(j => Task.Run(() => {なんかjを使う処理;}))
.ToArray();
2018/12/01(土) 16:54:24.01ID:UFOjA6r40
>>726
var task=new Task[10];
for(int i=0;i<10;++i)
{
task[i]=Task.Run(()=>{なんかiを使う処理;});
}
2018/12/01(土) 17:01:29.48ID:6nS7jmt50
>>726
Parallel.Forじゃ駄目?
2018/12/01(土) 17:03:32.28ID:q6i9ekrsM
>>728
残念ながら君より質問者のほうがC#をよく理解している
俺も727派だけど、別解としては for じゃなくて foreach (var i = Enumerable.Range( なら i をラムダ内でそのまま使っても問題ないよ(C#5以降)
731デフォルトの名無しさん (ワッチョイ b39d-hzet)
垢版 |
2018/12/01(土) 17:04:04.70ID:QCT+flDQ0
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[]ってなに?
2018/12/01(土) 17:08:08.57ID:6nS7jmt50
>> 731
new Task[]の省略形
型は{}の初期化部から推論してる
733デフォルトの名無しさん (ワッチョイ b39d-hzet)
垢版 |
2018/12/01(土) 17:16:05.12ID:QCT+flDQ0
ああそいうことなの、ありがとう。推論しすぎだよ。W
734デフォルトの名無しさん (ワッチョイ b39d-hzet)
垢版 |
2018/12/01(土) 17:21:20.93ID:QCT+flDQ0
tasks Newしてるのにスタートしてないのも推論?
2018/12/01(土) 17:28:40.81ID:6nS7jmt50
>>734
関係ない。単なる勘違い。
var tasks = new Task[]は配列の入れ物を作成してるだけで、
配列の中身はTask.Factory.StartNew()でスタート済み。
736デフォルトの名無しさん (ワッチョイ 0eeb-hzet)
垢版 |
2018/12/01(土) 18:50:52.76ID:4Hpcan/K0
便乗で低レベルな質問してすまんが、なんでこれの実行結果って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));
}
}
}
737デフォルトの名無しさん (ワッチョイ 0eeb-hzet)
垢版 |
2018/12/01(土) 18:58:25.70ID:4Hpcan/K0
たまたまメインスレッドで動いたやつだけConsole.WriteLineが動くとかそういうのなのかな?
2018/12/01(土) 19:01:42.33ID:jlV8A3xFa
>>736
ラムダ式の変数のキャプチャを理解した方がいいよ
2018/12/01(土) 19:36:32.06ID:IDJAnGVn0
>>736
http://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_06/extremecs_06_04.html
740デフォルトの名無しさん (ワッチョイ 0eeb-hzet)
垢版 |
2018/12/01(土) 21:00:00.35ID:4Hpcan/K0
ありがとう!なんで10になるのかはわかったよ
ただ次になぜ10が10個並んじゃわないのかが全然わかんなくなってきたぜ・・・・
2018/12/01(土) 21:02:51.31ID:IDJAnGVn0
>>740
forループの実行中にTaskが開始されてるからでしょ
742デフォルトの名無しさん (ワッチョイ 0eeb-hzet)
垢版 |
2018/12/01(土) 22:13:11.50ID:4Hpcan/K0
>>741
forループ中にTaskが開始されるとなぜ1つになっちゃうのか全然わからなんだ・・・・
2018/12/01(土) 22:53:47.54ID:THW+jwSM0
メインスレッドが即座に終了して出力なしの方がザラだと思うが
明示的に待たないとTaskの完了など知った事ではないよ

というか徒に増やした所でメモリ帯域とかで躓くのがオチ
Taskは非同期だし、並列実行が望みならGPGPUなりを…
2018/12/01(土) 22:57:20.39ID:q6i9ekrsM
たかが10要素だし、配列に入れてるんだからWhenAllとかで待てるだろ
直行する問題を分離できないおバカさんかな
2018/12/01(土) 23:13:24.31ID:BBiFvNwv0
>>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だけは必ずタスクの起動順が順番通りで揃うんですね
ちょっとこれを使ってみます
2018/12/01(土) 23:22:08.99ID:R6GB4fM+0
>>745
foreachのはTask作ってない。他に合わせるなら
foreach (var i in Enumerable.Range(0, 10)) { Task.Run( () => {Console.WriteLine("d={0}", i); } }
でないとおかしい。
2018/12/01(土) 23:22:16.02ID:THW+jwSM0
foreachだけはTaskどころか普通の同期処理だが…?
2018/12/01(土) 23:23:22.50ID:q6i9ekrsM
>>745
いやそれforeachはTaskによる実行になってないぞ
foreach使うならループの中は>>728のおバカさん版と同じにしないといけない(ただし>>728とは違って意図通りに動作する)
2018/12/01(土) 23:28:44.22ID:UFOjA6r40
意味わからんな
2018/12/01(土) 23:57:08.18ID:cajtydEwd
>>749
この馬鹿ちんが
2018/12/01(土) 23:59:39.62ID:BBiFvNwv0
>>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));
}

これであってんのかな
2018/12/02(日) 00:15:47.90ID:y4RDtfAe0
そんな簡単なコード間違えるような記述方式なのに頭おかしい
2018/12/02(日) 00:27:50.88ID:heWd1TkG0
>>752
日本語おかしい
2018/12/02(日) 01:08:52.07ID:y4RDtfAe0
こんな簡単なコードでバグってるのかよ
やっぱりラムダはクソだな
2018/12/02(日) 09:05:24.28ID:VRa40hbi0
ラムダ式って
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();
}
}
みたいに勝手にクラス化されて変数が内部でフィールド扱いになるって理解でいい?
2018/12/02(日) 12:15:35.79ID:uCltPpgZa
>>755
そういう理解だと、例えば>>736のコードみたいな挙動は説明しづらいんじゃない?
機能的に等価なコードに置き換えるんじゃなくて、ありのままを理解した方が簡単だと思うよ。
2018/12/02(日) 12:25:04.16ID:heWd1TkG0
生成されたアセンブリをILSpyで逆アセンブルすると参考になるよ
2018/12/02(日) 12:25:51.63ID:wepbCU4lM
こんな雑魚コードでそこまでしないと挙動のわからない欠陥品
2018/12/02(日) 14:08:20.38ID:9iE6z7au0
雑魚はこんなこともりかいできないのか
生活が大変そうですね…
ああでも雑魚は特養で生活してるから大丈夫だね
よかった
760デフォルトの名無しさん (ワッチョイ 4b9f-GnKV)
垢版 |
2018/12/02(日) 15:05:44.53ID:1mt10vUo0
質問です
staticなclassに機密情報を保持してプロジェクト内のすべてのコードから参照して利用できるようにしたいです
その場合、改竄を防ぐために決められた場所(コード)からしかsetできないようにしたいですがどうすればいいでしょうか?
また他プロセスからのメモリ改竄はどのように対策をすればいいでしょうか?
2018/12/02(日) 15:25:34.83ID:8Z0+kDxur
>>760
c#アプリに機密情報なんか書き込むな
762デフォルトの名無しさん (ワッチョイ 4b9f-GnKV)
垢版 |
2018/12/02(日) 15:26:44.53ID:1mt10vUo0
>>761
書き込みじゃありません保持です
具体的には受け取った値をメモリ上に置いてそれを各所で参照します
2018/12/02(日) 15:45:30.50ID:XLvYoqNs0
>>760
他プロセスからの保護は、System.Security.Cryptographyの
ProtectedMemory.Protect()でMemoryProtectionScope.SameProcessを指定するとかかな
764デフォルトの名無しさん (ワッチョイ 4b9f-GnKV)
垢版 |
2018/12/02(日) 15:49:14.43ID:1mt10vUo0
>>763
情報ありがとうございます
さっそく調べてみます
2018/12/02(日) 15:55:25.15ID:XLvYoqNs0
特定の呼び出し元からのみ設定に関しては、StackTraceで呼び出し元を確認かな。
Caller Infoだと微妙か。
2018/12/02(日) 15:55:38.27ID:yai2DppL0
メモリを直接書き換えてくるような攻撃だとアクセス修飾子なんて一切関係なく書き換えられるし、そもそもその後のif文自体を書き換えたりとかしてくるから一定レベル以上の攻撃は防げない
とりあえずxor暗号程度で保持しとくとかは?
get => 機密情報 ^ 0x01234567;
set => 機密情報 = value ^ 0x01234567;
2018/12/02(日) 15:57:52.77ID:uCltPpgZa
>>760
前者はセッターをinternalにするのが一番素直で分かりやすいと思う
768デフォルトの名無しさん (ワッチョイ 4b9f-GnKV)
垢版 |
2018/12/02(日) 16:00:32.72ID:1mt10vUo0
>>765
>>766
>>767
ありがとうございます
参考にさせていただきます
2018/12/02(日) 16:23:19.21ID:3wF0RuQO0
>>767
アクセス修飾子での制限はリフレクションで簡単に突破される
2018/12/02(日) 17:32:37.60ID:uCltPpgZa
>>769
当たり前やん。

悪意と不注意は区別する必要がある。

前者に対する防衛法を語る能力を俺は持ってないので
後者について言ったまで
2018/12/02(日) 17:55:56.69ID:8Z0+kDxur
そもそもお漏らししてもいい案件だけやる
2018/12/02(日) 18:07:52.27ID:3wF0RuQO0
>>770
>>760が訊いてるのは悪意対策だろ…
2018/12/02(日) 19:18:46.11ID:wUrRop5j0
リフレクションって何?
2018/12/02(日) 20:03:59.45ID:Vovs5evr0
ggrks
2018/12/02(日) 22:24:30.53ID:h/Y7nr/g0
文字列を変数名として扱う仕組みのこと
2018/12/02(日) 22:36:49.76ID:AtVX1yZrM
>>774
答えられないなら黙ってればいいのに
2018/12/02(日) 22:42:42.22ID:HHTlCBKM0
>>776
それはお前も同じ
2018/12/03(月) 01:50:08.39ID:CtimMCgY0
>>777
え???
2018/12/03(月) 09:10:29.70ID:7GT4duU30
>>778
マジガイジかよ…
生ゴミはとっととくたばれ
2018/12/03(月) 10:30:31.17ID:58uLWeIid
>>779
お前がな
781デフォルトの名無しさん (ワッチョイ b39d-hzet)
垢版 |
2018/12/03(月) 14:27:17.52ID:1qcFF+t30
ClassA,ClassB,,,のインスタンスをJsonで保存したい。

Class Ihozon{
void init(){} //変数を初期化
string serialize(ClassA str){ }
ClassA deserialize( string json){ }
}
というインターフェースを作って保存処理は共通化したいと思うのだが、Serializeするのにクラス名の
引数が必要になるので共通化できない。こういう場合どうしたらいいの?
2018/12/03(月) 15:09:15.55ID:kXdIrz5+a
>>781
ちょっと何言ってるのかよく分からないところがあるので
勘違いかもしれないけど、普通にジェネリックメソッドにするだけじゃないの?

public static string JsonSerialize<T>(T obj) {...}
public static T JsonDeserialize<T>(string json) {...}
783デフォルトの名無しさん (ワッチョイ b39d-hzet)
垢版 |
2018/12/03(月) 15:51:51.32ID:1qcFF+t30
jeneric interface をつかったらいいんだね。できました。ありがとう。
2018/12/03(月) 16:33:19.27ID:k9BWMLgHp
インスタンスを保存して何か良い事あるのか?
言葉の違いなだけならいいが…クラス内の値を保存するんだよな?
クラスのある位置を示すポインタを保存するんじゃないんだよな?
2018/12/03(月) 16:45:46.51ID:wi/+8SfFd
>>784
アスペ
786デフォルトの名無しさん (ワッチョイ b39d-hzet)
垢版 |
2018/12/03(月) 17:31:56.17ID:1qcFF+t30
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を同時にやるってどうやるの?
2018/12/03(月) 17:49:03.84ID:PYYWjLDMd
System.Web.Mail.MailMessageクラスのFieldプロパティでCDOのFieldを追加してました。

System.Webは古いからSystem.Net.Mailを使えと警告が出るので置き換えようとしてみたところ、対応する方法が見つかりませんでした。
ご存知の方いないでしょうか。
788デフォルトの名無しさん (ワッチョイ b39d-hzet)
垢版 |
2018/12/03(月) 18:01:20.51ID:1qcFF+t30
>>786
自己解決:Interfaseやめてジェネリックのクラス使えばできました。
789デフォルトの名無しさん (ワッチョイ b39d-hzet)
垢版 |
2018/12/03(月) 21:15:19.45ID:1qcFF+t30
別のプロジェクトからCopy してきた Form1をNameSpace名をこのプロジェクトに
あわせて
var fm = new Form1();
fm.ShowDialg();
とやっても、空のフォームが立ち上がる。なぜなんだろう?
2018/12/03(月) 22:08:22.85ID:jwp068Q1a
>>789
エディタのキャッレットを
> var fm = new Form1();
この行のForm1の箇所に置いてF12を押す
2018/12/03(月) 22:10:11.00ID:yskaDDV40
>>786
もう解決してるみたいだけど、一応。
Interfaceと継承を指定する場合は、カンマ(,)で区切って並べるだけ。
792デフォルトの名無しさん (ワッチョイ b39d-hzet)
垢版 |
2018/12/04(火) 04:22:30.94ID:16QpsEK/0
>>790
ありがとう。解決しました。
InitializeCompornent();の呼び出しが消えていた。
なんでだろ。消した覚えはないんだけど。
793デフォルトの名無しさん (ワッチョイ b39d-hzet)
垢版 |
2018/12/04(火) 04:55:27.00ID:16QpsEK/0
>>791
interfaceを使えないかトライしてみましたが、どうもうまく行かないです。
ClassFileはIjsonをインターフェースする必要があって、Ijsonのinit()はClassAのプロパティや
変数の初期化なのでClassAの中でしか実装できません。なので
ClassFile:Ijson<ClassA>
ClassA:ClassFile<ClassA>
のような構成になります。しかし問題があります。
問題:ClassFileの中ではinit()は実装したくないのに、実装を余儀なくされるが、初期化したい変数は
ClassAの中にあるので困る。
794デフォルトの名無しさん (ワッチョイ b39d-hzet)
垢版 |
2018/12/04(火) 05:04:31.89ID:16QpsEK/0
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;
}
}
2018/12/04(火) 10:13:14.55ID:4uTJLjzta
splitcontainerで上下分割してて、
最大化させてもpanel1の方は縦幅(height)は変わらないようにしたいのだけど
どのプロパティで設定できるのでしょうか
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況