例如,我们会说出一个时间跨度:
var timeSpan = new TimeSpan();
所以我的第一个问题是,“新”究竟做了什么?
我的第二个问题是,在其他情况下,没有必要:
var timeSpan = TimeSpan.FromHours(1);
我不明白为什么“新”现在消失了?
非常感谢!
答案 0 :(得分:1)
所以我的第一个问题是," new"做到了吗?
说你想做一件新事,就这么简单。 "亲爱的C#,请给我一个新的TimeSpan"。
我不明白为什么"新"现在消失了?
因为你没有创造新事物,所以你要问其他事情"亲爱的TimeSpan结构,请给我一个TimeSpan"。
现在该方法可以(并且在这种情况下,确实)创建一个新对象,但它可以为您提供一个缓存的对象(对于值类型无意义,但有时对于不可变引用类型有用)或者有时可能会给您一个新对象和一个用于公共值的缓存集(对于不可变引用类型也很有用)。它没有 通过new
一个原因可能存在这样的工厂方法。
在这个的情况下,它的存在只是因为它可以方便地将数字转换为TimeSpan
达给定的小时数,对于给定的数量天,给定的秒数等,我们只能有一个带double
的构造函数。如果TimeSpan
有这样的构造函数,那么它只能详细说明或多少天或多少秒等等。您无法{ {1}}进行一对一呼叫,然后进行另一次呼叫。
在其他情况下(使用引用类型),这样的 factory 方法可能很有用,因为它们不会给你一些所要求的确切类型,而是一个派生类型,决定自己该做什么
我们通常使用构造函数通过new TimeSpan(3.2)
获取给定类型的新对象,因为工厂方法没有任何内容(因为主要用于返回所需对象的方法通常被调用)要添加
答案 1 :(得分:0)
这是静态属性和实例对象之间的区别。 使用'new'创建对象的实例。 调用TimeSpan.FromHours是一个静态方法,它返回表示指定小时数的TimeSpan实例。
答案 2 :(得分:-1)
new
创建一个类的“新”对象(实例)。大多数基于OOP的语言都是如此。编写new Class()
调用类的构造函数,可以进行初步设置工作和数据存储。
在你不需要它的实例中,你只是调用一个静态方法,用new
调用幕后的构造函数,对它有效,然后返回新对象。这不是语言的一部分,而是易于使用的设计选择。
new
关键字上的offers documentation及其各种用途(此处列出的内容多于此处 - 我刚刚发布了相关位)。
答案 3 :(得分:-1)
在创建对象的新实例时,您需要使用new。
好的,当您只是创建一个类似下面的变量时,这会在STACK中创建一个指针
TimeSpan timeSpan;
所以直到这个时候,在HEAP中没有进行内存分配,当你用NEW关键字初始化时,HEAP内存分配就完成了。
timeSpan = new TimeSpan();
您可以将声明和初始化合并到一行中,如下所示
var timeSpan = new TimeSpan();
在静态方法的情况下,你需要使用new,因为初始化静态不需要(FromHours是TimeSpan的静态方法),如下所示
var timeSpan = TimeSpan.FromHours(1);