平々毎々(アーカイブ)

はてなダイアリーのアーカイブです。

Re: 不完全にしてかなり言葉足らずな比較プログラミング言語学

不完全にしてかなり言葉足らずな比較プログラミング言語学 - 西尾泰和のはてなダイアリー

C#はこんな感じか?
(追記)id:nagakura_eil:20100726:p1 id:ufcpp ありがとう。
元記事はネタが増えてるな。

if(x = 0)

Javaと一緒。x = 0はint、条件式はboolだから型エラーだよ派。

値渡し、参照渡し

C#では参照型と値型があるが、どっちも値渡しがデフォルト(参照型は参照の値渡し、値型は値渡し)。
でも変数の参照を渡すこともできる(ref/outパラメータ)
ついでに言えばポインター型もある(unsafeコンテキストで使える)。

値の範囲の定義

Javaと一緒。もちろん決まってます。

配列

Javaと一緒。ファーストクラスのオブジェクト。範囲外へのアクセスは例外を投げる。

関数へのポインタ

リフレクションとはまた別に、メソッドもしくは匿名メソッドへのデリゲートという形で存在する。
変数に代入したり、メソッドの引数や戻り値に使うことも可能。

関数呼び出しの括弧

たとえ引数がなくても括弧が必要派。

演算子オーバーロード

演算子の多重定義が可能。でもだれも乱用しない

多重継承

Javaと一緒。実装を持ったクラスの継承は1つまで。

GC

普通はGCを使うけどアンマネージコードとの相互運用に必要ならAllocHGlobal/FreeHGlobalもできるよ派。

変数の初期化

Javaと一緒。初期化されていない(値がなんだかわからない)変数の存在は危険なバグのもとであり許してはいけない、勝手に初期化しよう派(追記: JavaC#も、未初期化のローカル変数を使おうとするとコンパイルエラー)。

グローバル変数

Javaと一緒。public staticなフィールドで代替する派。

整除の丸め方向

Javaと一緒。常に0方向に丸める。

x / 0.0

Javaと一緒。符号付きInfinity。

0xxx型の8進法リテラル

ない。リテラルは10進と16進だけ。どうしても8進リテラルが良ければ文字列で定義し、整数に変換する。

long intのリテラルに小文字のエルを許す

許さない派。大文字で書けという話(追記: 小文字だとコンパイル時に警告される)。

整数演算の結果がintの範囲を超えたときに自動的に表現力の大きい型に変更する

Javaと一緒。勝手に変換するのはよくない派。

変数への再代入を許すかどうか

Javaと一緒。再代入させたくないものだけconstとかreadonlyとかつけたらいいじゃん派。

演算子の優先順位について

Cと一緒。x == y & z が (x == y) & z となる。

比較演算子の連続について

Pythonみたいなことはできない。

単項演算子のマイナス

Haskellみたいなことはできない。

ループ

ループをするにはforとかwhileとかgotoとかいろいろな方法があるよ、だけどループ使わないことも多いよねLINQがあるし派。

空リストの型

ジェネリックリストならコンパイル時にも実行時にも型は決まってる派。

インデントと実際の構造の不一致

Cと一緒。プログラマが気をつけるか、braces {}を付けろ&正しくインデントしろというコーディング規約で回避する派。

レシーバの受け取り方

Javaと一緒。レシーバ自体をどうこうしたい時にはthisに入っているよ派。

文字列オブジェクトは破壊的に変更できるか?

Javaと一緒。いいえ。

文字列と数値を自動変換するか?

Javaと一緒。文字列への変換はしてもいいんじゃない?派。
ただしユーザー型には変換演算子オーバーロードを定義できる。これを使うといろんな型へ暗黙の変換をすることが可能。でもだれも乱用しない。

1/2は何になる?

整数の0だよ派。

オブジェクト指向

参照型も値型もオブジェクトだよ。クラスや構造体はインターフェースを実装することもできるけど、継承はクラスにしかできないよ派。

真偽値

真偽値リテラルtrue/false以外にも、true演算子/false演算子オーバーロードすればいいよ派。

配列の範囲外アクセス

Javaと一緒。例外を投げる派。