[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends:00075] Re: Fw: Re: Microsoft C#
- To: jfriends@xxxxxxxxxxxxx
- Subject: [jfriends:00075] Re: Fw: Re: Microsoft C#
- From: uehara@xxxxxxxxxxxxx (UEHARA, Junji)
- Date: 28 Jun 2000 11:40:09 +0900
- Delivered-to: yasuyuki@timedia.co.jp
- Delivered-to: yasuyuki@javaopen.org
- Delivered-to: jfriends@b2.easyml.com
- In-reply-to: <200006280125.KAA29192@pop112.ocn.ne.jp> (yasuyuki@javaopen.org's message of "Wed, 28 Jun 2000 10:25:26 +0900 (JST)")
- References: <39583557.4D44EC5C@microhouse.co.jp> <200006280125.KAA29192@pop112.ocn.ne.jp>
- Reply-to: jfriends@xxxxxxxxxxxxx
- Sender: jfriends-owner@xxxxxxxxxxxxx
- User-agent: Nana-gnus/6.13.9 SEMI/1.13.5 (Meihō) FLIM/1.13.2 (Kasanui) Emacs/20.4 (i386-*-nt5.0.2195) MULE/4.1 (AOI) Meadow/1.10 (TSUYU)
======【 一休.COM 】======『 女性に優しいホテル予約サイト』 ======
プレゼント ♪スィートルーム宿泊券(ペアー):全国24ホテル分♪
♪商品券・CD券・デジカメ・Gショックなどなど♪
これだけあればどれか当るでしょう!! まだ登録してないの?
> 締切迫る→ http://www.ikyu.com/present/present007.htm
================================================================ PR =
上原と申します。
yasuyuki@xxxxxxxxxxxx writes:
> まだご本人に確認中なのですが、内容がとても興味深いので
> 勝手ながら代理投稿させていただきます。
>
> # 勝手に代理投稿してすみません>上原さん
すみません、MLメンバではなかったのですが、勘違いしてメールを送ってし
まいました。ただ、このことをきっかけとして、遠藤さんにメンバ登録してい
ただきました。MLメンバのみなさまにおかれましては、はじめまして。改め
ましてよろしくおねがいします。
yasuyuki@xxxxxxxxxxxx writes:
> > ・制御文 foreach: foreach (int i in array) ...
>
> うひ。ユーザ定義型についてもin ...が使えるんでしょうか。
以下のような配列演算子を再定義するためのindexer構文というのがあるので
すが、それを定義するとユーザ定義型にもinが使えるんではないかと思います
(希望的予測)。
private string[] items;
public string this[int index] {
get {
return items[index];
}
set {
items[index] = value;
Repaint();
}
}
> ・これって、「共通実行エンジン」で動くインタプリタなんでしょうか。
> コンパイラからはexeが出るようですが..。だとして、CPUネイティブな
> コードなのかそうではないのか。
> ・クラスライブラリがないということは、
> コレクションはVBからつかえるみたいな、変なActiveXコントロールの
> コレクション(コンテナ)を使うしかない?STLの立場は?
サンプル中に
using System;
using System.Collections;
:
ArrayList list = new ArrayList();
for (int i = 0; i < 10; i++)
list.Add(i);
WriteList(list);
こんなのがありました。コレクションが共通クラスライブラリ中にあるようです。
〜 〜 〜 〜
その他、(私の師匠である)久野さんのレポートに加える形で、C#の特徴をリス
トアップしてみました。勘違い、誤解などもあるかと思いますが、とりあえず。
---------------
●C++っぽいところ
---------------
・符号なし整数型あり(ushort, uint, ulong)
・gotoはある。ラベル指定breakは無い。
・unsafe宣言したメソッド中ではポインタが使える。
・enum,structあり。
・C++と同様なoperatorオーバーロードあり。ただし、[]の
オーバーロードはindexer構文で行う。
・virtual宣言しないとvirtualではない。
・多次元配列
int[,,] a3; // 3-dimensional array of int
-------------
●IDLとの類似?
-------------
・C++の参照型引数(Pascalのvar宣言)に相当するref, out構文。複数の
値を返すメソッドが簡単にかける。
(例)
void swap(ref int a, ref int b) { int t = a; a = b; b = a; }
void div(int a, int b, out int q, out int r) { q = a / b; r = a % b; }
・宣言にさまざまなアトリビュートを付加できる。
(例)
[Help("http://www.mycompany.com/…/Class1.htm")]
public class Class1
{
[Help("http://www.mycompany.com/…/Class1.htm", Topic = "F")]
public void F() {}
}
・stackalloc指定するとスタック上に動的にオブジェクトを割り付けられる
(alloca)。
(例)
int* fib = stackalloc int[100];
---------------------
●C++ともJavaとも違う点
---------------------
・28桁の正確な10進数型 decimal(BCD?)を持つ
・すべてがオブジェクト。数値3もメソッドを持っている。すべてのオブジェ
クト型の基底となる「object」型がある。しかし、効率上のペナルティはな
い。値を持った基本型を便宜的にobject型に代入できる(boxing, unboxing)。
(例)
Console.WriteLine(3.ToString());
・プロパティ構文(getter, setterメソッドを定義する専用の構文)
(例) public class Button
{
private string caption;
public string Caption {
get {
return caption;
}
set {
caption = value;
Repaint();
}
}
}
・独自のクラスライブラリは持たない。その代わりに、Visual Basic や
Visual C++ のような言語によっても使われる共通のクラス・ライブラリを
使用する。
・派生クラスでメソッドを上書きする場合には override 宣言が必須
・式の評価でオーバーフローチェックをするかしないかを選択できる
checked, unchecked構文
(例)
static void Main() {
int x = 100000, y = 100000;
Console.WriteLine(unchecked(x * y));
Console.WriteLine(checked(x * y));
Console.WriteLine(x * y);
}
・foreach文がある。
(例)
foreach (int i in array) { ... }
・可変引数メソッド
(例)
public static void WriteLine(string s, params object[]args) {...}
:
int a = 1, b = 2;
Console.WriteLine("a = {0}, b = {1}", a, b);
------------
●C++との違い
------------
・structはclassの一種ではない。structは継承できない。
・デストラクタがある。しかしGCによって自動的に呼ばれるので、
実質的にfinalizerと同じ。
・テンプレートはない。
・unionは無い。
------------
●Javaとの類似
------------
・intは32ビット。char、stringはunicode。
・基本的にはガーベジコレクションによる自動メモリ管理。しかし、明示的に
メモリ管理を行いたいときはunsafeとしてメソッドを定義し、fix構文でオ
ブジェクトを固定することでガーベジコレクタを阻止しつつ明示的にメモリ
管理を行うことができる。
・synchronizeと同様にmutexを利用するlock構文。
・Javaでいうnativeに相当するexternメソッド。
・前方参照のためのプロトタイプ宣言は必要ない。ソース上の後のほうにある
メソッドを前の方から呼び出せる。
・#includeはない。#define, #ifdefはある。#ifの代わりに、条件属性
というのも使用できる。
(例)
[conditional("DEBUG")] public static void Msg(string msg)
{
Console.WriteLine(msg);
}
}
・Javaと同様のInterfaceがある。Javaと同様にclassは多重継承
できないがinterfaceは多重継承できる。
・Javaと同じ「配列の配列」定義構文
(例)
int[][][] j3; // array of (array of (array of int))
・JavaDocのようなドキュメントコメントを書ける。但しxmlでかくとのこと。
・継承を禁止するfinalクラスの代わりに「sealedクラス」を使う
・親クラスを指定する「super」の代わりに「base」を使う
・instanceof演算子の代わりの「is」キーワード(delphiのパクリじゃ)。
・ダウンキャスト用の(dynamic_cast<>演算子)「as」キーワード。
------------
J++との類似
------------
・Delegateと、eventの定義。
(例)
public delegate void EventHandler(object sender, Event e);
public class Button
{
public event EventHandler Click;
(EventHandler Click) ;
public void Reset() {
Click = null;
}
}
〜 〜 〜 〜
昨日から、この言語はいったい何だ、ということを考えていたのですが、「Java
もどき」というのは少なくとも技術的には違うな、という気がしてきました。
C++の欠点を、最新の言語技術や研究成果から正すと、JavaやC#が似通ってし
まうのはしょうがないことです(無理やり変えてる部分もある気がしますが)。
C#は、Javaとは違うバランス感覚に基づいて設計されたC++の改良版という気
がします。
・C#はネイティブコードを最初から生成する(たぶん)ことで、ンタイムコン
パイルのコストを回避する(クロスプラットフォーム性は失われる)。
・バイトコードベリフィケーションを回避し起動を高速化する(安全性は低下
する)。
・Javaではクラスファイルがコンパイル時・実行時の両方で使用される2つの
用途があるが、C#ではランタイム用(.exe)をコンパイル時に必要な情報から
分離し最適化することで実行コストを削減する。
・「CやC++でできてC#でできない」ことはないようにする。ポインタ演算とか。
ほんとにC#がネイティブコードを吐くのかはじつは私は知らないのですが、た
ぶんそうなんじゃないかと推測しています。つまり、Javaの明快な記述性と
C++の起動速度を持つ言語です。Windowsプログラマーにとっては、今後はC#が
魅力的で現実的な選択肢になるんじゃないかなあと思います(がいかがでしょう)。
--
§NTTS○FT 技術開発部エレクトロニックコマース技術センター 上原 潤二 §
PGP Key fingerprint = B7 C0 CB 1F 1C 88 69 2A 25 36 8A EE 93 A3 61 72