C# 初学者布尔程序澄清

C# 初学者布尔程序澄清,c#,random,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

考虑以下计划:

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<代码>随机=新随机()
为什么您必须将其初始化为
new Random()
,而
Random Random
不是创建Random类型的随机变量吗?

问题1:您是对的,这是一个冗余的初始化器,因为几行之后几乎立即设置了该值。事实上,通过组合声明和初始化,您可以稍微简化代码:

bool male = Convert.ToBoolean(random.Next(0, 2));
代码看起来像这样的一个原因是因为C#要求所有变量在使用前都必须初始化,而编写代码的人习惯于初始化所有变量。从:

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

问题2:随机
类型不是vlue类型,而是参考类型。这意味着引用类型变量的默认值总是
null
。换句话说,它什么都不是,它不存在,如果你试图使用它,你会得到一个异常。因此,必须通过使用运算符创建类的实例来初始化它

为什么线bool-male=false;缩写为false?这似乎与我无关,因为程序稍后会决定它是真是假

不一定是这样。你可以把它声明为

bool male;
 var random = new Random();
…这意味着它不会被初始化。虽然从技术上讲,它的内存位置将被设置为false,但编译器不会让你使用这个变量,除非你给它赋值;如果您想确保以后实际分配给它一些内容,这会很有帮助

Random Random=new Random()为什么必须将其初始化为new Random(),Random Random不创建Random类型的变量Random吗

如果它让你很烦恼,你也可以把它声明为

bool male;
 var random = new Random();
这对你来说似乎不那么多余

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

问题1。为什么线bool-male=false;缩写为false?这似乎与我无关,因为程序稍后会决定它是真是假

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

bool overtime = false;

if (hours > 40)
{
    overtime = true;
}
在上面的例子中没有其他的。如果
小时数
不超过40小时,则不属于加班

问题2。随机=新随机();为什么必须将其初始化为new Random(),Random 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
,但对象实例的类型为
ClassB
ClassA
,具体取决于条件。现在,无论它是
ClassA
还是
ClassB
的实例,都可以执行此操作:

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

这样做的好处更为明显:

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

list.Add(new ClassA());
list.Add(new ClassB());
foreach (var thisClass in list)
{
    thisClass.DoSomething();
}
List List=新列表();
添加(新的ClassA());
添加(新类b());
foreach(列表中的var thisClass)
{
this class.DoSomething();
}
在上面,我创建了一个
ClassA
列表,然后添加
ClassA
ClassB
的实例,然后循环它们并对它们调用
DoSomething()


试试看,你会发现这是多么灵活。

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

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

问题1:现场。这是一个冗余初始化。声明和初始化可以在
Random
行之后的同一行上完成。像这样的问题不应该在
http://codereview.stackexchange.com/
?@LucMorin Q1:不完全正确。如果值类型变量是局部变量,那么编译器会要求在引用它之前显式地为它赋值。好的,我会澄清这一点,但我的意思是,在提供的代码上下文中,它是多余的。是的,这是真的。这只是一个澄清的问题,这样人们就不会读到这篇文章并认为做
bool b是好的;如果(b){…}
是的,我已经对帖子进行了一些修改。