大约一年前我开始涉足Lua,当我最近发现Unity时,我决定学习C#!
一切都非常令人兴奋,但是由于对Lua的理解非常有限,我真的很难理解这个概念:
// C# Random Number:
Random r = new Random();
r.Next(5, 10)
据我所知,在Lua我会这样做:
-- Lua Random Number:
r = math.random(5, 10)
我的问题是:
在C#中,为什么我必须创建此Random类的实例?为什么我不能只抓取一个随机值并将其从Random.Next(5,10)方法分配给'r',其语法与上面的Lua示例类似? (我问这个是因为我没有必要创建一个新的Console类实例来调用WriteLine方法......这就是我在这一点上感到困惑的原因。)
我注意到控制台的IDE自动完成显示:'public static class',而对于Random,它显示:'public class'。如果Console是“静态的”,那是不是我们不需要创建“新”实例的原因?
我读过这个:https://www.dotnetperls.com/static但是我错过了一些基本的拼图,所以仍然不完全理解这个概念。
我正在寻求帮助来理解这个概念,所以请用一些例子回答问题(好像我是一个完整的初学者)。
答案 0 :(得分:2)
这是由于Random
类的工作方式。
类不是静态的一个原因是它可以有多个具有不同状态的实例。
Random
使用种子生成伪随机数。如果使用相同的种子,将生成相同的数字。每个Random
实例都有一个种子作为状态。如果Random
是静态类,则只能使用一个种子,因为您无法使用不同的种子创建实例。使用无参数构造函数创建Random
对象时,系统时间将用作种子。
将Random
作为非静态类允许客户端代码传递他们想要使用的种子,从而使API更有用。
我注意到Console的IDE自动完成显示:'public static class',而对于Random,它显示:'public class'。如果Console是“静态的”,那是不是我们不需要创建“新”实例的原因吗?
不,您不需要创建Console
的新实例来使用其方法。事实上,你根本不能做new Console()
!这是因为没有也不应该是多个控制台。计算机中只有一个控制台。它不需要维护多个状态,例如带有种子和东西的Random
类。