ふらっとC#,C♯,C#( ..
237:デフォルトの名無しさん
09/03/04 17:46:46
>>235
ぼちぼち美しい
238:デフォルトの名無しさん
09/03/04 17:54:00
動的に処理を差し替えるような必要があればラムダ式は有効だけど
>>228のケースでは意味がないな。違いはメソッドより効率が悪いこと。
長くなるのを避けてるだけだと思う。
239:デフォルトの名無しさん
09/03/04 18:06:02
>>235
まあ>228レベルならC的関数定義の別の書式に等しい。
マ的には現代的関数型言語みたいに、ラムダ計算後にインライン化とか末尾最適化が言語で保障されているなら嬉しいけど。
240:デフォルトの名無しさん
09/03/04 18:18:54
知識はあってもかしこくない
だめだこりゃ
関数がいやならC#やるな
241:デフォルトの名無しさん
09/03/04 18:31:11
どこをどう読んだら誰が関数が嫌なんて言ってるように見えるんだろう
242:デフォルトの名無しさん
09/03/04 18:48:32
ラムダ式は超美しい。
243:デフォルトの名無しさん
09/03/04 18:54:43
どうでもいいよ
244:174
09/03/04 18:56:15
みんなー、アッカーマン関数の話しようぜー。
>>174のコードだと、m=0, n=int.MaxValue-1みたいなケースが計算できない
のが嫌だ。ていうかそもそもの問題は多分アッカーマン関数の表を一気に計算する
コードじゃなくって、与えられたm,nに対してアッカーマン関数の値を計算するコード。
なので、>>187のスタック使ってヒープを使って再帰する方法と、ハッシュ使って
計算済みの値を再利用する方法を組み合わせたアプローチにしてみた。値を再利用
するので、表を生成する用途でも有効。
うちの環境(メモリ1GB)では
m=0でn=int.MaxValue-1まで
m=1でn=10000000くらいまで
m=2でn=5000000くらいまで
m=3でn=20まで
m=4でn=1まで
計算できた。
スレの空気読まずにコードアップするぜ!
static Dictionary<int, Dictionary<int, int>> Ack
= new Dictionary<int Dictionary<int, int>>();
static Stack<int> argM = new Stack<int>();
static Stack<int> argN = new Stack<int>();
static int Ackermann(int m, int n)
{
argM.Clear();
argN.Clear();
argM.Push(m);
argN.Push(n);
while (argM.Count>0) {
245:174
09/03/04 18:57:14
if (!Ack.ContainsKey(argM.Peek())) Ack[argM.Peek()] = new Dictionary<int, int>();
if (Ack[argM.Peek()].ContainsKey(argN.Peek())) {
argM.Pop();
argN.Pop();
continue;
} else {
int value;
if (argM.Peek() == 0) {
value = checked(argN.Peek() + 1);
} else if (argN.Peek() == 0) {
if (Ack.ContainsKey(argM.Peek() - 1) && Ack[argM.Peek() - 1].ContainsKey(1)) {
value = Ack[argM.Peek() - 1][1];
} else {
argM.Push(argM.Peek() - 1);
argN.Push(1);
continue;
}
} else {
246:デフォルトの名無しさん
09/03/04 18:58:25
アッカーマン関数なんて使わないし
247:174
09/03/04 19:00:46
int n_;
if (Ack.ContainsKey(argM.Peek()) && Ack[argM.Peek()].ContainsKey(argN.Peek() - 1)) {
n_ = Ack[argM.Peek()][argN.Peek() - 1];
} else {
argM.Push(argM.Peek());
argN.Push(argN.Peek() - 1);
continue;
}
if (Ack.ContainsKey(argM.Peek() - 1) && Ack[argM.Peek() - 1].ContainsKey(n_)) {
value = Ack[argM.Peek() - 1][ n_];
} else {
argM.Push(argM.Peek() - 1);
argN.Push(n_);
continue;
}
}
248:デフォルトの名無しさん
09/03/04 19:01:34
Ack[argM.Pop()][argN.Pop()] = value;
continue;
}
}
return Ack[m][n];
}
終わり。Ackermann(3,20);あたりで速さが実感できるぜ!。
あと、>>244の「>>174のコード」ってところ、アンカーミスで>>196のコードね。
>>246
>>173を思い出してあげてください。
249:デフォルトの名無しさん
09/03/04 19:08:28
Dictionary<int, Dictionary<int, int>>は効率悪いな
struct Key { public int M; public int N; public override int GetHashCode() { return M ^ N } }
こういうのをキーにしたらDictionary<Key, int>で済むのに
250:デフォルトの名無しさん
09/03/04 19:15:09
>>249
一般にはそうだろうけど、そもそも話題がアッカーマン関数だから、
mはどうせ0から5くらいまでしかとらないんだよね。だから別に
これでかまわないんじゃないかな。
あと、ハッシュ値の衝突って詳しくないんだけど、そういう衝突しまくる
ハッシュ関数って効率はどうなっているの?
251:デフォルトの名無しさん
09/03/04 20:49:39
ファイルを選択して、それを別のコンソールプログラムに読み込ませて
その結果の出力(文字列)を別ウィンドウに表示したいのですが、どうやればいいですか?
ファイル選択まではいいのですが、別のプログラムを起動してそいつに引数を
渡すにはどうすればよいですか?
252:デフォルトの名無しさん
09/03/04 20:51:32
Process
253:デフォルトの名無しさん
09/03/04 20:52:30
>>251
Process のヘルプをじっくり見る。
254:デフォルトの名無しさん
09/03/04 21:12:30
>>228はマイナスの年齢が出るから間違いだろそもそも
255:デフォルトの名無しさん
09/03/04 21:22:08
>>238
別にメソッドと比べて効率悪くならないよ。
モノホンのラムダ式であるリスト構造に基づく関数定義から
実行時に動的にメソッドを生成する、なんて事は行われていない。
匿名メソッドの名前どおり、コンパイル時にコンパイラが勝手な
メソッド名を割り当ててメソッドを作る。自分でメソッド定義する
のと何も違いはない。
256:デフォルトの名無しさん
09/03/04 21:27:19
デリゲート呼び出しが入る
最適化もできなくなるから使い方にもよるけど多かれ少なかれ確実に遅くはなる
その小さい差の意味は置いといて
257:デフォルトの名無しさん
09/03/04 21:31:18
まじ?>>228のhoge(ほにゃらら)みたいなのって、匿名メソッドの呼び出し
として最適化されるんじゃなくて.Invokeされちゃうの?
ちょっとリフレクタで確かめてみる。
258:デフォルトの名無しさん
09/03/04 21:39:14
ほんとだ。C時代のプリプロセッサマクロに代わる、スコープがあって上位スコープ
にアクセスできる素性の良いマクロとして利用する事がたびたびあったから、
ちょっとショック。
259:デフォルトの名無しさん
09/03/04 21:52:18
>>251
P/Invokeを駆使して共有メモリ経由でやりとりする。
{Tcp,Http,Ipc}Channelクラスを使って通信する。
特定の位置にファイル作って監視させる。
アプリケーション構成ファイルを動的に書き換えて起動する。
ProcessStartInfo.Argumentsを設定してProcessオブジェクトのStartを呼ぶ。
Process.Start(string,string)を呼ぶ。
260:デフォルトの名無しさん
09/03/04 23:01:02
>>259
何故難しい順に書く・・・
261:デフォルトの名無しさん
09/03/04 23:06:21
理系プログラマだからさ
262:デフォルトの名無しさん
09/03/04 23:10:49
かっこいい
263:デフォルトの名無しさん
09/03/04 23:15:38
VS2005を使っているのですが2008にすると
C#3.0とかになっちゃうの?
今まで2005で作ったプログラムって2008でも修正可能なんでしょうか?
.NET2.0用で作ってたのが.NET3.5になっても無問題?
264:デフォルトの名無しさん
09/03/04 23:18:25
>>263
> VS2005を使っているのですが2008にすると
> C#3.0とかになっちゃうの?
も、使える
> 今まで2005で作ったプログラムって2008でも修正可能なんでしょうか?
可能
> .NET2.0用で作ってたのが.NET3.5になっても無問題?
没問題
というか、.NET 3.5 って、.NET 2.0 上で動作する拡張なだけだから。
265:デフォルトの名無しさん
09/03/04 23:19:44
>>263
C# 3.0 になる。
2005 → 2008 へのプロジェクトのアップグレードで失敗したって話は見たことも聞いたこともない。
.NET 2.0 が 3.5 になっても問題ない。
266:デフォルトの名無しさん
09/03/04 23:34:30
170-172
今夜も試行錯誤:
Windows認証で
環境(Vista アルティメット) <= (ヴァーチャルPC Xp home)
Data Source=192.168.1.1\SQLEXPRESS
これでも
11433\OTHERINSTANCE
これでもダメでしたが
SQL Server 2005 に接続しているときときにこのエラーが発生した場合は、
SQL Server の既定の設定がリモート接続を許可しないようになっていることが
エラーの原因である可能性があります。
(provider: TCP プロバイダ, error: 0 - 対象のコンピュータによって拒否されたため、接続できませんでした。)
セキュリティー構成は、サービスと接続のセキュリティ構成−リモート接続−ローカル及びリモート接続
●TCP/IP および名前付きパイプ・・・
にチェックは言っているんですけどねー
まだまだ頑張る・・・応援よろしく
267:デフォルトの名無しさん
09/03/04 23:49:24
>>263
ただ、Windows2000は.Net2.0までしか入らないから
その辺のサポートするならVS2008にしても.Net2.0で作り続ける必要がある。
プロパティ打つのがたるいし型推論も使えない。。orz
268:デフォルトの名無しさん
09/03/04 23:53:50
>>266
まず、MSSQLSMSEで、IPアドレスで接続できるかどうか試してみれよ
サーバ名にIPアドレス、認証はSQL認証で、設定したアカウントを設定しれ。
269:デフォルトの名無しさん
09/03/05 00:03:50
MSSQLSMSE<<とりあえず ぐぐってみる・・・・
まだまだ ど素人だな俺って・・・
270:デフォルトの名無しさん
09/03/05 00:06:21
やっぱりC#使う場合はDBをSQLServerにすることが多い?
271:デフォルトの名無しさん
09/03/05 00:15:47
269だけど
Accessとかもありじゃないでしょうか
おいらはAccess買えない貧乏仕様
定額給付でSqlServer2008でも買うか…
272:デフォルトの名無しさん
09/03/05 00:18:02
実行後に実行プログラム自身を削除するのってどうすればいいですか?
273:デフォルトの名無しさん
09/03/05 00:22:44
SQL Server 2008 Expressでいいんじゃないの?
無料だし、商用にも使えるし
274:デフォルトの名無しさん
09/03/05 00:23:51
実行プログラムを実行して削除するプログラムを作る
275:デフォルトの名無しさん
09/03/05 00:25:34
>>267
.NETとC#のバージョンがごっちゃになってないか?
276:デフォルトの名無しさん
09/03/05 00:29:01
>>267
varはコンパイラの機能だから.NET Framework 2.0対象でも使えるはずだよ。
277:デフォルトの名無しさん
09/03/05 00:33:50
>>268
なんかちょっとわかった!^^進展してないけど明日チャレンジします
ね・・・ねむけが
278:267
09/03/05 00:38:45
あ!そうかも。
LINQが参照できなくて色々できないあたりから
色々思考停止してる。さんくす!
279:デフォルトの名無しさん
09/03/05 00:42:06
ILのレベルでは何も代わっていないのだから、3.5で追加されたクラスライブラリを
使っているかどうかだけが問題なのだと思う。
Linq to ObjectはSystem.Linq.Enumerableクラスの拡張メソッドだから
.NET3.5専用。
でも、拡張メソッド機能自体は、.NET2.0でも使える(多分)、など。
型推論も自動プロパティも匿名メソッドも全部.NET2.0で使えるんじゃないかな(未確認)。
280:デフォルトの名無しさん
09/03/05 00:46:27
>>279
ラムちゃんは?
281:デフォルトの名無しさん
09/03/05 00:50:26
>>279
拡張メソッドは構文糖じゃないし、専用のアトリビュートが必要なのでダメでせう
282:デフォルトの名無しさん
09/03/05 00:55:11
拡張メソッドは構文糖だよ。
283:デフォルトの名無しさん
09/03/05 00:58:43
今日日何が糖衣構文とそうでないものの境界もあいまいな気もする。
糖衣というより、コンパイラが提供する機能と言った方が適切じゃないのか
284:デフォルトの名無しさん
09/03/05 00:58:56
>>252-253
ありがとうございます。出来たのですが、コマンドプロンプト内に表示される出力内容を
取得できません。どうやればいいですか?
285:デフォルトの名無しさん
09/03/05 00:59:02
>>280
delegate int delTest(int i);
static void Main(string[] args)
{
delTest a = i => i + 1;
Console.WriteLine(a(3).ToString());
}
は2.0で通った。
あと、Func<T>(というかSystem.Core.dll)は3.5だけどAction<T>は2.0かららしい。
286:267
09/03/05 01:02:19
やあ。期待に膨らんだ胸がしぼみつつあるよ。
×var
×配列の暗黙的な初期化
○自動プロパティ
○コレクションの初期化
ラムダは試すまでもなく。
それでも.Net2.0のまま短縮できる表記が増えた!感謝!
287:285
09/03/05 01:03:39
なるほど、
foo(this IEnumerable boo){
}
は
foo([System.Runtime.CompilerServices.ExtensionAttribute] IEnumerable boo){
}
と等価で、System.Runtime.CompilerServices.ExtensionAttributeは
3.5からなんだね。
288:デフォルトの名無しさん
09/03/05 01:07:03
varって何が原因でいけないの?
289:デフォルトの名無しさん
09/03/05 01:07:55
いないいない
290:285
09/03/05 01:07:58
>>286
static void Main(string[] args)
{
List<int> a=new List<int>(){1,2,3,4,5};
foreach (var i in a) {
Console.WriteLine(i.ToString());
}
}
は通ったけど。
自分、279ですが、やっぱ基本的な基準は>>279でしょう。
291:267
09/03/05 01:18:45
スマソ。今まで1度も使ったことなかったので、
そもそもvarがローカル変数のみに有効ということを知らなかった。
メンバで試してエラーが出たのでダメと判断してた。
色々勉強になった、ありがとう。
292:デフォルトの名無しさん
09/03/05 01:21:36
varはVBのvariantと違うんだ。他の変数同様に厳密な型付けはされる。
型推論によって型を明示しなくてもコンパイラがわかってくれるという
場合にだけ有効。
293:デフォルトの名無しさん
09/03/05 01:25:05
IDEが優秀であれば問題ないかもしれんが、
紙で見てる分にはvarじゃ何の変数だかわからんので困らんのかな
294:デフォルトの名無しさん
09/03/05 01:30:49
紙で見るとかw
295:デフォルトの名無しさん
09/03/05 01:31:12
>>293
まあ、var にして型が何か分かりにくくなるようならやっぱ使わない方がいいと思う。
296:デフォルトの名無しさん
09/03/05 01:35:32
少なくともwebや解説本、MSDNのサンプルプログラムで書かれてたらえらい迷惑
297:デフォルトの名無しさん
09/03/05 01:41:08
.NET2.0の範囲で使えるC#3.0
推論型、匿名型, 暗黙型付け配列
コレクションのイニシャライザ、オブジェクトのイニシャライザ
パーシャルクラス、パーシャルメソッド
自動プロパティ、ラムダ式
.NET3.xが必要になる機能
ラムダ式でFunc<>, Expression<>を使用
LINQクエリ式他
拡張メソッド
>>281
拡張メソッドが使えないのはExtensionAttributeが3.5に含まれるから。
という事で、System.Runtime.CompilerServices.ExtensionAttributeを自分で定義してやれば2.0でも使える。
インテリセンスにゃ出ないけど、まぁそのくらいは我慢できるだろう。
298:デフォルトの名無しさん
09/03/05 01:45:39
>>拡張メソッド、Func<>
ぶっちゃけSystem.Core.dllをローカルコピー=trueにして参照しちゃえば良いんじゃ・・・
299:デフォルトの名無しさん
09/03/05 02:01:05
>>297
なんで必死なのかわからない
300:デフォルトの名無しさん
09/03/05 02:10:52
>>299
なんで必死なのかわからない
301:デフォルトの名無しさん
09/03/05 02:16:06
>>299
>>300
これだから文系は
302:デフォルトの名無しさん
09/03/05 02:22:34
>>301
なんで必死なのかわからない
303:デフォルトの名無しさん
09/03/05 02:34:48
ど、ど、ど童貞ちゃうわ!
304:デフォルトの名無しさん
09/03/05 02:36:07
>299-303の話の流れがさぱりわからないんだが・・・
305:デフォルトの名無しさん
09/03/05 02:41:10
触るな危険。放っておけ
306:デフォルトの名無しさん
09/03/05 02:41:58
>>305
なんで必死なのかわからない
307:デフォルトの名無しさん
09/03/05 02:51:15
>>306
これだから文系は
308:デフォルトの名無しさん
09/03/05 02:51:58
>>307
なんで必死なのかわからない
309:デフォルトの名無しさん
09/03/05 02:53:10
>>308
↓文系
310:デフォルトの名無しさん
09/03/05 02:59:54
>>309
なんで必死なのかわからない
311:デフォルトの名無しさん
09/03/05 03:00:42
OpenFileDialogでファイルを選択して、コンソールプログラムの引数に与えて実行しようとしています。
ファイルのパス名に空白が含まれるときは、どうすればいいですか?
312:デフォルトの名無しさん
09/03/05 03:08:23
>>311
ダブルクォーテーション?
↓文系
313:デフォルトの名無しさん
09/03/05 03:09:15
>>312
なんで必死なのかわからない
314:デフォルトの名無しさん
09/03/05 03:15:02
変数に入ってるので、ダブルクォーテーションができないみたいなんですが、、
こんな感じ。
String s = OpenFileDialog.FileName;
ProcesStartInfo.Arguments = s;
こうやって、ProcessをStartすると、ファイル名のパスに空白があるとそこで引数が終わりと判断されてしまいます。
315:デフォルトの名無しさん
09/03/05 03:24:46
その変数を括ったらどうなる?
316:デフォルトの名無しさん
09/03/05 03:26:11
>>315
なんで必死なのかわからない
317:デフォルトの名無しさん
09/03/05 03:27:35
String s = "\""+OpenFileDialog.FileName+"\"";
318:デフォルトの名無しさん
09/03/05 03:28:59
えー、括ったら単なる文字列になってしまいませんか?
やってみたら、Visual Studioの作業ディレクトリ+"s"というファイル名
をオープンしようとして失敗する、という結果でした。
319:デフォルトの名無しさん
09/03/05 03:30:49
>>318
>>317のように、文字列として括れってこと
320:デフォルトの名無しさん
09/03/05 03:31:21
>>319
なんで必死なのかわからない
321:デフォルトの名無しさん
09/03/05 03:31:28
>>317
できました!
なるほど、そうやるんですか。
ありがとうございました。
322:デフォルトの名無しさん
09/03/05 03:34:04
なんで荒らしがわいてんだ?
323:デフォルトの名無しさん
09/03/05 03:35:05
>>322
なんで荒らしがわいてんのかわからない
324:デフォルトの名無しさん
09/03/05 03:36:49
>>322
自称エレガントな解法を示したつもりが、
誰にも相手にされなかった可哀想な一般人らしい
325:デフォルトの名無しさん
09/03/05 03:38:30
>>324
なんで必死なのかわからない
326:デフォルトの名無しさん
09/03/05 03:41:02
>>324
とりあえずNG登録だな
番号飛ぶけど
327:デフォルトの名無しさん
09/03/05 03:42:19
日曜プログラマ、まだ粘ってたんか
328:デフォルトの名無しさん
09/03/05 03:44:14
なんで文系という言葉に反応するんだろう?
329:デフォルトの名無しさん
09/03/05 03:45:51
>>325
>>326
>>327
>>328
これだから文系は
330:デフォルトの名無しさん
09/03/05 03:48:55
いいえ短小包茎です
331:デフォルトの名無しさん
09/03/05 03:51:50
string.Format("\"{0}\"", path);
332:デフォルトの名無しさん
09/03/05 07:26:57
ToolStripMenuItem で選択後、自動で閉じないようにしたいのですが
どうしたらいいのですか?
333:デフォルトの名無しさん
09/03/05 09:37:28
その奇抜なUIの設計思想を変える
334:デフォルトの名無しさん
09/03/05 10:08:16
自分でパネルにでもラベルとか作って完全に自作して実装すれば?
というかクリックして閉じないとか・・・どうやって閉じるんだ?
Windowsライクな実装の方が使い手も違和感ないと思うんだけど?
335:デフォルトの名無しさん
09/03/05 11:03:21
継承してWndProcをフックすればいけそうな気はする
336:デフォルトの名無しさん
09/03/05 11:23:00
DataGridViewにDataTableをバインドしています。
DataTableの更新が終わるまで描画処理を止めたいのですが、
ListBoxで言うところのBeginUpdate()のようなメソッドってありますか?
337:デフォルトの名無しさん
09/03/05 11:43:50
データソースをBindingSource使うようにして
RaiseListChangedEventsプロパティで一時的にイベント通知無効化して
最後にResetBindingsで更新
338:デフォルトの名無しさん
09/03/05 11:56:13
>>337
ありがとうございます。試してみます。
339:デフォルトの名無しさん
09/03/05 11:58:30
>>293-296
varの最強の用途は、コレクションの要素の型が分かりづらい場合だろう。
例えば、Dictionaryはキーとアイテムの型パラメタ<foo,bar>をとるけど、
要素型はKeyValuePair<foo, bar>。
そこで、まず、
foreach(var a in dic){
}
って書いてvarにマウスポインタを当てる。すると、ツールチップでaの型が
出てくる。この場合KeyValuePair<foo,bar>。それを書き写して
foreach(KeyValuePair<foo,bar> a in dic){
}
とする。これが最強。
varの存在意義を語って存在意義を否定してしまった。
340:デフォルトの名無しさん
09/03/05 12:00:30
>>339
あれって良し悪しだよな・・・・
341:デフォルトの名無しさん
09/03/05 12:02:58
varを右クリックして「実際の型名に置換」とかできたら、バリバリ使っちゃう。
342:デフォルトの名無しさん
09/03/05 12:04:14
>>341
グッドアイデア!
343:デフォルトの名無しさん
09/03/05 12:05:15
それヘジたんがC#3.0についてのインタビューで言ってたことだけどなぜか実装されなかった
344:デフォルトの名無しさん
09/03/05 12:05:53
リファクタメニューに「ソリューション内のvarを実際の型名に置換」機能があったら、バリバリ使っちゃう。
345:デフォルトの名無しさん
09/03/05 12:08:21
VSってアドイン作れるよね?しかも.NETで。誰か作ってよ。(他力本願)
346:デフォルトの名無しさん
09/03/05 12:10:28
IDEの問題で解決できるなら、入力候補の推測機能ってことで実装すればいいのに。
? total = 0m;
という入力を許可し、;を入力した段階でIDEが?を推論した型に置き換える。
上の例だと、自動的に
decimal total = 0m;
に置き換わる。駄目?
347:デフォルトの名無しさん
09/03/05 12:14:06
型を書くかvarを書くかという極端な判断が必要だから
その場に応じて使い分けるというのがどうしてもしづらいんだよな
var total : decimal = 0m;
はじめからこういうスタイルにしとけば型を省略しても誰も違和感を抱かなかった
今作り直したらこうなりそう
348:デフォルトの名無しさん
09/03/05 12:16:44
なるほど、varを変数宣言の開始句として、:の後に型を書くのか。
で、:を入力した時点でInteliSenseが働くと。
でも、そこを弄ったらもう、"C"#じゃないんじゃ。
349:デフォルトの名無しさん
09/03/05 12:20:23
よし、:はクラスやインタフェースの継承に使うし、最近は冗長でも
IDEの入力支援頼みでコードを英語の文章に近付けるのが流行だから、
var total as decimal=10m;
で行こう。あれ?どっかで見たことあるぞ。
350:デフォルトの名無しさん
09/03/05 12:23:23
varの存在で一歩またVBに近づいた!
閣下、我々の陰謀は成功を収めつつあります。
351:デフォルトの名無しさん
09/03/05 12:24:48
実際その点についてはVBのほうが自然だと思うよ
CスタイルのメリットはCやJavaと同じであることくらい
352:デフォルトの名無しさん
09/03/05 12:29:11
型名 変数名;
って、
Animal dog;
でしょ?どう考えても英文法的におかしい。やっぱり、英文との類似性
よりも構文の単純さやキーワードの短さが尊ばれた時代の名残だよね。
353:デフォルトの名無しさん
09/03/05 12:33:53
でも、VBのdimキーワードも、配列宣言からの流用だったりして
英単語的には怪しかったりする。やっぱキーワードはvarで。
354:デフォルトの名無しさん
09/03/05 12:36:43
省略は良くない
今はIDEがあるのだからvarもvariableにするべきだ
355:デフォルトの名無しさん
09/03/05 12:40:50
define a variable dog which is an Animal and let it be a new instance of Animal whose name is "dog";
356:デフォルトの名無しさん
09/03/05 12:47:22
おいおい、文末はピリオドに決まってるだろ
357:デフォルトの名無しさん
09/03/05 12:50:52
そうすると、フィールド、プロパティ参照のピリオドを取りやめないとな。
let the name of the dog be "ポチ".
358:デフォルトの名無しさん
09/03/05 12:50:54
文頭に挨拶を書くのが礼儀だろ
dear my computer
359:デフォルトの名無しさん
09/03/05 12:57:28
Animal myDog=new Animal("dog");
myDog.name="ポチ";
と以下が等価ってわけですね。こんなのの入力もIDEの支援で余裕だぜ!
Dear my computer. Can you please define a variable myDog
which is an Animal and let it be a new instance of Animal
whose speciesName is "dog". And then please let the name
of the myDog be "ポチ".
360:デフォルトの名無しさん
09/03/05 13:03:34
それじゃ面倒だから、これでいいよ
a d = n a("d")
d.n = "ポ"
361:デフォルトの名無しさん
09/03/05 16:10:12
C#ってC++の一種とかんがえていいの?
362:デフォルトの名無しさん
09/03/05 16:28:10
C++とC#は伯父と甥ぐらいの位置
とても一種とはいえない
363:デフォルトの名無しさん
09/03/05 16:36:58
.NET言語は、CLRありきだから、多言語との親戚関係とかの議論は意味が
ないと思う。とりあえず、C++のサブセットでもスーパーセットでもない。
シンタックスがC由来の別物言語と捉えるべき。
それに、Cを拡張して言語仕様を肥大化させてオブジェクト指向を取り入れる
C++的なアプローチとは違い、JAVAを意識した自由度より構造性を優先させた
言語になっている。そのために、JAVA的な、やりたい事に対して解法が唯一つ的
な部分がある。
のわりに、P/Invokeなど泥臭いアプローチをしてでも自由度を確保する貪欲さもあって、
やりたい事ができないという事態も滅多に生じないようになっている。
良い所だけ挙げるならば、こんな感じでバランスの取れた構造的な言語。
プリプロセッサで変態マクロが定義できるC++なんか、もう見たくもないやい。
364:デフォルトの名無しさん
09/03/05 16:53:35
VSのウイザードで作るCOMやらMFCの雛形はひどかった
365:デフォルトの名無しさん
09/03/05 16:55:21
たまたまwin32のAPIと自分が作った関数名が衝突したので
名前空間で分けたらそれでも衝突して、調べて見たらマクロ定義
だった時の憤りといったら・・・
366:デフォルトの名無しさん
09/03/05 16:57:39
C++でマクロを使う奴は馬鹿
367:デフォルトの名無しさん
09/03/05 18:34:26
だからと言って避けて通れないのがC++のどうしようもない点なわけで。
368:デフォルトの名無しさん
09/03/05 18:38:31
なにしろwin32APIが・・・MFCが・・・
369:デフォルトの名無しさん
09/03/05 18:39:26
過去を引きずるのは大変だねとだけ
370:デフォルトの名無しさん
09/03/05 19:01:25
10の位を切り上げる処理をするのに
y= Math.Ceiling (x / 10) * 10;
と書いてるんですが他にいい書き方とかありますか
括弧の使い方とかなんか不安なんですが・・・
371:デフォルトの名無しさん
09/03/05 19:29:09
>>370
>>210をリスペクトして
y = Int32.Parse(String.Format("{0:d}0", (x + 9) / 10));
とか。
(ごめん、冗談だ、念のため。別に>>370の通りで問題ないよ)
372:デフォルトの名無しさん
09/03/05 19:35:17
xが整数以外なら問題あるでしょ。
っていうか整数なら9足すだけなんだけど。。
さて質問。
Windows Form のOnLoadとか適当な場所に
DayOfWeek[] ar = (DayOfWeek[])Enum.GetValues(typeof(DayOfWeek));
listBox1.DataSource = ar;
comboBox1.DataSource = ar;
のようなコードを書くと、コンボボックスとリストボックスの選択が相互に
連動するんだけど、この仕組みと、こういう仕様の意図が知りたい。
373:デフォルトの名無しさん
09/03/05 19:46:27
データバインディング
GUIなんてデータ表示するだけなんだからわざわざTextだのItemsだの使うより
データを汎用的な形で関連付けられた方がいいよねという考え
カレント行の共有はCurrencyManager使ってコントロールの親子関係に基づいて行われる
374:デフォルトの名無しさん
09/03/05 19:54:30
>>373
ごめん、その思想自体はよくわかるんだけど、知りたいのは
2つのまったく無関係のコントロールの選択されているアイテムが連動する仕組みと、
そのような仕様にしてある意図なんだ。
375:デフォルトの名無しさん
09/03/05 19:56:20
windows formsだとそうなんだ。
WPFの場合
DayOfWeek[] ar = (DayOfWeek[])Enum.GetValues(typeof(DayOfWeek));
list1.DataContext = ar;
list1.SetBinding(ListBox.ItemsSourceProperty, "");
list2.DataContext = ar;
list2.SetBinding(ListBox.ItemsSourceProperty, "");
だと選択行は共有されないね。
376:デフォルトの名無しさん
09/03/05 22:41:17
>>341
>varを右クリックして「実際の型名に置換」とかできたら、バリバリ使っちゃう。
それ似たのがReSharperにあるよ。
377:デフォルトの名無しさん
09/03/05 22:42:44
似たようなのじゃためなんだ
僕らはC#に汚染されているんだ!
378:デフォルトの名無しさん
09/03/05 22:46:21
>>377
ReSharperはVS用のアドインだよ。確か。
まあこちとら趣味プログラマのexpress edition使い。
たっかいツールなんか使う機会なんざねーんだけどね。
379:デフォルトの名無しさん
09/03/06 00:03:40
>>268
ダメポ 続きは明日・・・・
380:デフォルトの名無しさん
09/03/06 00:09:08
ちょっと最後に質問SQL serverでLanやりたい場合一般的にDBの配置は
C:\Program Files\Microsoft SQL Serverの配下ですか?
自分で作ったC:\aaaみたいなフォルダでもいいんですかね・・・・
381:デフォルトの名無しさん
09/03/06 00:21:34
>>380
SQLサーバが自分のPCとは異なるPCにある場合、
c:\とか、ファイルを直接指定することはないよ。
接続する側→(LAN)→接続されるSQLServer
という関係で接続しているとき、
接続する側は、単に接続されるSQLServerのIPアドレス(とインスタンスと接続するDB名)を指定するだけ。
実際の物理ファイルのパス指定は接続されるSQLServerのほうで指定するので、
ConnectionStringでパスを指定することはない。
少なくとも自分が経験したスタンドアロンのSQLではそんな感じ。
382:デフォルトの名無しさん
09/03/06 00:24:32
ASP.NETの話になっちゃうんだけど
Web画面上にあるボタンをクリックするとクリックイベントが走りますよね。
でもWebだとクリックイベントの前にPage_Loadイベントが実行されますよね。
ちょくせつクリックイベントに飛ばす方法はないのでしょうか?
またPage_Loadイベントの処理の中で、Page_Loadイベントを抜けたら
次はクリックイベントが走るよというのを知る方法はありますか?
383:デフォルトの名無しさん
09/03/06 00:52:34
>>382
初期化したいのに、PostBackしたときもPage_Loadが呼ばれるから、
ボタンを押した時はPage_Loadは呼んで欲しくないということだろうけど、
そのためのIsPostBackだから、それで判断すればいいのでは?
ASP.NETの場合は、表示するたびに、そのページの新しいインスタンスが生成される。
これはwebという仕組み上仕方のないことなので、Page_Loadを実行せずに
インスタンスが生成する方法は基本的にはない。
クリックイベントが発生するということは、IsPostBackが必ずTrueだから、
それで判断すれば?
・・という意味でなかったら、contextとかみれば、イベントがあるかどうか
わかったほうほうがあるはず・・
384:デフォルトの名無しさん
09/03/06 10:01:27
>>374
無関係じゃないよ。同じ親コントロールに属して同じデータソースを参照してるじゃん。
無関係だと主張したいなら明示的にしないとだめ(Control.BindingContextプロパティ)。
仕組みはCurrencyManagerとかBindingManagerBaseとか調べれ。
意図? MSの人じゃないから答えられん。
まあ親とデータソースが同じなら現在行共有できた方が便利じゃねと思ったんじゃない?
.NET 2.0になってBindingSourceが追加されてデータソース主導になったけどな。
385:デフォルトの名無しさん
09/03/06 11:57:01
web上にあるファイルのサイズを簡単に取得する方法はありますか。
ダウンロードする前に知りたいのです。
386:デフォルトの名無しさん
09/03/06 12:00:40
簡単かどうかはその人次第だからなんとも
取得方法はそのファイルがどういうプロトコルで公開されているのかによるからなんとも
サイズ情報が公開されているかどうかはサーバ次第だからなんとも
387:デフォルトの名無しさん
09/03/06 12:04:25
HTTPならHEADで返してくれればいいけどな
388:デフォルトの名無しさん
09/03/06 15:00:26
HttpWebResponseのContent-Length
駄目な場合もあるけど
389:デフォルトの名無しさん
09/03/06 17:33:22
匿名メソッドと、ジェネリクス(Listなどのコレクション以外)で
うまいこと使用している例や、より利点がわかりやすく紹介されている
サイトがあったら教えてください教えてください。
390:デフォルトの名無しさん
09/03/06 17:43:46
>389
宿題?
391:デフォルトの名無しさん
09/03/06 17:49:54
MSDNでいいんじゃね?
392:デフォルトの名無しさん
09/03/06 18:06:45
匿名メソッドは自分だけが見るソースなら短いイベントハンドラの
定義に使うけど、推奨はできないなあ。
Button1.Click+=delegate{MessageBox.Show("Clicked!");};
とか。
処理の一部をカスタムできるメソッドを作るために使う例を
示せれば良いんだけど、できるだけLINQとか標準機能に落とし
込むようにしているので良い例がない。
ジェネリクスはやっぱり、独自のコレクションを作るとかが
多いんじゃない?
あと、幾つかデータの種類があって、それらのデータが更新された
時に更新値を受け取るコールバックを登録するメソッドが、
データの型をパラメタにとるジェネリックメソッドになっていた
のを見た事ある。でもこの場合、データの種類毎にメソッドを
用意するのと比べた場合の利点がさっぱり分からないコードだった。
393:デフォルトの名無しさん
09/03/06 18:17:46
Regex.Replaceなんかまさに匿名メソッドとかラムダ式の出番
394:デフォルトの名無しさん
09/03/06 19:08:52
>>390
宿題ではないです。
>>391
MSDNではサンプルが少ないのと、こういう時に使うと便利というのが、
イマイチよくわからないので。イベント的なコールバック用途というのは
意味はわかります。
>>392
ありがとうございます。
なるほど。自分も匿名メソッドにあまり利点を見いだせない一人です。
そのためサンプルがみたいと思ったのですが、
いいものがないということで残念です。
ジェネリクスもやはり独自コレクションがメインですか・・
コレクション以外の便利な使い方がイマイチ思いつかないので、
サンプルをお聞きしました。
395:デフォルトの名無しさん
09/03/06 19:30:11
前に複素数のジェネリック型なんて議論されていたよね。
それは特殊でかつ有用な使い方なんじゃないかな。
396:デフォルトの名無しさん
09/03/06 20:34:37
別に無理に利点を発見する必要は無いんじゃないの
必要に迫られたら使えばいい程度のものじゃないかね
397:デフォルトの名無しさん
09/03/06 21:38:25
System.Linq.Enumerableで嫌と言うほど出てくるよ
結局はコレクション操作だから微妙だけどな
くだらない例だけどEventHandler<TEventArgs>とか
398:デフォルトの名無しさん
09/03/06 21:49:34
Hoge a = 共通の前処理();
//aを使った固有の処理
共通の後処理(a);
こういうのが各所に出てきたから
void 共通の処理(Action<Hoge> action) { Hoge a = 共通の前処理(); action(a); 共通の後処理(a); }
こんなメソッドを定義して
共通の処理(a => { /*aを使った固有の処理*/ });みたいにしたことがある
399:デフォルトの名無しさん
09/03/06 21:56:13
>>394
・とくめいめそっど
Win Forms やら WPF の非同期部分で大活躍?
・じぇねりくす
基本、型を爆発させないためにある。これを踏まえると
Func<T> とかなかなかに便利な使い方じゃないか?
400:デフォルトの名無しさん
09/03/06 22:02:27
class HogeCache<T> { public static readonly Hoge Hoge = new Hoge(typeof(T)); }
これだけで型ごとに対応するインスタンスのキャッシュが作れる
Dictionary<Type, Hoge>使うよりも遥かに効率がいい
Comparer<T>.DefaultやEqualityComparer<T>.Defaultなどで使われてるパターン
401:デフォルトの名無しさん
09/03/06 22:19:30
>Button1.Click+=delegate{MessageBox.Show("Clicked!");};
こういう使い方って何でするんですか?
デザイン画面でボタンをダブルクリックするとクリックイベントのソースが出てきますが
そこにMessageBox.Show("Clicked");って記述すればいいと思っちゃうんだけど
わざわざこのように書く理由を教えてください。
402:デフォルトの名無しさん
09/03/06 22:21:19
短く書けるからって言ってんじゃん。アホかよ。
403:デフォルトの名無しさん
09/03/06 22:21:48
それだけかよw糞じゃん。
404:デフォルトの名無しさん
09/03/06 22:22:19
だから推奨はできないって言ってるだろw
405:デフォルトの名無しさん
09/03/06 22:24:25
糞すぎじゃん。
何でこんな機能つけたんだ。
406:デフォルトの名無しさん
09/03/06 22:26:37
つLINQ
ラムダ式で同じことがもっと簡潔に書けるから匿名メソッドは不要になった
そのうち非推奨だとコンパイラが警告出すようになってもおかしくない
407:デフォルトの名無しさん
09/03/06 22:28:19
状態によって、異なるクリックイベントを割り当てるのに便利かも。
状態をどこかのメンバ変数に保存して、同じメソッド内でメンバ変数の値によって分岐させるより、
処理そのものを差し替える感じ。
特に汎用できて処理を委譲できる場合なら尚更。
408:デフォルトの名無しさん
09/03/06 22:30:25
C#3.0以降なら
Click += (sender, e) => { MessageBox.Show("Clicked!") };
と書くべき
匿名メソッドと違って引数省略できないのが時々不便に感じるけど
409:デフォルトの名無しさん
09/03/06 22:52:26
匿名メソッドは List<T> 周りのメソッド眺めてみりゃどういう
感じに使うのかわかる気もするが…あえてイベントハンドラなら
一時オブジェクトに使う。WebClient とか
410:デフォルトの名無しさん
09/03/06 22:55:40
>>401
デバッグ用途で一時的に作ったようなボタンなんかだと、
それ用のイベントハンドラも短くなりがちになる。そこで、
Loadedイベントハンドラだけはxamlエディタで定義&割り当て
をしてもらって、そのLoadedイベントハンドラの中で
Button1.Click+=delegate{MessageBox.Show("Clicked!");};
って書いた方がゴミメソッドが増えなくて見やすいんだよね。
まあでも、書いたとおり、推奨はできない。
ただ、ある程度複雑なプログラムを書くと、デザイナもxamlも
あまり頼りにならなくて、コードでGUIをアレコレする必要が
出てくる場面は頻繁にある。特に動的な処理が必要な場合。
例えば、StackPanel1の子にButton1がなっているとして、
Button1のClickイベントハンドラで
Button1.IsEnabled = false;
Button Button2 = new Button() { Content = "Click Me!" };
Button2.Click += delegate {
Button1.IsEnabled = true;
StackPanel1.Children.Remove(Button2);
};
StackPanel1.Children.Add(Button2);
こんなの。これだと、Button2のVisiblityなりIsEnabledなり
をいじるイベントハンドラを書く方が自然なのでちょっと
人為的かな。
411:デフォルトの名無しさん
09/03/06 22:59:54
何の断りもなく当然のようにWPFw
初心者が混乱するよ
412:410
09/03/06 23:06:04
>>408
むしろ、その引数を省略できるという性質があるために、
引数を必要としないイベントハンドラの定義にはdelegate{}を
使っている。推奨はしない。あんまり、
void foo(object sender, EventArgs e){...}
みたいなのが増えるの好きじゃないんだよね、個人的に。
そんなわけだからイベントハンドラをメソッドとして作る場合にも
void Button1_Clicked(){
MessageBox.Show("Clicked!");
}
と引数なしのメソッドを書いて
Loadedイベントハンドラの中とかで
Button1.Click+=delegate{Button1_Clicked();};
とか書く事すらある。これも推奨はできない。
413:410
09/03/06 23:08:40
>>412と類似しているけれど唯一推奨できるのは、次のケースかな。
void 処理1(){
ほにゃらら
}
void 処理2(){
ほにゃらら
}
みたいな処理の単位であるメソッドがあって、それをボタンから
呼び出させる場合。
Button1.Click+=delegate{処理1();処理2();};
みたいに書く。
VBでもWindows FormsでもWPFでも、
入門書に書いてある事を実践すると、イベントハンドラに
何でも書くスタイルを身に着けてしまう人が多いけれど、
本来は処理を適当な粒度で分割したメソッドを定義して、
イベントハンドラはそれらを呼び出すだけの簡潔なもので
あるべき。
Model-Viewスタイルとか良くは知らない趣味プログラマだけど、
こんな感覚でやっています。
414:デフォルトの名無しさん
09/03/06 23:10:40
WPFに限った話をすると,
デザイナでイベントハンドラ追加するのがちょっとだけ面倒だったり
動的にコントロールを追加することが多かったり
基底クラスのイベントでもオーバーライドじゃなくてイベントハンドラ使うことが多かったりするから
Button1.Click+=delegateみたいなことは比較的よくやる
415:410
09/03/06 23:18:53
ごめん、なんか脇に逸れすぎてた気がする。匿名メソッドorラムダ式
を用いて処理を委譲する時の一番の利点は文句なしに「継続」だった。
でも、LINQ以外でうまい例を作れないや。
とりあえず、
void Sum10(){
int s=0;
for(int i=1;i<=10;i++){
s+=i;
}
Button1.Click+=delegate{
MessageBox.Show(s.ToString());
}
}
ってやって、どこかでSum10()を呼び出すと、Sum10からは
ちゃんと処理が戻るんだけど、その後Button1をクリックすると
sの値55が表示される、って事を知っておいて。
匿名メソッドで一番重要なのはこれなんだけど、脇に逸れ過ぎた。
非同期処理なんかをする場合には超超超〜重要なはずなので
誰か例を書いてくれ。
416:デフォルトの名無しさん
09/03/06 23:29:48
わかりづらいんであんまりそういうのは多用しない方がいいと思うよ
>>415の中でs++したりするとわけがわからなくなる(サンプルとしては面白いけどね)
ローカル変数を取り込めるメリットは,>>398のようなパターンが自然に使えること
417:デフォルトの名無しさん
09/03/06 23:36:52
引継でC#やる事になったんだけど、1ファイル5000行を越えるようなものがざらにあります。
一カ所直すのにも不要なものが目に付いて頭がグワングワンしてきます。
プロパティ、イベント、その他のメソッドという分類でファイル分割しようと思ってるんだけど、君らはどうしてるの?
418:デフォルトの名無しさん
09/03/06 23:40:42
#regionでよくね
419:410
09/03/06 23:45:31
うん、>>415は意図は何もないただのサンプル。
とりあえずUIの話の続きとして「継続」の利点を書いておくと
UI以外のスレッドで何か計算して、その結果を用いてUIを更新する場合、
匿名メソッドを使うのが一番素直に書ける。コードの流れがぶった切ら
れない的な意味で。
例えば
//UIと別スレッド
while(円周率の計算精度>閾値){
円周率の計算の途中経過をtempPiに代入
Window1.Dispatcher.Invoke((MethodInvoker)()=>{
Window1.Label1.Content=tempPo.ToString();
});
}
こういう場合にメソッド定義とInvokeの引数ありバージョンを使っていたら
訳がわからなくなる。
>>417
自分の場合は#region-#endregionで
・変数定義とコンストラクタ
・プライベートメソッド
・パブリックなメソッドとプロパティ
・(あれば)カスタム可能なメソッド、プロパティ
と分けている。Ctrl+M-M, Ctrl+M-O等のショートカットは知っておくと吉。
420:デフォルトの名無しさん
09/03/06 23:51:42
>>413
> 本来は処理を適当な粒度で分割したメソッドを定義して、
> イベントハンドラはそれらを呼び出すだけの簡潔なもので
> あるべき。
理念的にはその通りだと思うんだけど、若干反発も感じるのは
その基本に忠実な書き方をすると、ベタにイベントハンドラに書いた場合と比べて
「その処理」がイベントハンドラからのみ実行される処理だという明示性が
失われるんだよね。
421:デフォルトの名無しさん
09/03/06 23:59:16
>>420
多分、その、”「その処理」がイベントハンドラからのみ実行される”
という事を前提としたコーディングが、設計の柔軟な変更などを将来的に
阻害してしまう、っていうのが、Model-View-Controlerモデルとか
その派生系とかが繰り返し提案される理由なんじゃないかな。
シンプルなプログラムだと却って変な事になってしまう事が多いのも
確かだと思うけど。
422:419
09/03/07 00:09:11
419を1から100までの和を計算し、途中経過を表示するコードに書き直し
てみた。あと、MethodInvokerはWindows Formsのだから(デリゲート
だからシグネチャが正しいので通るけど)よくなかったのでActionにして
みた。このコードは、はじめのお題の、匿名メソッドの利用例としては、
”良い”利用例だと思う。他の方法だとめちゃめちゃごちゃごちゃになる。
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Thread sum100Thread = new Thread(new ThreadStart(sum100));
sum100Thread.Start();
}
private void sum100()
{
int s = 0;
for (int i = 1; i <= 100; i++) {
s += i;
this.Dispatcher.Invoke((Action)delegate{
this.Label1.Content = s.ToString("0000");
});
}
}
xamlは
<Window x:Class="WpfApplication1.Window1" ほにゃらら
Loaded="Window_Loaded">
<Label Name="Label1"/>
</Window>
だけ。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5377日前に更新/246 KB
担当:undef