C#で、最も重要な「変数」について。

当ページのリンクには広告が含まれています。

 こんにちは、皆さん。今日は、プログラミングにおいて、最も基本的で、最も最初に知りたくて、最も重要な「変数」について、お話ししたいと思います。

 どんな言語を扱うにしても、先ず第一に知りたい情報が、「どんな変数が使えるのか?」ということです。

 それによって、その言語の「難易度」や「全体像」が、「おぼろげながらに見えて来る」と言っても、過言ではありません(笑)。

 正に、「言語における宝」と言えるでしょう。
 

 ですから、本来は、一等最初に説明した方が良いのですが、実は、初心者の方にとっては、「変数」のことよりも、先ず、全体像を体感することが、重要だと考えました。

 それによって、「分からない事」や「必要な事」が何なのか?という事が、より明確に体験できると思います。

 例えば、良くあるのが「分らないことが分らない」、という事があります。これは、私なりに思うのは、全体像が分からないからだと思います。
 

 ですから、当サイトでは、「オススメ記事」を、意味を理解するのではなく、只管愚直に行うことを、推奨しています。

 意味は、後からでも遅くはありません。

 それでは此処からは、少しずつ意味を理解して行きましょう。Let’s get started !.

目次

C#の変数は、「値(あたい)型」と「参照型」だけです。

 驚くかも知れませんが、この二種類の意味を確りと理解すれば、「C#」の50%を理解できたと言っても、過言ではありません(私の独断ですが)。

 しかし、それくらい重要な事なんです。

 ところが、この二種類を理解するというのは、簡単そうで簡単ではありません。恐らく、「一生もの」でしょうか?。スキルが上がれば上がる程、そうなります。「知れば知る程」という感じです。

 そして、重要なことは、「構造」を理解するのではなく、「使い方」を理解することです。

 しかし、深刻になる必要はありません。後で、初心者の方への「心構え」を、書いておきます(笑)。

先ずは、「値型」です。

 「値型」というのは、具体的には、「int、float、double、bool、struct、・・・」です。

 ヘルプビュアーの「検索(S)」で「値型」と入力すれば、詳しい説明を見ることができます。表題は、「値型 (C# リファレンス)」です。

 後で、ゆっくりと参照して置きましょう。「お気に入りに追加」しておくと、探し易いですね。今は、先に進みましょう(笑)。
 

STEP
「値型」の特徴。

 「値型」で最も特徴的なことは、「=は、値のコピーである」という事です。例えば、簡単に説明すると、

 b = a を行うと、b には a の「値のコピー」が行われます。数学でいうと、「代入」です。一見、当たり前のように思われるかも知れませんが、「参照型」ではそういう意味にはなりません。

 この時に、もし a = 5 (値)だとすれば、b には 5 がコピー(代入)されます。そして、「a = 5」 と「b = 5」というそれぞれ独立した変数が、誕生します。

 ですから、これを数学的に計算すると、「a + b * 2 = 15」になります。因みに、「*」は「掛ける」です。
 

 そして、それぞれ独立しているので、それ以降「a = 7」に変更しても、「b = 5」のままです。数学的に計算すると、「a + b * 2 = 17」になります。

 この事が、「値型」で最も重要なことなんです。この事を、確実に理解していないと、プログラムは読めません。

 もう一度、確認して置きます。重要なのは、「値(あたい)」という概念です。

STEP
「値型」の格納場所。

 次に、重要なことは、「値型」というのは、何処に格納されているのかという事です。基本的には「高速で入出力が行われる、スタック領域」に格納されます。

 更に、「GC(ガベージコレクション)」の影響を受けません(管理されていません)。

 因みに、「GC」というのは、日本語の意味でいうと「お掃除屋さん」ということです。何事においても、これは重要ですよね(笑)。
 

 これによって、「値型」の処理は、高速に完結します。これが、「参照型」とは、処理速度が大きく異なる要因です。

 ただし、一つ問題があります。それは「値型」というのは、「=」が常に「値のコピー」なので、その「バイト数のコピー」にコスト(時間)が掛かるということです。

 従って、どんな場合でも、「値型」が「参照型」より、高速だという分けではありません。コピーに掛かる時間があるからです。
 

 正確に計った分けではありませんが、多分「16バイト~32バイト」の範囲が、損益分岐点かも知れません(笑)。

 以上が、「値型」の主な特徴ですが、多分、初心者の方には、何が何だか全く分からないと思います。

 しかし、これ以上、言葉で説明しても、分からないものは分からないと思います。ですから、今後の実戦で体験してみましょう。

 逆に、その他の言語をしている方で、「C#」に興味のある方には、充分理解できたと思います。
 

歴史の付箋

 戦国三大武将の性格で、私的に一番性に合っているのは、「鳴かぬなら鳴くまで待とうホトトギス」で有名な、徳川家康ですね。

 次に、豊臣秀吉ですかね。そして、唯一無二で破天荒なのが織田信長です。

 徳川家康の場合は、天下統一した戦国武将でありながら、その精神は非常に謙虚ですね。調べた分けではありませんが、名言や格言を見て感じたこととして。

 例えば、
  「人の一生は、重荷を負て遠き道をゆくが如し。急ぐべからず」
  「及ばざるは過ぎたるよりまされり」
  「己を責めて人を責めるな」

 まだまだ沢山ありますが、有名な格言です。

次に、「参照型」です。

 「参照型」というのは、具体的には、「クラス(class)」です。マニュアルで、先頭に「class」と付いている型です。

 この型は、「値型」のように単純ではありません。非常に複雑で、基本的に大きな領域を必要とします。

 ヘルプビュアーの「検索(S)」で「参照型」と入力すれば、詳しい説明を見ることができます。表題は、「参照型 (C# リファレンス)」です。
 

STEP
「参照型」の特徴。

 「参照型」というのは、具体的にいうと、「Form クラス」等です。

 例えば、「TextBox クラス」、「Label クラス」、「PictureBox クラス」、「Button クラス」、「UserControl クラス」・・・があります。

 或いは、自作した「(public) class 名前 : 継承元 {・・・・・・・}」です。大凡、メンバー(プロパティ、メソッド、イベント)から、構成されています。

 大きい物から小さい物まで、色々あります。
 

 「参照型」というのは、プログラム上では、一般的に「クラス名 a = new クラス名()」というアロケーションを行って、インスタンスを作成してから使用します。

 この時に、データ(インスタンス)は、「ヒープ領域(C#が管理する広大なメモリー)」に格納されます。詳細は、分かりません。
 

 そして、最も重要なことは、「a =は、ヒープ領域にあるデータへの参照(アドレス)」だということです。つまり、a には「データへのアドレス」が入る事になります。

 ここが、「値型」と、決定的に違う所です。

 つまり、「b = a」とすると、b には a が保持している「データへのアドレス」が、代入されます。よって、a も b も「同じデータ」を、指示する事になります。

 因みに、「a + b * 2」は、出来ません(笑)。
 

 ですから、a.Text = “AAA” とした場合は、b.Text も「”AAA”」になります。そして、a.Text = “BBB” に変更すると、b.Text も「”BBB”」になります。

 この事が、「参照型」で最も重要なことなんです。この事を、確実に理解していないと、プログラムは書けません。

STEP
「参照型」は、マネージドコードの対象になります。

 次に重要なことは、「参照型」は、マネージドコードが管理する、メモリー領域の対象なので、「GC(ガベージコレクション)」の管理下に置かれます。

 「GC」の管理下に置かれるということは、基本的には、プログラマーはメモリーの管理や「変数」の後処理を、一切する必要がないという事です。
 

 「GC(ガベージコレクション)」が、適当なタイミングで、全てを処理してくれます。これが、「C#」の最も便利で開放的なところです。

 ですから、初心者の方は、インスタンスの後処理を考える必要は、全くありません。自由に、放置してください(爆笑)。
 

 ただし、「GC」がどのタイミングで行われるのかは、プログラマーには分かりません。

 ですから、グラフィックス等の大きなメモリーを扱う場合は、プログラマーが明示的に、リソースの開放を行う必要があります(必須)。この辺りは、経験則ですが重要です。

 以上が、「参照型」の主な特徴ですが、こちらも初心者の方には、何が何だか全く分からないと思います。
 

 しかし、これ以上、言葉で説明しても、分からないものは分からないと思います。ですから、今後の実戦で体験してみましょう。

 逆に、その他の言語をしている方で、「C#」に興味のある方には、充分理解できたと思います。
 

「諺」の付箋

 私は結構、「名言」とか「格言」とか「諺」が、好きなんです。特に、江戸時代に語られた事というのは、本当に、心に響きますね。

 例えば、「武士は食わねど高楊枝」とか(笑)。

 まぁその上で、「諺」というのは、本当に奥が深いんです。というのは、良い事ばかりではなく、悪い事もちゃんと「諺」に成っているんですね。
 

  •  例えば、「七転び八起き」という、未来に向けた応援歌があると思えば、「七転八倒」という、この上ない苦しみも表現しています(涙)。
  •  或いは、「三度目の正直」という、未来への応援歌があると思えば、「二度あることは三度ある」という、ネガティブなダメ出しもあります(笑)。
  •  更に、「千里の道も一歩から」という、未来に対する応援歌があると思えば、「悪事千里を走る」という、シャレにならない事もあります(汗)。
  •  又は、「類は友を呼ぶ」という、未来への期待があると思えば、「水に油」という、笑えない事もあります(哀)。


 しかしそれが、「諺」の「諺」たるところなんですね。 本当に、人生の有り難い「バイブル」とか、「道徳」ですね。

それでは、初心者の方への「心構え」です。

 先ず、大前提からお話しします。基本的に「マニュアル」に書かれている事が、正しいとは誰も保証していません。間違っている場合も、少なからずあると思います。

 そして、その検証は、「プロの方」や「スキルのある方」による、「前提」~「実際の使用」~「その結果」~「経験則」によって、解析されるものだと思います。

 或いは、「ハードウェア」との関係から、解析される場合もあります。更に、内部構造が「公開」されている場合もあります。

 これ等の事は、長い時間を掛けて、何れ「発表」されるのが、世の常です。しかし、それ等のことを初心者の方が行うのは、殆ど意味がありません。経験則がないので。

 ですから、「マニュアルに対する賛否」は、プロの方に任せて置きましょう(笑)。
 

STEP
その上で、「マニュアル」を信じましょう。

 という事なんです。「マニュアル」に書かれていることが、全てなんです。「構造」を理解したりすることよりも、「使い方」をマスターしましょう。

 例えば、プログラマーとして、良く気になる事としては、
 

  • 「クラス(class)」は、どういう構造をしていて、沢山作っても大丈夫なのでしょうか?。
  • 「スタック領域」は、何処にあるのでしょうか?。また、どれ位の大きさなのでしょうか?
  • 「ヒープ領域」は、何処にあるのでしょうか?。また、どれ位の大きさなのでしょうか?
  • 文字列の「string 型」は、唯一無二と書いてありますが、どういう構造なのでしょうか?
  • 「string 型」は、参照型なのに「文字列の比較」をしているのは、何故ですか?

 
 という所でしょうか。これ等のことは、マニュアルに書いていない場合もあれば、探すのに非常に時間が掛かる場合があります。

 まぁ、余談ですが、今時は「AI」があるので、質問してみると良いかも知れません(笑)。

 これ等のことは、現実問題として、カレント(現在)コンピューターの実装によって、変化する場合があります。

 また、それ等を知ったからと言って、どうこう出来る問題でもありません(笑)。それでは、上から一つ一つ見て行きましょう。
 

  •  大丈夫です。「クラス(class)」の全てが、別々にメモリー上に「アロケーション」されている分けではありません。
     
     必要な部分(差分)だけ、アロケーションされています(主に、プロパティー関係ですね)。それ以外は、最適化されています。
     
     当然、プロ中のプロが作成しているのですから、その辺りは、最もコストパフォーマンスが良くなるようになっています。抜かりはありません。m(_ _)m
  •  ハッキリ言って、分かりません。大きさも分かりません(激汗)。
     
     しかし、「スタックオーバーフロー」は、或ることを行うと、直ぐに発生します。それは、「再帰関数」を使う場合です。簡単に、エラーになります(笑)。
     
     回避する方法としては、「再帰関数」を使わないか、「Stack クラス(コレクション)」を使うことです。これは、良いですよ。
     
     それ以外で、「スタックオーバーフロー」になることは、滅多に無いと思います(C#では)。
  •  これも、ハッキリ言って、分かりません。一つ言えることは、「C#」が管理している「どこかの広大なメモリー」です。
     
     そして、GC(ガベージコレクション)によって、強力に管理されています。
     
     当サイトで扱うアプリケーションで、枯渇する事は無いので、安心してください(笑)。
  •  こちらも、ハッキリ言って分かりません。ただ、唯一無二だと詠っているので、メモリ上に同じものは無いという事です。
     
     つまり、この一文によって「string 型」は、「参照型」だということに成ります。
     
     このことが、「マニュアル効果」なんです。つまり、マニュアルに書いてある事柄から、その「素養」や「性質」や「挙動」を、推測するということです。
  •  これは、「オブジェクト(object クラス)」を、理解すると分かります。

     そのクラスの中にある、「Equals メンバー」を「Override」、又は「Overload」することによって、挙動を変えることが出来ます。

     多分、「string 型」は、ここで文字列の比較をしていると、予想できます。

 

 ということです。つまり、「構造」からマニュアルを理解するのではなく、出来るだけ「マニュアル」から構造を推測するという事です。

STEP
「使い方」を、発展させましょう。

 詰まり、どんな「使い方」があるのか?が、より「重要」になってきます。例えば、まだ発見されていない使い方が、あるかも知れません(笑)。

 「C#」のような完成された「高級言語」を扱う場合は、力業ではなく、簡単にできることは簡単に処理する方が、スマートだと言えます。

 それには、既存の「C#の実装」を、再利用するというのが、最も良いことだと思います。何故なら、それらは既に、プロによって「確認済み」だからです(一応)。

まとめ。

 如何でしたでしょうか?。今回は、「変数」の内容というよりも、「概要」とか「心構え」を書いてみました。

 というのは、「C#」というのは、基本的には「RADツール」なので、重要なことは出来るだけ「マクロ」で考えるという事です。

 例えば、「絶対的な処理速度」が要求される場合や、「OSに近い部分」のプログラミングをしたい場合は、「C++」等の低級言語を使うしかありません。

 これ等は、圧倒的に「速い処理」を行えますが、天文学的に非常に難しいです。初心者の方や、サンデープログラマーが、扱える範囲ではないと思います。

 ですから、全てが「同じ土台」ではなく、其々の「言語」の特性を活かした方法を、考慮しましょう。

 ただ、一つ朗報があります(笑)。「C#」というのは、「C++」よりは遅いですが、圧倒的に遅いという分けではありません。

 作り方にも依りますが、「1.5倍~2.0倍」位の範囲に、納まると思います。更に、「アンマネージドコード」も使えるので、結構速いですよ。

 ところで、「格言」や「諺」や「知恵」というのは、「人生における道徳」なので、今後もコーヒーブレイクとして、紹介して行こうと思います。

 それでは、この辺でごきげんよう。(^_^)/

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次