C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: C#初心者:C#のnewの必要性について


(過去ログ 103 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■61585 / inTopicNo.1)  C#初心者:C#のnewの必要性について
  
□投稿者/ hana (1回)-(2011/08/20(Sat) 17:16:51)

分類:[C#] 

二日前からC#について学習しているのですが、C#ではどのような理由でインスタンス作成時に
変数宣言
変数名=new クラス名()
という手順を踏むようなったかが分かりません。

C++であれば、変数宣言と同時にインスタンスが作成されますが、この方がコードが見やすく、コードを入力する手間が省けるので優れている気がします。

どのような理由からC#では変数宣言後に、newを使用するという事になったのか教えていただけないでしょうか。


引用返信 編集キー/
■61588 / inTopicNo.2)  Re[1]: C#初心者:C#のnewの必要性について
□投稿者/ こんぽ (1回)-(2011/08/20(Sat) 22:22:10)
2011/08/21(Sun) 01:09:24 編集(投稿者)

No61585 (hana さん) に返信
> どのような理由からC#では変数宣言後に、newを使用するという事になったのか教えていただけないでしょうか。

1. オブジェクトの作成に何故newを用いるのか
2. C#の言語設計としての話
質問の意図がどちらなのか判断できませんが、とりあえず:

1.
C++でnewを使うのと意味は同じ。C#でクラスは参照型なのでメモリを動的に確保しないといけません。

new 演算子 (C# リファレンス)
http://msdn.microsoft.com/ja-jp/library/fa0ab757.aspx#Y240
構造体のような値型オブジェクトはスタック領域に作成され、クラスのような参照型オブジェクトはヒープ領域に作成されます。
どちらの型のオブジェクトも自動的に破棄されますが、値型に基づくオブジェクトは、スコープの適用範囲の外になると破棄され、
参照型に基づくオブジェクトは、そのオブジェクトへの最後の参照が削除された後に随時破棄されます。

2.
一応参考に。

クラスと構造体 (C# プログラミング ガイド)
http://msdn.microsoft.com/ja-jp/library/ms173109(v=VS.90).aspx

C# の特徴(C++、Java 利用者向け)
値型と参照型
http://ufcpp.net/study/csharp/ab_csspec.html#ref

「言語解説」的な書籍がオライリーやマイクロソフトが出版しているようですので、言語設計というか設計思想に関してはそれらを探した方が良いかもしれません。

#追記
自分が質問の内容を勘違いしてた。文法/書法としての話ですね。なのでこの内容はズレてました。
引用返信 編集キー/
■61589 / inTopicNo.3)  Re[2]: C#初心者:C#のnewの必要性について
□投稿者/ 逆運の覇者 (55回)-(2011/08/21(Sun) 00:23:05)
Stream s;

try
{
    s = new Stream("a.txt");
}
catch(Exception)
{
}
finally
{
    s.Close();
}

のような記述をするためではないかと推測します。
以下のようにtry句で宣言をすると
スコープが違うためにcatch句、finally句で変数sを参照することができません。

try
{
    Stream s = new Stream("a.txt");
}

宣言とインスタンス作成は一行で記述可能ですよ。

引用返信 編集キー/
■61590 / inTopicNo.4)  Re[3]: C#初心者:C#のnewの必要性について
□投稿者/ hana (3回)-(2011/08/21(Sun) 13:27:51)
>>こんぽさん
 質問の意図が伝わりづらく済みませんでした。多分、言語設計的な意味だと思います。
 クラスの宣言について考えた時、クラスの変数宣言をした時点で、次にnewによりメモリを確保することは明らかなのだから変数宣言をしたら内部的にnewをするようにすれば良いのではないかと考えたためです。
 C#の参照型では「変数宣言だけして、インスタンス化はしない」というようなことが無い限りは上の様にすればいいのではないかと考えました。
 どんな時に「変数宣言だけして、インスタンス化はしない」ということが求められるか教えていただけると助かります。

>>逆運の覇者
 サンプルコードしか見ていなかったため、変数宣言と同時にnewを使ってインスタンスを作成出来ることに気がつきませんでした。これから、積極的に使って行こうと思います。
引用返信 編集キー/
■61592 / inTopicNo.5)  Re[4]: C#初心者:C#のnewの必要性について
□投稿者/ こんぽ (2回)-(2011/08/21(Sun) 14:59:09)
2011/08/21(Sun) 15:04:18 編集(投稿者)
> 変数宣言をしたら内部的にnewをする
仮にこういう実装だとしたら、インターフェイス等を使用する際に問題があるかと。

interface IInterface // 適当なインターフェイス
class Data:IInterface// インターフェイスを継承 + 実装をする

Data data; // Data型がnewされる。OK
IInterface obj1 = new Data(); // Data型がnewされてIInterface型として使用できる。OK
IInterface obj2; // 実装が無いのでインスタンス化できない。NG


これとは別に、C++で考えると次の様になるはず。
Data data; // OK
IInterface* obj1 = new Data(); //OK
IInterface  obj2; // NG VC2010では、error C2259: 'IInterface' : 抽象クラスをインスタンス化できません。
IInterface* obj3 = NULL; // OK。 C++0x/11ならnullptrの方が良い?


> 「変数宣言だけして、インスタンス化はしない」
何か遅延評価的な場合とか?
ちょっと違うかもしれませんが:

class Data1
{
    Data data;

    Data func()
    {
        if (data == null)
        {
            data = new Data();
        }
        return data;
    }
}

class Data2
{
    Data data = new Data();
    
    Data func()
    {
        return data;
    }
}

引用返信 編集キー/
■61599 / inTopicNo.6)  Re[4]: C#初心者:C#のnewの必要性について
□投稿者/ Azulean (826回)-(2011/08/21(Sun) 18:28:08)
No61590 (hana さん) に返信
>  質問の意図が伝わりづらく済みませんでした。多分、言語設計的な意味だと思います。

言語設計の選択の理由は C# の生みの親(Anders Hejlsberg)に聞くか、彼が語った言葉を探すかしないと、知ることができません。
いくつかの事実から推測することはできるかもしれませんが…。

入門書にはまず書いていないでしょう。


>  クラスの宣言について考えた時、クラスの変数宣言をした時点で、
> 次にnewによりメモリを確保することは明らかなのだから変数宣言をしたら内部的にnewをするようにすれば良いのではないかと考えたためです。
>  C#の参照型では「変数宣言だけして、インスタンス化はしない」というようなことが無い限りは上の様にすればいいのではないかと考えました。
>  どんな時に「変数宣言だけして、インスタンス化はしない」ということが求められるか教えていただけると助かります。

C++ でもポインタ変数がありましたよね?
C# の参照型も似たようなことと考えられませんか?

インターフェースが一例として挙がっていますが、ポリモーフィズムを使ったコードを書いていれば、どこかに出てくるでしょう。
(ファクトリーメソッドかもしれませんが)
引用返信 編集キー/
■61637 / inTopicNo.7)  Re[5]: C#初心者:C#のnewの必要性について
□投稿者/ hana (4回)-(2011/08/24(Wed) 18:47:10)
日が空いてしまい済みません。
当初の疑問を解決することができました。

こんぽさん
逆運の覇者さん
Azuleanさん
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -