2017-01-28 70 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这个词。 (这些不是简单的变量) 希望你有。