布尔程序澄清初学者

时间:2017-01-28 02:44:10

标签: c# random

考虑以下计划:

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;初始化为false?  这似乎与我无关,因为程序后来决定它是真还是假。

问题2. Random random = new Random();为什么必须将其初始化为new Random(),而不是Random random创建随机类型的随机变量?

4 个答案:

答案 0 :(得分:3)

问题1 :您是对的,这是一个冗余的初始化程序,因为该值几乎会立即设置几行。实际上,您可以通过组合声明和初始化来略微简化代码:

main-entry file

代码看起来像它的方式的一个原因是因为C#要求所有变量必须在使用之前初始化,并且编写代码的人习惯于初始化所有内容。来自http://www.aerospike.com/apidocs/python/client.html#id1

  

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

问题2 bool male = Convert.ToBoolean(random.Next(0, 2)); 类型不是 vlue类型,它是引用类型。这意味着引用类型变量的默认值始终为Random。换句话说,它什么都不存在,它不存在,如果你试图使用它,你会得到一个例外。因此,您必须通过使用official docs运算符创建类的实例来初始化它。

答案 1 :(得分:0)

  

为什么行bool male = false;初始化为假?这似乎与我无关,因为程序后来决定它是真还是假。

不一定是这样。您可以将其声明为

bool male;

...这意味着它不会被初始化。虽然从技术上讲,它的内存位置将设置为false,但在为其赋值之前,编译器不会允许您使用此变量。如果你想确保以后实际分配它,这可能会有所帮助。

  

Random random = new Random();为什么你必须将它初始化为新的Random(),不随机随机创建随机类型的随机变量?

如果它困扰你很多,你也可以声明它为

 var random = new Random();

这对您来说似乎不那么多余。

在符号random的左侧,您通常会声明type(在本例中为Random类)和右侧(“RHS”)等号,您通常会提供一种方法来创建该类型的实例(在本例中为new实例,尽管您可以为其分配现有实例)。当您使用var关键字时,编译器将尽可能从RHS推断出类型。

答案 2 :(得分:0)

  

问题1.为什么行bool male = false;初始化为假?这似乎与我无关,因为程序后来决定它是真还是假。

在这种情况下,你是对的,这是无关紧要的。但在某些情况下,变量初始化为一个值,因为这将是默认值。例如,有人可能会这样做:

bool overtime = false;

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

在上面没有别的。如果hours不超过40,则不会超时。

  

问题2.随机随机= new Random();为什么你必须将它初始化为新的Random(),不随机随机创建随机类型的随机变量?

实际上Random random不会创建变量。它声明名为random的{​​{1}}类型的变量。默认情况下,变量为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(); } ,但对象实例的类型为ClassAClassB,具体取决于条件。现在,您可以执行此操作,无论它是ClassA还是ClassA的实例:

ClassB

根据实例,a.DoSomething(); 将编写 Hello Hello World!

当你做这样的事情时,好处更加明显:

a.DoSomething()

在上文中,我创建List <ClassA> list = new List<ClassA>(); list.Add(new ClassA()); list.Add(new ClassB()); foreach (var thisClass in list) { thisClass.DoSomething(); } List,然后添加ClassAClassA的实例,然后循环它们并在其上调用ClassB

尝试一下,你会发现它有多灵活。

答案 3 :(得分:-1)

您的第一个问题的答案是在最初设置为false的代码中,因此不会产生歧义。 我们知道我们设置了什么是默认值,响应根据我们的变量设置发生。

在第二个问题中你问为什么我们使用“new”这个词,而不是简单的变量声明。 所以我们使用了“new”这个词,因为Random是一个类,为了创建Class实例,我们必须使用new这个词。 (这些不是简单的变量) 希望你有。