C# 的随机数 'new' 关键字

大约一年前,我开始涉猎 Lua,最近发现了 Unity,便决定学习 C#!

一切都很激动人心,但由于我的 Lua 知识非常有限,我对这个概念感到困惑:

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

据我回忆, 在 Lua 中只需这样做:

-- Lua 随机数:
r =  math.random(5, 10)

我的问题是:

  1. 在 C# 中,为什么我要创建这个 Random 类的实例?为什么我不能直接从 Random.Next(5, 10) 方法中获取一个随机值并将其分配给'r',并采用与 Lua 示例相似的语法?(我之所以这样问是因为我不需要创建 Console 类的新实例来调用 WriteLine 方法... 这就是我在这个点上感到困惑的原因)。

  2. 我已经注意到 IDE 自动完成 Console 显示: 'public static class',而对于 Random,则显示: 'public class'。如果 Console 是 '静态的',那么我们不需要创建一个 '新' 实例,这是原因吗?

我读过这个: https://www.dotnetperls.com/static,但我还缺少一些基本的知识,所以仍然不完全理解这个概念。

我希望在理解这个概念方面得到帮助,请用一些例子回答问题(就像我是一个完全的初学者一样)。

点赞
用户5133585
用户5133585

这是由 Random 类的工作方式所决定的。

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

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

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

我注意到 IDE 自动完成功能会显示 Console 的 'public static class',而 Random 则显示 'public class'。如果 Console 是静态的,那是不是我们就不需要创建一个新的实例了?

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

2017-03-19 08:49:49