C#随机'新'关键字

时间:2017-03-19 08:20:32

标签: c# lua

大约一年前我开始涉足Lua,当我最近发现Unity时,我决定学习C#!

一切都非常令人兴奋,但是由于对Lua的理解非常有限,我真的很难理解这个概念:

// C# Random Number:    
Random r = new Random();
r.Next(5, 10)

据我所知,在Lua我会这样做:

-- Lua Random Number:
r =  math.random(5, 10)

我的问题是:

  1. 在C#中,为什么我必须创建此Random类的实例?为什么我不能只抓取一个随机值并将其从Random.Next(5,10)方法分配给'r',其语法与上面的Lua示例类似? (我问这个是因为我没有必要创建一个新的Console类实例来调用WriteLine方法......这就是我在这一点上感到困惑的原因。)

  2. 我注意到控制台的IDE自动完成显示:'public static class',而对于Random,它显示:'public class'。如果Console是“静态的”,那是不是我们不需要创建“新”实例的原因?

  3. 我读过这个:https://www.dotnetperls.com/static但是我错过了一些基本的拼图,所以仍然不完全理解这个概念。

    我正在寻求帮助来理解这个概念,所以请用一些例子回答问题(好像我是一个完整的初学者)。

1 个答案:

答案 0 :(得分:2)

这是由于Random类的工作方式。

类不是静态的一个原因是它可以有多个具有不同状态的实例。

Random使用种子生成伪随机数。如果使用相同的种子,将生成相同的数字。每个Random实例都有一个种子作为状态。如果Random是静态类,则只能使用一个种子,因为您无法使用不同的种子创建实例。使用无参数构造函数创建Random对象时,系统时间将用作种子。

Random作为非静态类允许客户端代码传递他们想要使用的种子,从而使API更有用。

  

我注意到Console的IDE自动完成显示:'public static class',而对于Random,它显示:'public class'。如果Console是“静态的”,那是不是我们不需要创建“新”实例的原因吗?

不,您不需要创建Console的新实例来使用其方法。事实上,你根本不能做new Console()!这是因为没有也不应该是多个控制台。计算机中只有一个控制台。它不需要维护多个状态,例如带有种子和东西的Random类。