让我说我有班级
class Foo
{
public int Value { get; set; }
}
我有全局变量:
public static Foo A1 { get; set; }
public static Foo A2 { get; set; }
public static Foo A3 { get; set; }
public static Foo A4 { get; set; }
// etc... more
以下代码不会设置这些全局变量的值:
var elementsToSet = new Foo[]{A1,A2,A3,A4};
for (var i = 0; i < elementsToSet.Length; i++)
elementsToSet[i] = new Foo {Value = i};
换句话说,A1 == null
是真的:(
我正在尝试初始化A1,A2等不是数组
如何防止这样做:
A1 = new Foo { Value = 1 };
A2 = new Foo { Value = 2 };
A3 = new Foo { Value = 3 };
A4 = new Foo { Value = 4 };
// etc...
我知道我可以将一个数组作为我的全局变量而不是几个。我只是要问这个问题。我有每个变量的参考。我想在该地址设置一个相同类型的新变量。
如果Foo
将是一个结构而不是引用类型(类),这将不起作用?
答案 0 :(得分:1)
原因是您的数组elementsToSet
最初包含四个null
个实例(因为A1
,A2
,... A4
都是{ {1}}最初)。然后,当您将每个null
设置为elementsToSet[i]
时,数组中的元素都会被设置,但没有一个元素是对new Foo(...)
的引用... A1
A4
s。
真的,最好的方法是
Foo
,每行一个。如果你有很多这样的话,这会很烦人。 编辑问题的编辑:不,如果Foo
是结构而不是类,原始代码仍然无效,因为这样设置{{1即使用Foo
elementsToSet[i]
初始化elementsToSet
,仍然只会设置数组中的元素。即使更多,原始A1
... A4
也未通过数组设置。
答案 1 :(得分:0)
我怎样才能阻止
我们的想法是编写一个方法:
这可以在通用类中实现:
Public Class Builder(Of ItemType)
Dim Constructor As Func(Of Integer, ItemType)
Dim Queue As New Queue(Of ItemType)
Public Sub New(Constructor As Func(Of Integer, ItemType))
Me.Constructor = Constructor
End Sub
Public Function Build(ByRef Item As ItemType) As Builder(Of ItemType)
Item = Constructor(Queue.Count)
Queue.Enqueue(Item)
Return Me
End Function
Public Function Items() As IEnumerable(Of ItemType)
Return Queue
End Function
End Class
用法:
Dim Foos = New Builder(Of Foo)(Function(Index) New Foo With {.Value = Index + 1}).
Build(A1).Build(A2).Build(A3).Build(A4).
Items
评论:
Builder
使用Constructor
委托来创建每个对象。 Constructor
委托被传递到Builder
构造函数。Build
函数的行为如上所述,并将Builder
返回给链调用Items
函数返回已创建项目的枚举Builder
可用于任何类,不仅仅是Foo