「C Sharp/変数」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
推敲
タグ: 2017年版ソースエディター
1 行
=== 変数の宣言 ===
==== 型推論 var ====
変数宣言する際、intやcharなどの具体的な型を指定しなくても、宣言時の初期化で具体的な数または文字列の初期化といっしょを省略せず型名を var をするだけ指定すれば、初期値から型を自動的に判断してく型が決定されます。なおvarとは「変数」を意味する英語 variable (ヴァリアブル)の略です。
 
:<syntaxhighlight lang="csharp" highlight="5,9,13,17">
38 行
</syntaxhighlight>
 
C#9 以降、下記のようにアプリケーションを表すクラスやMainメソッドを省略した簡略的な表記が使用できます。
 
C#9 以降、下記のように簡略できます。
:<syntaxhighlight lang="csharp">
var a = 4;
58 ⟶ 57行目:
</syntaxhighlight>
 
どちらにせよ、初期値のない状態でvarキーワードを使うとエラーになり、コンパイルできません。
 
どちらにせよ、初期値のない状態でvarキーワードを使うとエラーになり、コンパイルできません。
error CS0818: An implicitly typed local variable declarator must include an initializer
----
varキーワードは初期値から型を推論するキーワードなので、その初期値そのものが無いと推論できないからです。
エラー・コード CS0818: 暗黙のうちに型付けされたローカル変数の宣言子には、イニシャライザーを含める必要があります。
 
ほか、あるオブジェクトの型を取得するには、そのオブジェクトから .GetType() メソッドを使います。あるオブジェクトを指定してメソッドを使うには、<code>オブジェクト名.メソッド名()</code>の表記で実行します。
 
似たようなメソッドとして typeof() というのがありますが、これはクラスに対して用いるものと、記法が異なるので、このセクションでのtypeofの説明は省略します。
 
似たようなメソッドとして typeof() というのがありますが、これはクラスに対して用いるものと、記法が異なるので、このセクションでのtypeofの説明は省略します。<!ーーをぃをぃーー>
 
var は型を右辺から推論してくれますが、しかし、いちどある変数の型が指定されたら、C#では、その変数の型は変更できません。
 
==== 型を指定した宣言 ====
また、変数はvarを使わずとものようにC言語と同様の従来の記法で変数宣言することも可能きます。
 
:<syntaxhighlight lang="csharp">
78 ⟶ 76行目:
public class sample {
public static void Main(string[] args) {
int a = 17;
 
int a = 17;
Console.WriteLine(a);
Console.WriteLine( a.GetType() );
 
}
}
91 ⟶ 88行目:
</syntaxhighlight>
 
また、この例から分かるように int は System.Int32 と同じです。intは英語の整数integerの省略形です.
 
なお、 int とは、「整数」を意味する英語 integer インテジャーの略です。
 
C# では、変数の型は、宣言後は(型を)変更することはできません。他の動的プログラミング言語だとでは、宣言時に数値代入された変数にあとで後から文字列を代入できしまうのもあことが可能ですが、C#ではそういうのは不可能です。
 
C# で宣言されている変数は、原則、どことして何らかのクラスに属していなければならないりません。C++のようにクラス宣言の感覚でもしコード冒頭どこの class宣言もない部分先頭で変数宣言するとエラーになりが発生し、コードはコンパイルできされない。
 
:<syntaxhighlight lang="csharp">
107 ⟶ 102行目:
public class sample {
public static void Main(string[] args) {
Console.WriteLine(a);
 
}
}
117 ⟶ 110行目:
 
 
この仕様は明らかにC#やその手本のモデルであるJavaが採用した「カプセル化」などの概念を明確基づいておしたものであり、本質的な仕様であろう。「カプセル化」の概念とは、プログラムの部品をむきだしで管理すはせず、「カプセル」と言われるグループ単位でモジュール的・パッケージ的に管理することで大規模開発を効率化しようという1990~2001年頃の流行概念である。
「カプセル化』という概念は、1990年から2001年にかけて流行した概念で、プログラムの部品を裸の部品として管理するのではなく、『カプセル』と呼ばれるグループにモジュール化してパッケージ化して管理することで、大規模開発の効率化を図ろうというものです。
 
つまり、C#には、C言語でいうところの「グローバル変数」は無い。開発元のマイクロソフトの公式ドキュメントでも、そう明言されています[https://docs.microsoft.com/ja-jp/dotnet/csharp/fundamentals/object-oriented/ Microsoft Docs 日本語訳『C# のクラス、構造体、レコードの概要』2022/06/10] (2022年6月18日に確認)。
 
これはつまりC#では、すべての変数は、Javaと同じ様になんらかのクラスに属するメンバです。
 
もしC#でどこからもアクセスしたい変数を定義したい場合は(ただし同じソースコードファイル内)、下記コードのように単に public class でクラス宣言しておいて、必要に応じてクラス内の変数宣言で static 修飾子をつけて宣言すればいいだけである。
 
 
:<syntaxhighlight lang="csharp">
using System;
 
// このクラス testval がどこからでもアクセスできて書換え可能
public class testval{
public static int a = 3;
public static int b =15;
}
 
public class sample {
public static void Main(string[] args) {
 
Console.WriteLine(testval.a);
 
145 ⟶ 136行目:
Console.WriteLine(testval.a);
 
}
}
165 ⟶ 155行目:
<pre>
test.cs(5,19): error CS0825: The contextual keyword `var' may only appear within a local variable declaration
−−−−
test.cs(5,19): error CS0825:コンテキストキーワード `var' はローカル変数宣言の中でのみ使用可能です。
</pre>
 
170 ⟶ 162行目:
 
つまり、C++でいうところの、なんらかの「関数」内でないと(C#でいう「メソッド」内でないと)、varは使えません。
 
 
よく分からなければ、どこからでも出来るグローバル変数的なものをC#で作りたい場合、初心者のうちは、Main 関数内で変数宣言すれば、基本的に同じコードファイル中のどこからでもアクセスできるはずです。
177 ⟶ 168行目:
 
C++などと比べて一見すると面倒そうですし実際に初心者にとっての障壁のひとつですが、C#ではグローバル変数的にどこからでもアクセスできる変数を必要に応じてクラスでグループ化できるという、C++や標準Cにはない利点もあります。
 
そもそもクラスやその元ネタの構造体は、いくつもある要素のグループ化のためのものです。
 
 
==== 定数の宣言 ====
換え不能な変数を「定数」と言います。
 
値が変化しないのに「変数」というのも妙ですが、歴史的にそう言うのと、他によい言い回しがないので、そういうものだと割り切ってください。
 
C#で数を宣言するには const キーワードを使います。(C++ や 標準C と同じです。)
 
var と const は併用できません。<!--???-->
 
<code>const int a</code> のように型指定(int の部分)といっしょに const を宣言することで使えます。
197 ⟶ 185行目:
public class sample {
public static void Main(string[] args) {
 
const int a = 4;
Console.WriteLine(a);
 
// a = 7; // const変数を書換えようとしているので、コメントアウトしないとエラー
 
}
}
209 ⟶ 195行目:
4
</syntaxhighlight>
 
 
もし、上記コードから<code>const</code>のキーワード部分を消せば、コメントアウトした<code> a = 7; </code> をコメントアウトしなくても実行できるようになります。読者はそれぞれ試してください(ほぼ同じ内容の繰り返しになるので、説明は省略)。