「C Sharp」の版間の差分

ナビゲーションに移動 検索に移動
6,086 バイト追加 、 1 か月前
変数宣言で static 修飾子をつけると、どこからでもアクセスできるし、どこでアクセスして読み書きしても結果は共有されます。このため、static修飾をつけることで、標準C や C++ でいうグローバル変数のように使えます。
(変数宣言で static 修飾子をつけると、どこからでもアクセスできるし、どこでアクセスして読み書きしても結果は共有されます。このため、static修飾をつけることで、標準C や C++ でいうグローバル変数のように使えます。)
</pre>
 
このように、varには、型推論のほかにも、色々な意味があります。ローカル変数とはメソッド内(C言語でいう「関数」内)で定義されている変数のことです。
 
つまり、C++でいうところの、なんらかの「関数」内でないと(C#でいう「メソッド」内でないと)、varは使えません。
 
 
よく分からなければ、どこからでも出来るグローバル変数的なものをC#で作りたい場合、初心者のうちは、Main 関数内で変数宣言すれば、基本的に同じコードファイル中のどこからでもアクセスできるはずです。
 
グローバル変数的な管理用の public class などを別途に作るのは、慣れてきてからで十分です。
 
C++などと比べて一見すると面倒そうですし実際に初心者にとっての障壁のひとつですが、C#ではグローバル変数的にどこからでもアクセスできる変数を必要に応じてクラスでグループ化できるという、C++や標準Cにはない利点もあります。
 
そもそもクラスやその元ネタの構造体は、いくつもある要素のグループ化のためのものです。
 
 
=== タプル ===
C言語でいう「関数」に似た機能として、c#では「メソッド」がある。
 
関数との違いとして、メソッドは必ずどこかのクラスまたは構造体に所属していなければならない。つまり、必ずどこか開発元マイラスまたは構造体のブック中にてメフトの公式は宣キュメントでも、そう明言されることになる。どこています[https://docs.microsoft.com/ja-jp/dotnet/csharp/fundamentals/object-oriented/ Microsoft Docs 日本語訳『C# のクラスにも属してない むきだしのメソッドを宣言してもそれが構造体、レコード中に存在しているだけでコンパイルできずにエラーの概要』2022/06/10] (2022年6月18日なる確認)
 
つまり、必ずどこかのクラスまたは構造体のブロック中にてメソッドは宣言されることになる。どこのクラスにも属してない むきだしのメソッドを宣言しても、それがコード中に存在しているだけでコンパイルできずにエラーになる。
 
:うごくコード例<syntaxhighlight lang="csharp">
</syntaxhighlight>
 
 
なお、変数宣言で用いる var は、メソッド内でのローカル変数の宣言です。
 
ただし、Mainメソッドのブロック内のvarだけ、Mainメソッドよりも上位のメソッドは無いので結果的にMainメソッド内のvar宣言された変数があたかもグローバル変数のような働きをしますが、あくまで結果論です。
 
 
 
さて、C#のカプセル化などの理念により、すべての変数は、なんらかのクラスに所属していなければなりません。
 
変数宣言で static 修飾子をつけると、どこからでもアクセスできるし、どこでアクセスして読み書きしても結果は共有されます。このため、static修飾をつけることで、標準C や C++ でいうグローバル変数のように使えます。
 
 
下記コードでは、Mainメソッド以外のユーザ定義メソッドから書き換えをできるかのテストをしています。
 
:うごくコード例<syntaxhighlight lang="csharp">
using System;
 
// 変数管理用
public class testval{
public static int a = 3;
public static int b =15; // 使わないけど比較用
}
 
// ユーザ定義メソッド
class testclass{
static public void testfunc (){
// 書き換えテスト
testval.a = 403;
testval.b = 415;
Console.WriteLine("ユーザー定義メソッドにて書き換え実行");
}
}
 
// Mainメソッド
public class sample {
public static void Main(string[] args) {
 
Console.WriteLine("aは");
Console.WriteLine(testval.a);
//test inst = new test();
Console.WriteLine("Main側での書き換えテスト");
testval.a = 203;
//testval.b = 215;
Console.WriteLine(testval.a);
 
Console.WriteLine("これからユーザー定義メソッドでさらに書き換えを試みる");
testclass.testfunc();
Console.WriteLine("今、Mainに戻ったあとです");
 
Console.WriteLine("aは");
Console.WriteLine(testval.a);
}
}
</syntaxhighlight>
; 実行結果 :<syntaxhighlight lang="text">
aは
3
Main関数側での書き換えテスト
203
これからユーザー定義関数でさらに書き換えを試みる
ユーザー定義関数にて書き換え実行
今、Main関数に戻ったあとです
aは
403
</syntaxhighlight>
 
このように、staticで宣言された変数は、書き換えしたメソッドとは他のメソッドに移っても、書き換えの結果が保存されています。
 
「でもMainメソッドは、ユーザ定義メソッドの呼出元じゃないか? 呼出元以外ではどうなるんだ?」と疑問に思うなら、どうぞ試してください。結果は、Main以外の場所で結果確認をしても、上記コードと同様に書き換え結果は保存されます。
 
 
:うごくコード例<syntaxhighlight lang="csharp">
using System;
 
// 変数管理用
public class testval{
public static int a = 3;
public static int b =15; // 使わないけど比較用
}
 
// ユーザ定義メソッド
class testclass{
static public void testfunc (){
// 書き換えテスト
testval.a = 403;
testval.b = 415;
Console.WriteLine("ユーザー定義メソッドにて書き換え実行");
}
}
 
// 結果確認用メソッド
class testcheck{
static public void testfunc2 (){
Console.WriteLine("aは");
Console.WriteLine(testval.a);
}
}
 
// Mainメソッド
public class sample {
public static void Main(string[] args) {
 
Console.WriteLine("aは");
Console.WriteLine(testval.a);
//test inst = new test();
Console.WriteLine("Main側での書き換えテスト");
testval.a = 203;
//testval.b = 215;
Console.WriteLine(testval.a);
 
Console.WriteLine("これからユーザー定義メソッドでさらに書き換えを試みる");
testclass.testfunc();
Console.WriteLine("今、Mainに戻ったあとです");
 
Console.WriteLine("結果チェック用メソッドに移動します");
testcheck.testfunc2();
}
}
</syntaxhighlight>
; 実行結果 :<syntaxhighlight lang="text">
aは
3
Main側での書き換えテスト
203
これからユーザー定義メソッドでさらに書き換えを試みる
ユーザー定義メソッドにて書き換え実行
今、Mainに戻ったあとです
結果チェック用メソッドに移動します
aは
403
</syntaxhighlight>
 
このように、とにかくstatic宣言された変数は、標準CやC++でいうグローバル変数的に振る舞います。
 
=== クラス ===
23,090

回編集

案内メニュー