问题标签 [object-initializers]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 这是 C# 4.0 编译器中的错误吗?
此代码编译成功,但我认为它应该无法编译。此外,当你运行它时,你会得到一个NullReferenceException
. 缺少的代码是Bar
属性初始化中的“新栏”。
这是一个已知的错误?
c# - 在对象初始化器中分配事件
为什么不能在 C# 的对象初始值设定项中分配事件和属性?这样做似乎很自然。
还是有什么我不知道的技巧?
c# - “字段初始值设定项无法引用非静态字段、方法或属性”的概念原因 CS0236 错误
C#不允许实例字段初始化程序引用另一个字段。例如,此代码无效:
因为“s2”引用“s1”。
但为什么这是不允许的?
我的第一个想法是C# 规范不保证任何初始化顺序,但根据规范,顺序是声明的顺序:
变量初始化器按照它们在类声明中出现的文本顺序执行。
那么,如果顺序是确定性的,那么这种代码的缺陷是什么?
在此先感谢您的帮助。
编辑 :
根据Hps、0xA3和Peter的回答:
继承场景中的初始化顺序可能非常混乱,
实现这样的功能需要编译器开发团队提供一些资源,但收益甚微,
出于逻辑原因,不可能使用方法或属性(感谢Peter),因此为了保持一致性,字段也是如此。
c# - 如何创建可扩展的 API,并且仍然使用对象初始化器语法?
我有一个包含 Mercurial 命令行客户端的类库。
我的目的是实现对所有内置命令的支持,但除此之外,还有大量的扩展。
所以我需要使我的库可扩展,因为我和其他人都可以添加对扩展的支持。我计划添加对一些更流行和典型的扩展的支持(至少有不少与 Mercurial 捆绑在一起的),但我仍然希望能够从外部扩展它。
目前,命令的语法如下所示:
然而,这并不适合扩展,程序员不会觉得扩展只是一部分。
例如,假设我公开了一个公共的附加命令行参数集合,我可以手动执行此操作:
对我来说似乎没有简单的方法来添加额外的扩展,使其可以设置为对象初始化程序的一部分。
我一直在考虑添加或切换到流畅的界面语法。在这种情况下,您可以编写如下内容:
但是,我看到人们不喜欢流畅的界面,他们觉得它们变得太健谈了。
我还有什么其他选择?
我想要的,基本上:
- 一种常见的语法风格
- 对于两个内置的东西
- 以及我的图书馆用户添加的扩展
我设想我的库的用户将通过添加新类和扩展方法来扩展它以获得智能感知支持,但扩展方法不能用于对象初始化程序,这意味着所有扩展看起来都是事后才想到的。那不是我想要的。
欢迎任何想法。
c# - 协变对象初始化器?
假设我有一个类,它的属性是字典<string,bool>,使用对象初始化器我可以使用这种语法(我认为它看起来很干净):
但是,在初始化程序之外我不能这样做:
为什么初始化器是一个特例?我冒昧地猜测它与 LINQ 要求、协方差或诸如此类的东西有关,但感觉有点不一致,不能在任何地方使用那种初始化程序......
c# - 动态数组 | 扩展对象 | 使用压缩的初始化语法
我试图在 c# 中使用 DynamicObject,我需要一个动态数组:
效果很好。
编辑:见下面的 ExpandoObject。
但我也喜欢用这种压缩的初始化新语法填充该数组:
但在这种情况下,所有对象都获得非动态类型“对象”,并且通过项目循环会给我一个例外:
错误:“对象”不包含“名称”的定义。我想我只是以错误的方式初始化数组项。如何改为添加动态对象?
编辑:新内容:
我意识到“动态”没有动态添加属性的能力。
我最好使用 ExpandoObject ,它将内部字典中的所有项目作为属性公开。但不幸的是 ExpandoObject 似乎不支持这种很好的压缩创建语法,编译器抱怨:
所以答案可能只是:这是不可能的。
c# - 使用对象初始化器和 LINQ 进行 Ninject
我是 Ninject 的新手,所以我正在尝试的可能甚至不可能,但我想问一下。以下是我随意写的,所以可能有错别字。假设我有一个界面:
还有一个具体的:
当我从数组或 xml 中检索数据时,我习惯做的是这样的事情:
我不想以这种方式将混凝土紧密耦合到接口。我无法找到有关将 Ninject 与 LINQ to Objects 或对象初始化程序一起使用的任何信息。我可能在错误的地方寻找,但我一直在寻找一天没有运气。
我正在考虑将内核放入一个单例实例中,看看这是否可行,但我不确定它是否会起作用,而且我听说传递你的内核是一件坏事。我目前正在尝试在类库中实现这一点。如果这是不可能的,是否有人对这种情况下的最佳实践有任何示例或建议?在此先感谢您的帮助。
编辑: 基于一些我觉得我应该澄清的答案。是的,上面的例子看起来很短暂,但这只是我试图做的一个例子。让我们给出一个更大的图景。假设不是 XML,而是通过第 3 方 Web 服务收集我的所有数据并为其创建接口,数据可能是 wsdl 中定义的对象,或者有时可能是 xml 字符串。IPerson 可用于 Person 对象和 User 对象。我将在一个单独的类库中执行此操作,因为它需要可移植并将用于其他项目,并将其交给 MVC3 Web 应用程序,并且对象也将在 javascript 中使用。到目前为止,我感谢所有输入。
c# - 如何调试对象初始化代码?
有没有办法在 Visual Studio 中逐步调试对象初始化程序代码?
例子:
有时我在这种代码中遇到错误(例如,当转换为 int 失败时)并且 VS 似乎无法单步执行它,它只会为整行抛出错误,我必须尝试哪些初始化失败.
有没有一种简单的方法来调试它,或者最好避免使用对象初始化器进行大型或复杂的初始化?
我正在使用 VS 2010 和 C# 4.0。
c# - 如果初始化器抛出,是否构造了一个对象?
我在 Jag Reeghal 的博客上阅读了这篇文章,在我看来,他的建议与使用对象初始化器并不一样。然后我意识到我真的不确定。
当一个对象被构造时,使用对象初始化器,并且这些初始化器之一抛出(可能是空引用异常)......对象实际上是构造的吗?这基本上就像在构造函数中抛出的异常吗?还是对象完全构造,然后初始化?