2017-01-28 74 views
2

考慮下面的程序:布爾計劃的澄清初學者

using System; 

class BooleanType 
{ 
    static void Main() 
    { 
     bool male = false; 

     Random random = new Random(); 
     male = Convert.ToBoolean(random.Next(0, 2)); 

     if (male) 
     { 
      Console.WriteLine("We will use name John"); 
     } else 
     { 
      Console.WriteLine("We will use name Victoria"); 
     } 
    } 
} 

問題1.爲什麼行bool male = false;初始化爲假? 這似乎與我無關,因爲程序後來決定它是真的還是假的。

問題2. Random random = new Random();爲什麼你要初始化這個到new Random(),而不是Random random創建隨機類型的隨機變量?

+0

Q1:Spot on。這是一個冗餘初始化。聲明和初始化可以在隨機隨機行之後的同一行完成。 – spender

+2

不應該在'http:// codereview.stackexchange.com /'上詢問像這樣的問題嗎? –

+3

@LucMorin [Nope](http://codereview.stackexchange.com/help/on-topic) – DavidG

回答

3

問題1:你說得對,這是一個多餘的初始化程序,因爲值幾乎立即設置在幾行之後。

bool male = Convert.ToBoolean(random.Next(0, 2)); 

的一個原因代碼可能是它的方式是因爲在使用之前,所有變量都必須進行初始化C#任務和:其實,你可以通過合併的聲明和初始化略有簡化代碼編寫代碼的人習慣於初始化所有內容。來自official docs

C#中的局部變量在使用前必須初始化。

問題2:該Random類型是一個vlue類型,它是引用類型。這意味着引用類型變量的默認值始終爲null。換句話說,它不是什麼,它不存在,如果你嘗試使用它,你會得到一個異常。因此,您必須通過使用new運算符創建類的實例來初始化它。

+1

Q1:不完全正確。如果值類型變量是局部變量,那麼編譯器會強制在被引用之前爲其顯式賦值。 – Abion47

+0

好的,我會澄清一下,但我的意思是它在提供的代碼中是多餘的。 – DavidG

+1

是的,的確如此。這只是一個澄清點,所以人們不會讀這個,認爲做'bool b'是很好的;如果(b){...}' – Abion47

0

爲什麼是行bool male = false;初始化爲假?這對我來說似乎無關緊要,因爲該程序後來決定它是真是假。

它不是必須的。您可以聲明爲

bool male; 

......這意味着它不會被初始化。雖然技術上它的內存位置將被設置爲false,但是編譯器不會讓你使用這個變量,直到你給它賦值;如果你想確定你以後真的分配它,這可能會有幫助。

Random random = new Random();爲什麼你必須初始化這個新的Random(),不隨機隨機創建隨機類型的隨機變量?

如果你煩惱很多,你也可以將它聲明爲

var random = new Random(); 

這似乎你少冗餘。

向符號的random你通常將聲明一個type(在這種情況下,隨機類)的左側和等號的右側(「RHS」),你將通常用於創建提供的方法該類型的實例(在這種情況下爲new實例,儘管您可以將其分配給現有實例)。當您使用關鍵字var時,編譯器會在可能的情況下從RHS推斷出該類型。

0

問題1.爲什麼行bool male = false;初始化爲假?這對我來說似乎無關緊要,因爲該程序後來決定它是真是假。

在這種情況下,你是對的它是無關緊要的。但是在某些情況下,變量被初始化爲一個值,因爲這將是默認值。例如,有人可能會這樣做:

bool overtime = false; 

if (hours > 40) 
{ 
    overtime = true; 
} 

在上面沒有別的。如果hours不超過40則不會超時。

問題2. Random random = new Random();爲什麼你必須初始化這個新的Random(),不隨機隨機創建隨機類型的隨機變量?

實際上Random random不會創建變量。它聲明類型爲Random的變量名爲random。該變量默認爲null。一旦你這樣做:

Random random = new Random(); 

現在變量持有至實例Random參考。在某些情況下,人們這樣做,如果一個類從另一個類派生:

public class ClassA 
{ 
    public virtual void DoSomething() 
    { 
     Console.WriteLine("Hello"); 
    } 
} 

public class ClassB : ClassA 
{ 
    public override void DoSomething() 
    { 
     base.DoSomething(); 
     Console.WriteLine(" World!"); 
    } 
} 

ClassA a = null; 

後來在基地上的一些決定,他們可以這樣做:

if (somecondition) 
{ 
    a = new ClassB(); 
} 
else 
{ 
    a = new ClassA(); 
} 

這給你的多態性,因爲引用類型ClassA,但對象實例類型爲ClassBClassA,具體取決於條件。現在你可以做到這一點無論它是ClassAClassB一個實例:

a.DoSomething(); 

根據不同的情況下,a.DoSomething()要麼寫你好的Hello World!

List <ClassA> list = new List<ClassA>(); 

list.Add(new ClassA()); 
list.Add(new ClassB()); 
foreach (var thisClass in list) 
{ 
    thisClass.DoSomething(); 
} 

在上面我創建的ClassA一個List,然後加入ClassAClassB實例,然後循環他們,並呼籲DoSomething():當你做這樣的事情

的好處是更明顯在他們。

試試吧,你會看到這是多麼的靈活。

-1

對您的第一個問題的回答是在它最初設置爲false的代碼中,以便它不會產生歧義。 我們知道我們設置了什麼是默認值,響應根據我們的變量設置發生。

而在第二個問題中,您問我們爲什麼使用「new」這個詞而不是簡單的變量聲明。 所以我們使用了「new」這個詞,因爲Random是一個類,爲了創建Class實例,我們必須使用new這個詞。 (這些不是簡單的變量) 希望你有。