使用数组初始化几个全局变量

时间:2015-08-10 16:29:19

标签: c#

让我说我有班级

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...

PS

我知道我可以将一个数组作为我的全局变量而不是几个。我只是要问这个问题。我有每个变量的参考。我想在该地址设置一个相同类型的新变量。

另外

如果Foo将是一个结构而不是引用类型(类),这将不起作用?

2 个答案:

答案 0 :(得分:1)

原因是您的数组elementsToSet最初包含四个null个实例(因为A1A2,... A4都是{ {1}}最初)。然后,当您将每个null设置为elementsToSet[i]时,数组中的元素都会被设置,但没有一个元素是对new Foo(...)的引用... A1 A4 s。

真的,最好的方法是

  1. 初始化每个Foo,每行一个。如果你有很多这样的话,这会很烦人。
  2. 让你的全局变量在一个数组中,然后循环并初始化。
  3. 使用反射(最糟糕的想法)。
  4. 编辑问题的编辑:不,如果Foo是结构而不是类,原始代码仍然无效,因为这样设置{{1即使用Foo elementsToSet[i]初始化elementsToSet,仍然只会设置数组中的元素。即使更多,原始A1 ... A4也未通过数组设置。

答案 1 :(得分:0)

  

我怎样才能阻止

我们的想法是编写一个方法:

  1. 为参考
  2. 传递的参数创建新对象
  3. 使用新创建的对象分配参数
  4. 将对象添加到某个集合
  5. 这可以在通用类中实现:

    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
    

    评论:

    1. Builder使用Constructor委托来创建每个对象。 Constructor委托被传递到Builder构造函数。
    2. Build函数的行为如上所述,并将Builder返回给链调用
    3. Items函数返回已创建项目的枚举
    4. Builder可用于任何类,不仅仅是Foo
相关问题