C#
つまり型の定義を循環させないことで、実行パスの循環はまず解決される。再帰は局所的な、1クラスの中に留められる。ポインタの循環も悪性のものを根絶できる。 しかし、しかしだ。なぜ型の定義を循環させなくても工夫すればプログラムが普通に書けちゃうの…
ポインタは循環せざるを得ないとこはあるのだが、クロージャでの使用に留めるべきだろうと思う。クロージャなら暗黙に親への参照は持っているのだが本人はいじれないので問題は無い。クロージャがないならinterfaceのみの使用に留めるべきだという話になるだ…
ボタンがクリックされた時にウインドウをいじりたいなら、ポインタは循環する必要がある。子が親に直接作用するにはポインタが循環する必要がある。これは分かりやすい。 実行パスが循環する必要もある。関数が導入された時、実行パスの循環は局所的な繰り返…
C#やJavaを理解するためにもEffective C++を読む必要があるように思う。静的型に対する理解が深まる。しかし全然足りない。 なぜ型の定義が循環参照することが誤りであると言えるのか分かれば多分静的型の謎は全部解けるんじゃないかと思う。実行パスは循環…
C#のコア部分は3.0でほぼ完成していて、4.0にはちょっとした地道な改良が乗るだけだ。それでも変化としては結構大掛かりで、Javaなら大もめにもめて結局乗らず、C++なら10年後にようやく仕様が完成するぐらいの改良はやってると思う。C#は言語設計が身軽でい…
voidのメソッドはthisを返せばいいんだよ。return thisって書くのがめんどくさい。
スレッドのスタックサイズ設定を使ってスタックサイズを変えて実行してみた。 104万バイトだとすぐにスタックオーバーフローになり、105万バイトだと永遠に終わらなくなる。これはつまりスタックのメモリが足りなくなってるというわけではなく、1Mバイトを境…
一つの関数で一気にオブジェクトを復元しようとしている。15万行ぐらいなら動くのだが、20万行になるとスタックオーバーフローする。原因が良く分からない。ううむ。関数を分ければ解決するだろうか。しないような気がするなあ。 全部参照型なのだが、スタッ…
今気づいたけどC:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\JAあたりを探せば.NET Frameworkのドキュメントコメントがあるんだな。これを読んでコメントを移すあれをしたらいいんじゃないか。ソースコードのコメントを属性化するとかわけわかんないこと…
出来るだけパフォーマンスを良くしたいなと思ったらソースコードを生成するソースコードを生成するソースコードを生成するソースコードを書くはめになった。かなり混乱している。
復元をコンストラクタでやるとすると、よく考えたら循環参照するオブジェクトは作れないな。 そこをうまいこと実現する手練手管がないわけでもないがそんなもん自動化する価値があるとも思えない。循環参照は認めないが複数箇所に参照が出てくるのは認めると…
Reflectorで見たらobject.GetHashCode()してるだけじゃんか。参照型の(おおまかな)IDはobject.GetHashCode()で取れて、System.Runtime.CompilerServices.RuntimeHelpersのGetHashCodeを使えばoverrideも気にしなくて良くなるということかな。 というか良く見…
ソースコードによる自動シリアライズを書こう。最も引数の多いコンストラクタに、その引数名と同名の(or 最初を大文字にした)プロパティ/フィールドを入れて作成するソースコードを自動で作る。そのソースコードをコンパイルして実行することで元のオブジェ…
.NETアセンブリは循環参照できない。これは、小さなまとまりの中にないクラス同士のクラス定義が循環参照した時点で設計ミスだという思想に基づいている。 ポインタは循環参照してもかまわないが、クラス定義は循環参照してはいけない。この命題はおそらく常…
そういやparamsがまだ付いてないんだったけどparamsごときのために属性見に行くのは何か限りなくいやな感じがするんだよなあ。配列で100%代替可能でもある。多分自分が必要になったらつけるけど。
コメントを引き継ぐために、まずコメントを属性に変換し、コンパイルして実行時型にコメントの情報を与え、それを引き継ぐという形にした。その手順を自動化したかったんだけど、CSharpCodeProviderがC# 2.0までしかコンパイルできないようなので普通に無理…
更新した。http://pmoky.ame-zaiku.com/csharp.html 更新内容 委譲先から委譲元へのVisual Studio形式のコメントの自動引継ぎ機能を実装(Sample6を参照) それに伴って、コメント関係の仕様が全く新しくなった
.NETのSubStringってどういう処理なんだろう。stringは不変だからStartIndexとLengthを変えたコピーを作るだけの処理なのか。それともいちいち新しく作ってるのか。 ソースを見てみたけどばっちりコピーしてるな。SubString(0,length)の場合だけ自分自身を返…
委譲だとコメントを移行させるのが大変だ。問題はインテリセンスに表示できるかどうかだ。実際のところのアクセスはinterfaceにまかせてしまう手でいけるかな。interfaceのコメントなら実装が委譲だろうと失われない。ソースファイルがあれば、コメントを移…
更新した。http://pmoky.ame-zaiku.com/csharp.html 更新内容 コメント生成機能追加 MemberMapにMemberDataを書き換えて追加するオーバーロードを追加 型引数指定のジェネリッククラスの内部クラスで、外部クラスに指定した型引数が引き継がれない問題を修正…
遅延評価でわけわかんなくなる。
くそ、誰からも反応がないぞ。4日ぐらいかけて作ったのに。 存在すら忘れかけてた忍者のホームページも更新した。http://pmoky.ame-zaiku.com/ そしてバグが見つかった。5日目に突入だ。
C#でクラスを委譲するソースコードを自動生成するライブラリを作った。誰か使ってくれないかな。 http://drop.io/multipleinheritance#
Scalaにあるような、string Name{ get; }をもつクラスorインターフェースがなんでも入れられる型は、コンパイルが通れば型のエラーは起こらないという意味で静的型としての安全性は保たれている。 void SetName({ string Name{ get; } } item) { this.Name =…
良いクラスとは、そのクラスを使って作業した時に出来るコードが何をやっているか良く分かるコードになるクラスで、単一責任の原則とか拡張に対して開き修正に対して閉じるとかそんなんは全て瑣末事にすぎない。
LINQがあれば配列がデフォルトで書き換え可能である必要なんかないし、ListもDictionaryもAddとかやって容量増加処理を発生させる必要もない。つまりListもいらないからArrayとDictionaryだけでいい。副作用のない効率的なプログラミングが可能だ。for文みた…
この記法は絶対に必要だよなあ。こんな感じか。 public class Hoge : BaseClass { Point p; public Hoge( string name to public Name{ get; private set; }, //ゲットオンリープロパティ int id to id, //フィールド int x, int y, int z) : base(z) { p = …
並列実行時に安全であるかどうかドキュメントに記述されてるんだけど、多分別インスタンスのメソッドを並列に呼び出す分には安全だろうと思う。staticな何かとか共有されてる何かに依存していて、それが書き換わるのでない限りは安全だ。しかし本当にそうな…
外部から与えられたデータを使いやすいようにオブジェクトの構造を組み変えるため、こんなコードを書いた。 static zHinMoku[] Compose(zYearItem[] items, string suffix) { var flats = from yearItem in items from data in yearItem.Data from ps in dat…
クラス定義の依存とポインタの依存、大別すると二種類の依存がある。 class A { B b; } クラスAはBのポインタを持っている。これをポインタの依存と考える。この場合Bのクラス定義にも依存している。 コールバックの場合、 class A { Base base; public A(Ba…