如何用循环批量实例化并命名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:你已经声明了名为
locations的字符串数组,又在循环里试图用Location locations[i]声明同名变量,引发作用域冲突;同时字符串数组无法存储Location对象,类型不匹配。 - 尝试2:
Location (locations[i]) = ...的写法不符合C#语法,编译器会将(locations[i])识别为方法调用参数,因此报错。
扩展到900个对象的处理
只需扩展locationNames数组(或从配置文件、数据库读取名称列表),循环逻辑无需修改,字典会自动完成所有对象的存储与访问。
内容的提问来源于stack exchange,提问作者HappyNoodleBoy
相关产品推荐
相关产品推荐

