2017-04-17 2 views
-1

私はC#とOOPの非常に初心者です。C#の関数から2つの変数を集計するような例外はありますか?

ここでは、C#の外部関数から2つの静的変数を集計しているうちに興味深いと感じています。

ここに私のコードです。

using System; 

namespace StaticFun 
{ 
    class StaticFun 
    { 
     public static int a; 
     public static int b; 

     public void count() 
     { 
      a++; 
     } 

     public void mount() 
     { 
      b++; 
     } 

     public static int getsum() 
     { 
      return a + b; 
     } 
    } 

    class Program 
    { 
     static void Main(String[] args) 
     { 
      StaticFun obj = new StaticFun(); 

      obj.count(); 
      obj.count(); 
      obj.count(); 
      Console.WriteLine("Value of a for obj : {0}.", StaticFun.a); 

      obj.mount(); 
      obj.mount(); 
      Console.WriteLine("\na = {0}\nb = {0}\nSum : {0}.", StaticFun.a, StaticFun.b, StaticFun.getsum()); 

      Console.ReadKey(); 
     } 
    } 
} 

このプログラムをコンパイルすると、次のような出力が得られます。 OBJのための

値:3.

= 3

B = 3

合計:3

I出力から最初の2つの値を理解することができ。しかし、bのために、それは2かもしれません!ではない? StaticFunクラスでは、関数public void mount()を使ってbの値を1増やしています.bは静的変数であるため、その初期値は0です。次に、その関数を2回呼び出した後の値は2になります。私はその事実を理解できません。また、私の前提として、合計は3 + 2 = 5かもしれません。しかし、それは変数aとbと同じ値を作った。

静的な動作が起こったと思いました。しかし、驚くべきことに、非静的変数に対しても同じ出力が得られました! 3.

= 3

B =:ここ

は私の第二のコードだけでなく

using System; 

namespace StaticFun 
{ 
    class StaticFun 
    { 
     public int a; 
     public int b; 

     public void count() 
     { 
      a++; 
     } 

     public void mount() 
     { 
      b++; 
     } 

     public int getsum() 
     { 
      return a + b; 
     } 
    } 

    class Program 
    { 
     static void Main(String[] args) 
     { 
      StaticFun obj = new StaticFun(); 

      obj.count(); 
      obj.count(); 
      obj.count(); 
      Console.WriteLine("Value of a for obj : {0}.", obj.a); 

      obj.mount(); 
      obj.mount(); 
      Console.WriteLine("\na = {0}\nb = {0}\nSum : {0}.", obj.a, obj.b, obj.getsum()); 

      Console.ReadKey(); 
     } 
    } 
} 

そして出力、OBJのための

値であり、 3

合計:3

私はこの事実を完全に誤解しています。私のコンセプトをそのアウトプットについて明確にする人はいますか?

答えて

8

問題は、あなたの加算ものではありません - それはあなたがそれを印刷する方法です:

Console.WriteLine("\na = {0}\nb = {0}\nSum : {0}.", StaticFun.a, StaticFun.b, StaticFun.getsum()); 

あなたが実際の行に同じオブジェクトを3回印刷します。あなたは括弧で数を増やす必要があります。

Console.WriteLine("\na = {0}\nb = {1}\nSum : {2}.", StaticFun.a, StaticFun.b, StaticFun.getsum()); 

この読み書式設定文字列の詳細については:ところでhttps://msdn.microsoft.com/de-de/library/system.string.format(v=vs.110).aspx

を、私は、文字列の補間を使用してお勧めしたい - それはそのような働きをしたい:

Console.WriteLine($"\na = {StaticFun.a}\nb = {StaticFun.b}\nSum : {StaticFun.getsum()}."); 

文字列補間について詳しく知りたい場合は、https://msdn.microsoft.com/en-us/library/dn961160.aspxをご覧ください。

+0

yawwそのC#6の一部と高いので、このいずれかを割り引くません! @ _ @ –

+0

@ShahShishir - FYIでは、C#の規約はメソッド名を大文字で始めることです。 – xr280xr

+0

ここで文字列補間はどのように機能しますか? 参考になれますか? :) –

2

はそれが今まで私の愚かな間違いだった...今、あまりにも

Console.WriteLine($"\na = {StaticFun.a}\nb = {StaticFun.b}\nSum : {StaticFun.getsum()}.");

+0

確かにありがとう:) – mvermef

関連する問題