C〓〓〓の中の定数、タイプの推断と作用の領域を簡単に話します。


一、定数はその値が使用中に変化しない変数です。変数を宣言して初期化する時、変数の前のキーワードconstで、その変数を定数に指定できます。
const int a=100;//aの値は変更できません。
定数の特徴:
1.定数は宣言時に初期化しなければなりません。その値を指定したら、これ以上修正できません。2.定数の値はコンパイル時に計算に使用できる必要があります。したがって、一つの変数から抽出した値は、定数を初期化することができません。このようにする必要があるなら、読み取り専用のフィールドを使うべきです。3.定数は常に静的であるが、定数の声明には修飾子staticが含まれる必要がないことに留意されたい。実際には許可されていません)プログラムでの定数使用は少なくとも3つの利点があります。
1.定数は、意味不明の数字や文字列を分かりやすい明瞭な名前で代用しており、プログラムが読みやすいようにしている。2.定数はプログラムをより簡単に変更します。例えばC〓〓のプログラムの中にSalesTaxの定数がひとつあって、この定数の値は6%です。今後、販売税率が変化したら、この定数に新しい値を賦与すれば、すべての税金計算結果を修正できます。全体の手順を調べる必要がなく、税率が0.06の各項目を修正します。3.定数の方がプログラムにミスがないようにしやすいです。もう一つの値をプログラムの定数に割り当てると、その定数はすでに一つの値があります。コンパイラはエラーを報告します。以下の手順のようです

namespace Test
{
    class ScopeTest
    {
        static int j=20;
        const string time= DateTime.Now.ToString();
        public static void Main()
        {
            int j=30;
            Console.WriteLine(j);
            return;
        }
    }
}
コンパイル後にエラーが発生しました。
error CS 0133:「Test.ScropeTest.time」に割り当てられた表現は定数でなければなりません。
上記のコードの中のtimeについては、必要であればreadonly属性を付与することができます。
定数と読み取り専用は、実際にはアクセスだけでは変更できません。しかし、彼らの赋価タイミングはあまり違っています。一般的な定数はコンパイルする時にすでに確定し、その定数値を与えられています。読み取り専用は実際には変数です。彼は運転時に動的に積載する必要があります。彼に値を与えます。この値は与えられたらもう変更できません。
二、タイプ推論タイプ推論は、varキーワードを使用する。変数の文法的な変化を宣言します。コンパイラは、変数の初期化値から「推論」変数の種類を推論することができます。
int someNumber=0
になります
var someNumber=0
someNumberはこれまでintとして声明していなかったとしても、コンパイラはsomeNumberがそのスコープ内にいる限り、一つのintとして確定できます。コンパイルした後に、上の2つの語句は等価です。
次は別の例です。

namespace Test
{
     class Program
     {
         static void Main(string[] args)
          {
               var name ="Bugs Bunny";
               var age=25;
               var isRabbit=true;

               Type nameType=name.GetType();
               Type ageType=age.GetType();
               Type isRabbitType=isRabbit.GetType();

               Console.WriteLine("name is type "+nameType.ToString());
               Console.WriteLine("age is type "+ageType.ToString());
               Console.WriteLine("isRabbit is type"+isRabbitType.ToString());
               Console.ReadKey();
    }
   }
}

コンパイル運転プログラム:(どのようにプログラムをコンパイルするかはC铅入門編を参照してください)
name is type System.String
age is type System.Int 32
is Rabbit is type System.Boolean
var定義変数を使うにはいくつかの規則が必要です。変数は初期化しなければなりません。そうでないとコンパイラは変数の種類を推定する根拠がありません。初期化器は空ではなく、表現の最初に置かなければなりません。初期化器を新しいオブジェクトを初期化器で作成しない限り、オブジェクトに設定できません。
三、変数のスコープ変数のスコープは、その変数にアクセスできるコードエリアです。一般的には、作用域を確定するためのルールがあります。
1.クラスがあるスコープ内にある限り、そのフィールドもそのスコープ内に存在します。ローカル変数は、その変数を宣言するブロックステートメントまたはメソッドが終了する閉じた括弧の前のスコープ内に存在します。3.for、whileまたは類似の文で宣言された局所変数は、この循環体内の大型プログラムとは異なる部分に同じ変数名を提供することが多い。変数のスコープがプログラムの異なる部分である限り、問題はありません。ぼやけることもない。ただし、同名の局所変数は同じ作用領域で2回宣言できないので、以下のコードは使えません。
int x=20
int x=30
次の例を見てみます。

using System;
namespace jb51
{
   pulic static int main()
   {
       For(int i=0;i<10;i++)
       {
           Console.writeLie(i);
       }
       For(int i=0;i>=10;i―
       {
           Console.WriteLine(i);
    }
   }
}
このコードは私たちの注意を引く必要があります。iは二回現れたが、彼らはいずれも循環体に対する変数である。
別の例:

public static int Main()
{
  int j=20;
  for(int i=0;i<10;i++)
  {
     int j=30;//
    Console.WriteLine(j+i);
  }
  return 0;
}
ここでエラーが発生します。変数jはforサイクルの開始前に定義されています。forループを実行する時はその役割領域にあるはずです。Main方法を実行した後、変数jは作用領域を超えました。第二のj(合法ではない)はサイクルの作用領域にあり、作用領域にMain方法の作用領域に嵌め込まれています。コンパイラはこの二つの変数を区別できません。
フィールドまたはローカル変数のスコープ衝突:場合によっては、同じ名前(ただし、完全に定義されている名前が異なる)、スコープ項目の2つの識別を区別することができます。このときコンパイラは第二の変数を宣言することができます。その理由は、変数間で基本的な区別があるということです。これは宣言をタイプレベルの変数フィールドとみなし、方法で宣言した変数を局所変数と見なしています。