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

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

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

Re[2]: コンストラクタ内の引数内で初期化されている処理


(過去ログ 140 を表示中)

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

■82035 / inTopicNo.1)  コンストラクタ内の引数内で初期化されている処理
  
□投稿者/ suneipu (1回)-(2016/12/02(Fri) 06:35:43)

分類:[C#] 

現在、http://qiita.com/2dgames_jp/items/00ee2ad52914753bfbb7

上記のURLにある不思議なダンジョンの作り方 というページを見ているのですが
わからないコードがあったので、こちらで質問させて下さい 

上記のサイトでは
public class Layer2D というクラスを作成しており、コンストラクタ処理で

   public Layer2D(int width = 0, int height = 0)
    {
        if (width > 0 && height > 0)
        {
            Create(width, height);
        }
    }

という処理をしています。
そして呼び出し元では

_layer = new Layer2D(WIDTH, HEIGHT);

上記のように記載されていました。

まず、コンストラクタ処理なんですが、パラメータで0初期化している理由が分かりません
今まで、呼び出し元では引数を渡し、受け取り側ではその引数をそのままパラメータとして受け取る
という処理しか見たことがなく

 Layer2D(int width = 0, int height = 0)

といわれても、具体的な内容及び、調査方法が分かりません

それから、呼び出し元で
_layer = new Layer2D(WIDTH, HEIGHT);

上記のように記載されているのですが
WIDTH、HEIGHT、共に、どこにも記載が見つからない、謎の変数でした

呼び出し元も受け取り側も、始めてみるパターンで、処理の概要が
つかめず、気になっております

コンストラクタの引数内で0初期化するコードの意味を教えてください








引用返信 編集キー/
■82036 / inTopicNo.2)  Re[1]: コンストラクタ内の引数内で初期化されている処理
□投稿者/ Azulean (740回)-(2016/12/02(Fri) 07:03:37)
No82035 (suneipu さん) に返信
> まず、コンストラクタ処理なんですが、パラメータで0初期化している理由が分かりません
> 今まで、呼び出し元では引数を渡し、受け取り側ではその引数をそのままパラメータとして受け取る
> という処理しか見たことがなく
>
> Layer2D(int width = 0, int height = 0)
>
> といわれても、具体的な内容及び、調査方法が分かりません

この辺はオプション引数などと呼ばれるもので、new Layer2D(); といったように引数を省略できるようにし、その際に使う値を書いているのみです。
呼び出し元で両方の引数とも指定されているのであれば、気にする必要はありません。


> それから、呼び出し元で
> _layer = new Layer2D(WIDTH, HEIGHT);
>
> 上記のように記載されているのですが
> WIDTH、HEIGHT、共に、どこにも記載が見つからない、謎の変数でした

ページ上に書いていないだけじゃないですか?
リンク先に「プロジェクト」としてソースコードも置いているわけですか、そこを気にするならそちらを読んだ方が良いでしょう。
引用返信 編集キー/
■82037 / inTopicNo.3)  Re[2]: コンストラクタ内の引数内で初期化されている処理
□投稿者/ 774RR (465回)-(2016/12/02(Fri) 08:43:51)
C++ 業界で言うところの default argument って奴ですね。
new Layer2D() とだけ書くと new Layer2D(0, 0) と解釈される
new Layer2D(23) とだけ書くと new Layer2D(23, 0) と解釈される
new Layer2D(34, 56) と書くと new Layer2D(34, 56) と解釈される

Visual Studio 2005 の C# では CS0241 既定のパラメータ指定子は使用できません
エラーになりましたが、いつから使えるようになったんでしたっけ? > 誰か詳しい人

WIDTH, HEIGHT に関してはオイラも同感、書いてないだけ。
記事の読者が好きに決めたらいいぢゃん、ってことで。

引用返信 編集キー/
■82038 / inTopicNo.4)  Re[1]: コンストラクタ内の引数内で初期化されている処理
□投稿者/ 魔界の仮面弁士 (997回)-(2016/12/02(Fri) 10:01:04)
2016/12/02(Fri) 10:19:39 編集(投稿者)

# VB 向けサンプルで セミコロン を消し忘れていたので修正

No82035 (suneipu さん) に返信
> public Layer2D(int width = 0, int height = 0)

これは C# 4.0 以降でのみ使える記述です。

オプション引数・名前付き引数と呼ばれるもので、
Visual Studio でいえば 2010 からの機能です。
Visual Studio 2008 以下では利用できません。
(.NET Framework のバージョンとは無関係)


> _layer = new Layer2D(WIDTH, HEIGHT);

『public Layer2D(int width = 0, int height = 0)』
なコンストラクタに対して、幅だけを指定して
呼び出す場合、このように記述する事ができます。

_layer = new Layer2D(WIDTH); // new Layer2D(WIDTH, 0) と同義


これだけならば、コンストラクタのオーバーロードでも代用できますが、
それと違うのは、高さだけを指定することもできるという点です。

_layer = new Layer2D(height: HEIGHT); // new Layer2D(0, HEIGHT) と同義


引数の順番を入れ替えて指定する事もできます。
_layer = new Layer2D(height: HEIGHT, width: WIDTH); // new Layer2D(WIDTH, HEIGHT) と同義



ちなみに VB においては、
 _layer = New Layer2D(WIDTH) ' New Layer2D(WIDTH, 0) と同義
 _layer = New Layer2D(height:=HEIGHT) ' New Layer2D(0, HEIGHT) と同義
 _layer = New Layer2D(height:=HEIGHT, width:=WIDTH) ' New Layer2D(WIDTH, HEIGHT) と同義
に加えて、C# には無い
 _layer = New Layer2D(, WIDTH) ' New Layer2D(0, WIDTH) と同義
という記述法も可能です。
引用返信 編集キー/
■82039 / inTopicNo.5)  Re[3]: コンストラクタ内の引数内で初期化されている処理
□投稿者/ 魔界の仮面弁士 (998回)-(2016/12/02(Fri) 10:18:36)
No82037 (774RR さん) に返信
> Visual Studio 2005 の C# では CS0241 既定のパラメータ指定子は使用できません
> エラーになりましたが、いつから使えるようになったんでしたっけ? > 誰か詳しい人

CS0241 は C# 4.0(Visual C# 2010) で廃止されましたが、
2010 以降であっても、[ビルド]-[詳細設定]-[言語バージョン]を
下記のいずれかに下げる事で、既定のパラメータ指定子が拒絶されます。

・ISO-1
・ISO-2
・C# 3.0

これは /langversion: に相当するオプションです。
なお、この方法で出力されるコンパイルエラーは CS0241 ではなく CS1644 です。
引用返信 編集キー/
■82052 / inTopicNo.6)  Re[2]: コンストラクタ内の引数内で初期化されている処理
□投稿者/ suneipu (2回)-(2016/12/02(Fri) 18:48:00)
おかげさまで、オプション引数について理解する事ができました。
検索しようにも、検索方法がわからず困っていたので、とても助かりました
みなさん、ありがとうございます。

それから
_layer = new Layer2D(WIDTH, HEIGHT);

の記述ですが、WIDTH、HEIGHT 共に定数:30が入っていました(ソースをDownして確認。)

※オプション引数がわからなかったので、WIDTH、HEIGHTの部分も
 何か特別な記述なのではないか?と勝手に思い込んでいました
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -