在C#中,对象初始值设定项可以设置公共非只读字段和属性.
但是,对于匿名类型,属性是只读的.那么.NET如何在对象初始化上设置它们呢?
Whille为WPF/MVVM项目的集合创建了一些虚拟数据,我生成了以下错误代码,编译得很好,但在运行时抛出异常.
有一个嵌套的数据对象结构,我错误地只用花括号进行实例化(看起来像编写JavaScript确实会对大脑造成永久性损害).
using System.Collections.ObjectModel;
namespace testapp
{
class Program
{
static void Main(string[] args)
{
var collection = new ObservableCollection<TopLevelDataObject>();
collection.Add(new TopLevelDataObject{Nested = {Bar = 5}}); // NullReferenceException
}
class TopLevelDataObject
{
public NestedDataObject Nested { get; set; }
public string Foo { get; set; }
}
class NestedDataObject
{
public double Bar { get; set; }
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么要编译?
如果我创建一个匿名类型,比如Nested = new {Bar = 5},我在编译期间收到错误消息(因此失败):
Cannot implicitly convert type '<anonymous type: int Bar>' to 'testapp.Program.NestedDataObject'
Run Code Online (Sandbox Code Playgroud)
为什么在省略 …
在ASP.NET MVC视图助手中,您可以执行类似的操作
<%= Html.ActionLink("click me", "DoSomething", null, new { someAttribute = "a value" } ) %>
Run Code Online (Sandbox Code Playgroud)
这将产生以下HTML
<a href="DoSomething" someAttribute="a value">click me</a>
Run Code Online (Sandbox Code Playgroud)
我的问题是......如果我想设置"class"属性怎么办?
<%= Html.ActionLink("click me", "DoSomething", null, new { class = "a-class-name" } ) %>
Run Code Online (Sandbox Code Playgroud)
那将无法编译,因为"class"是一个保留字.
有解决方法吗?
好吧,我确定我错误地写了这个概念,但不管怎么说.
我知道你可以在CSharp中做到
el.AppendChild(new UISize(file, "TSize") { CX = 95, CY = 20 });
Run Code Online (Sandbox Code Playgroud)
它声明了一个临时的bucket变量,然后将关联属性值赋给变量.然后将其发送到XMLElement AppendChild方法.
我尝试使用自己的在线工具,从C#< - > VB.Net获得90-95%的转换率.它在这种情况下失败了,所以需要提一下我要做的事情,将它从C#转换为VB.Net.
如果可能的话,我真的不想做一个带有赋值的变量的长声明.
我想知道当初始化程序多于数组大小时会发生什么,例如:
int t[3] = { 1, 2, 3, 4 };
Run Code Online (Sandbox Code Playgroud)
当然,我的编译器警告它.我期望未定义的行为,但我没有在C11标准中找到任何关于它的条款.那么,我错过了什么吗?
c arrays initialization object-initializers aggregate-initialization
我试图声明一个值为字符串数组的字典.我怎样才能做到这一点?
我尝试了以下代码(不起作用):
Dictionary<string, string[]> NewDic = new Dictionary<string,string[]>
{
{"Key_0", {"Value_0.0", "Value_0.1"}},
{"Key_1", {"Value_1.0", "Value_1.1", "Value_1.2"}},
}
Run Code Online (Sandbox Code Playgroud) 我发现找到了这样一条线:
var myObject = new MyClass { 42 };
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以执行此类操作.文档说,如果你定义一个匿名类型,你必须使用一个对象初始化器"所以这很明显,但我无法找到任何关于大括号中的单独整数.
Position我正在使用对象初始值设定项来创建具有如下属性的对象:
var control = new HtmlTextbox(browser)
{
Position = position;
};
Run Code Online (Sandbox Code Playgroud)
据我所知,它与以下内容相同:
var control = new HtmlTextbox(browser);
control.Position = position;
Run Code Online (Sandbox Code Playgroud)
但我想Position在我的构造函数方法中使用初始化属性。Position有没有办法在不提供作为构造函数参数的情况下做到这一点?
使用 VB.NET 2017,我声明了一个结构,它有两个成员,一个是结构,另一个是字符串,如下所示:
Structure InpFile
Dim name As String
Dim reader As StreamReader
Dim lineIn As String
Dim lineNum As Integer
End Structure
Structure Opts
Dim fin As InpFile
Dim name As String
End Structure
Run Code Online (Sandbox Code Playgroud)
如何Opts在声明时初始化类型对象?
例如,一种无效的尝试:
Dim obj as Opts = {.fin.name = "filename.txt", .fin.lineNum = 0, .name = "JohnnyMnemonic"}
Run Code Online (Sandbox Code Playgroud) vb.net initialization object-initializers visual-studio-2017
我正在为我的对象进行对象初始化和构造函数初始化,但无法得到我的问题的确切答复。这里Case1和Case2有什么区别;
情况1:
namespace ConsoleApplication2
{
class MyBuilder
{
private MySynchronizer m_synchronizer = new MySynchronizer();
public MyBuilder()
{
}
public void ProcessRecord(int recordNumber)
{
m_synchronizer.Process(recordNumber);
}
}
}
Run Code Online (Sandbox Code Playgroud)
案例二:
namespace ConsoleApplication2
{
class MyBuilder
{
private MySynchronizer m_synchronizer;
public MyBuilder()
{
m_synchronizer = new MySynchronizer();
}
public void ProcessRecord(int recordNumber)
{
m_synchronizer.Process(recordNumber);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是示例代码,用于展示我如何调用我的 Builder 类;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Press any key to stop");
MyBuilder builder = new MyBuilder();
builder.ProcessRecord(2);
}
}
Run Code Online (Sandbox Code Playgroud)
[对不起,如果我不能正确地重新表述这个问题,在这种情况下,任何人都可以提供指向其他 SO …
c# ×8
constructor ×2
vb.net ×2
.net ×1
arrays ×1
asp.net-mvc ×1
c ×1
curly-braces ×1
dictionary ×1
html-helper ×1
oop ×1