You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用循环批量实例化并命名C#对象,替代重复实例化代码?

批量实例化Location对象并保留名称调用功能

我已经手动实现了创建多个Location对象的功能(代码如下),但如果要实例化900个对象,不想重复写900行代码,希望用循环批量创建,同时保留通过对象名称直观调用的功能。目前尝试的两种写法都报错,求解决办法。

成功的手动实现代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace TextLooter
{
    public class Location
    {
        public int positionA;
        public int positionB;

        public Location(int aPositionA, int aPositionB)
        {
            positionA = aPositionA;
            positionB = aPositionB;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            
            Location city = new Location(1, 1);
            Location park = new Location(2, 2);
            Location town = new Location(3,3);
            Location woods = new Location(4, 4);
            Location meadow = new Location(5, 5);
            Location mountain = new Location(6, 6);
            Location temple = new Location(7, 7);
            Location circus = new Location(8, 8);
            Location gym = new Location(9, 9);
            
            Location location = new Location(0, 0);

            location = park;

            Console.WriteLine(location.positionA + ":" + location.positionB);

            Console.ReadLine();
        }
    }
}

失败的尝试及报错

尝试1

string[] locations = { "city", "park", "town", "woods", "meadow", "mountain", "temple", "circus", "gym" };

int i = 1;
while (i < 10)
{
    Location locations[i] = new Location(i, i);
    i++;
}

报错:CS0136:无法在该作用域中声明名为“locations”的局部变量或参数。

尝试2

string[] locations = { "city", "park", "town", "woods", "meadow", "mountain", "temple", "circus", "gym" };

int i = 1;
while (i < 10)
{
    Location (locations[i]) = new Location(i, i);
    i++;
}

报错:CS1955:不能将Location用作方法。


解决方案

C#是静态类型语言,无法在运行时动态创建局部变量名称,但可以用Dictionary<string, Location>来实现“通过名称直观调用”的需求,既可以循环批量创建,又能通过键名(对象名称)快速访问对象。

修改后的代码示例:

using System;
using System.Collections.Generic;

namespace TextLooter
{
    public class Location
    {
        public int positionA;
        public int positionB;

        public Location(int aPositionA, int aPositionB)
        {
            positionA = aPositionA;
            positionB = aPositionB;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            // 定义所有位置名称
            string[] locationNames = { "city", "park", "town", "woods", "meadow", "mountain", "temple", "circus", "gym" };
            // 创建字典存储名称和对应的Location对象
            Dictionary<string, Location> locationDict = new Dictionary<string, Location>();

            // 循环批量实例化并添加到字典
            for (int i = 0; i < locationNames.Length; i++)
            {
                // 位置编号从1开始,对应i+1
                locationDict[locationNames[i]] = new Location(i + 1, i + 1);
            }

            // 通过名称调用对象,和之前的直接变量调用效果一致
            Location location = locationDict["park"];
            Console.WriteLine($"{location.positionA}:{location.positionB}");

            Console.ReadLine();
        }
    }
}

失败原因分析

  1. 尝试1:你已经声明了名为locations的字符串数组,又在循环里试图用Location locations[i]声明同名变量,引发作用域冲突;同时字符串数组无法存储Location对象,类型不匹配。
  2. 尝试2:Location (locations[i]) = ...的写法不符合C#语法,编译器会将(locations[i])识别为方法调用参数,因此报错。

扩展到900个对象的处理

只需扩展locationNames数组(或从配置文件、数据库读取名称列表),循环逻辑无需修改,字典会自动完成所有对象的存储与访问。


内容的提问来源于stack exchange,提问作者HappyNoodleBoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:53:30