[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends:00075] Re: Fw: Re: Microsoft C#



======【 一休.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