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){…}
是的,我已经对帖子进行了一些修改。