当我阅读SqlCommand cmd = new SqlCommand(@"
UPDATE t1
SET t1.ScheduledStartUTC = t2.ScheduledStartUTC
FROM ScheduleTickets AS t1
INNER JOIN @SetScheduledStart AS t2 ON t1.ScheduleId = t2.ScheduleId AND t1.PatchSessionId = t2.PatchSessionId
", c);
cmd.Parameters.Add("@SetScheduledStart", SqlDbType.Structured).Value = SetScheduleTicketsDateDT;
cmd.ExecuteNonQuery();
的源代码时,我发现了令我困惑的事情。
Json11
为什么函数 /* * * * * * * * * * * * * * * * * * * *
* Static globals - static-init-safe
*/
struct Statics {
const std::shared_ptr<JsonValue> null = make_shared<JsonNull>();
const std::shared_ptr<JsonValue> t = make_shared<JsonBoolean>(true);
const std::shared_ptr<JsonValue> f = make_shared<JsonBoolean>(false);
const string empty_string;
const vector<Json> empty_vector;
const map<string, Json> empty_map;
Statics() {}
};
static const Statics & statics() {
static const Statics s {};
return s;
}
/* * * * * * * * * * * * * * * * * * * *
* Constructors
*/
Json::Json() noexcept : m_ptr(statics().null) {}
Json::Json(std::nullptr_t) noexcept : m_ptr(statics().null) {}
返回声明为static const的引用值statics
?
为什么使用函数s
来获取成员null?
答案 0 :(得分:1)
Statics
结构,如注释所述,旨在保存在代码中重复使用的常量值。而不是创建这些常用对象的多个实例,只需要一个,减少内存使用(并可能使比较更容易)。函数statics()
返回对Statics
结构的唯一全局实例的引用。这有点像singleton pattern in C++,但正如NathanOliver指出的那样,Statics
仍然有一个公共构造函数,所以没有什么可以阻止你创建结构的新实例。
Json
的构造函数使用单例Statics
实例来获取它的null
成员,这是指向JsonNull
对象的指针。这意味着每个新的Json
对象都是使用null值创建的,但JsonNull
的相同实例用于初始化所有这些对象。由于Statics
对象及其成员都是const
,原则上(原则上)不可能偶然修改静态数据。