C#はnewせずとも宣言すればインスタンス化なのか?

taketoshi
記事: 222
登録日時: 14年前
住所: 日本国

C#はnewせずとも宣言すればインスタンス化なのか?

投稿記事 by taketoshi » 12年前

C#でインスタンス化せずに使用できるint型やstring型に疑問を抱いていた。
int型やstring型は宣言するだけでそのまま使用できる。Cの変数の使い方と変わらない。

ただ、デリゲート型やAllayList型を見ているとnewしてからその変数を使っている。
デリゲート型を変数宣言して += で関数を登録しようとしても
「未割り当てのローカル変数が使われました」とコンパイルが通らない。
これはnewせねば使えないのか?int型のように変数宣言(=インスタンス化)しただけじゃ使えないのか?と疑問に思っていた

未割り当てっていうから、なんかの数値が代入されていれば使えるのか。と思いnullを入れてみたら
何とコンパイルが通って通常通りの動きをしてくれるではないか。

int型もそうだけど、new = インスタンス生成じゃないんですね?
きっと、クラス変数を宣言した時にはすでにインスタンス化されているんでしょうね。
じゃあnew演算子っていったいなんなんだよと。さらに疑問が浮上してしまいました。

とモヤモヤしている質問のような日記です。
あー、コンストラクタ問題かー・・・・。(解決)

CODE:

namespace ConsoleApplication5
{

    public delegate void mydele();

    class Program
    {
        static void Main(string[] args)
        {

            EventClass _ev = new EventClass();
            EventMethod _evm = new EventMethod();

            //デリゲート型を宣言するだけ。newしない
            mydele md;


            md = null;

            md += _evm.Out;

            md();



        }

        class EventClass{
            public event mydele eventname;

            public void OnEvent(){
                if(eventname != null){
                    eventname();
                }
            }
        }

        class EventMethod{
            public void Out(){
                Console.WriteLine("EventTest");
            }
        }
    }
}
最後に編集したユーザー taketoshi on 2012年9月29日(土) 17:14 [ 編集 1 回目 ]

beatle
記事: 1281
登録日時: 13年前

Re: C#はnewせずとも宣言すればインスタンス化なのか?

投稿記事 by beatle » 12年前

C++をやってればよく分かることなんです。
newで生成しなければならないのは参照型。
newしないで使えるintは値型。

C/C++だと原則全部が値型なのでnewしなくていいのです。
参照(ポインタ)型にしたい場合はわざわざ*を付けます。

C#だとクラスは全部参照型なんです。だからnewしないといけない。intなどの構造体は値型なので、こちらはnewしなくていい。

アバター
せんちゃ
記事: 50
登録日時: 14年前

Re: C#はnewせずとも宣言すればインスタンス化なのか?

投稿記事 by せんちゃ » 12年前

C#におけるEventClass _evはC++で言うところのEventClass* _evみたいなもんです。
クラスは全て参照型です。
ArrayList(C#ではList)も当然インスタンス化にnewが必要です。
ただしint,short,byte,char,boolなどのデータは値型なので定義した段階でスタックメモリに積まれます。
stringは値型のような動きをしますが、初期化しないとぬるぽになるので参照型です。
しかも+=演算子で文字連結するとそのたびにインスタンス生成が発生するおまけ付きです。

構造体はnewすることもできますが、定義した段階でスタックメモリに乗る値型です。
デリゲートはnewしなくても使うことができますが、宣言の段階では+=は使えませんが=で関数を代入することならできます。
基本的に参照型はnewをしない限りインスタンス化はされません。

taketoshi
記事: 222
登録日時: 14年前
住所: 日本国

Re: C#はnewせずとも宣言すればインスタンス化なのか?

投稿記事 by taketoshi » 12年前

お二方ありがとうございます。
C++はやっていましたが、値型と参照型ってあまり意識したことありませんでした。
ポインタは参照型だな。くらいの認識でした。

int型ってクラスかと思っていたのですが構造体で定義されていたんですね。
猫C#を読み返してみましたが、構造体は値型だよって記述がありました。

疑問が解けました。ありがとうー。