考虑以下计划:
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
创建随机类型的随机变量?
答案 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();
}
,但对象实例的类型为ClassA
或ClassB
,具体取决于条件。现在,您可以执行此操作,无论它是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
,然后添加ClassA
和ClassA
的实例,然后循环它们并在其上调用ClassB
尝试一下,你会发现它有多灵活。
答案 3 :(得分:-1)
您的第一个问题的答案是在最初设置为false的代码中,因此不会产生歧义。 我们知道我们设置了什么是默认值,响应根据我们的变量设置发生。
在第二个问题中你问为什么我们使用“new”这个词,而不是简单的变量声明。 所以我们使用了“new”这个词,因为Random是一个类,为了创建Class实例,我们必须使用new这个词。 (这些不是简单的变量) 希望你有。