做网站设计软件,网站编辑怎么样,做购物网站平台,上饶婚纱工作室网站建设在 C# 中#xff0c;存储不同类型的数据有多种方式#xff0c;具体选择取决于你的需求#xff08;类型安全、性能、灵活性等#xff09;。以下是常见的解决方案及其适用场景#xff1a;1. 使用 object 类型#xff08;装箱 / 拆箱#xff09;将所有数据转换为基类 objec…在 C# 中存储不同类型的数据有多种方式具体选择取决于你的需求类型安全、性能、灵活性等。以下是常见的解决方案及其适用场景1. 使用 object 类型装箱 / 拆箱将所有数据转换为基类 object利用 C# 的多态性存储任意类型。
Listobject mixedList new Listobject();
mixedList.Add(123); // int → 装箱为object
mixedList.Add(Hello); // string引用类型无需装箱
mixedList.Add(new DateTime()); // DateTime → 装箱为object
// 访问时需手动拆箱可能引发InvalidCastException
int num (int)mixedList[0]; // 拆箱
string str (string)mixedList[1];优点简单直接无需额外类型定义。缺点装箱 / 拆箱开销值类型如 int, DateTime频繁转换会降低性能。类型不安全运行时可能抛出 InvalidCastException。2. 使用泛型集合 Listdynamic
dynamic 关键字在运行时动态解析类型避免编译时类型检查。Listdynamic dynamicList new Listdynamic();
dynamicList.Add(123); // 无需装箱
dynamicList.Add(Hello);
dynamicList.Add(new { Name Alice }); // 匿名类型也可存储
// 访问时无需显式转换
int num dynamicList[0]; // 动态类型解析
string str dynamicList[1];优点无需装箱拆箱值类型以原始类型存储。支持匿名类型等复杂结构。缺点运行时类型风险若类型不匹配会在运行时抛出异常。性能开销动态解析比静态类型稍慢。3. 使用自定义类 / 结构体推荐方案
public class MixedData
{public int Id { get; set; }public string Name { get; set; }public DateTime BirthDate { get; set; }
}
// 使用方式
ListMixedData dataList new ListMixedData();
dataList.Add(new MixedData { Id 1, Name Alice, BirthDate DateTime.Now
});定义一个包含所需字段的类每个字段使用明确的类型。
public class MixedData
{public int Id { get; set; }public string Name { get; set; }public DateTime BirthDate { get; set; }
}
// 使用方式
ListMixedData dataList new ListMixedData();
dataList.Add(new MixedData { Id 1, Name Alice, BirthDate DateTime.Now
});优点类型安全编译时检查类型。可读性高字段含义明确。性能最优无需装箱拆箱。缺点需提前定义类型不够灵活。4. 使用 Tuple 或 ValueTuple
适合临时存储少量不同类型的数据。// Tuple旧版需通过Item1、Item2访问
var tupleList new ListTupleint, string();
tupleList.Add(Tuple.Create(1, Alice));
// ValueTupleC# 7.0推荐支持命名元素
var valueTupleList new List(int Id, string Name)();
valueTupleList.Add((1, Alice));
// 访问方式
int id valueTupleList[0].Id;
string name valueTupleList[0].Name;优点简洁无需额外类定义。缺点元素数量有限最多 8 个。不适合复杂或大量数据。5. 使用 Dictionarystring, object以键值对形式存储不同类型的值类似动态对象。
var dict new Dictionarystring, object();
dict[Id] 123;
dict[Name] Alice;
dict[IsActive] true;
// 访问时需转换类型
int id (int)dict[Id];
bool isActive (bool)dict[IsActive];优点灵活可动态添加 / 删除键值对。缺点类型不安全需手动转换。键名硬编码易出错。6. 使用接口或抽象类面向对象设计定义公共接口让不同类型实现该接口。
public interface IDataItem { }
public class Person : IDataItem
{public string Name { get; set; }
}
public class Product : IDataItem
{public decimal Price { get; set; }
}
// 使用方式
ListIDataItem items new ListIDataItem();
items.Add(new Person { Name Alice });
items.Add(new Product { Price 9.99m });
// 通过模式匹配访问
foreach (var item in items)
{if (item is Person person)Console.WriteLine(person.Name);else if (item is Product product)Console.WriteLine(product.Price);
}优点类型安全符合面向对象原则。可扩展易于添加新类型。缺点需设计接口和继承体系复杂度较高。7. 使用 ExpandoObject动态对象System.Dynamic.ExpandoObject 是动态类型的字典支持运行时添加属性。
dynamic person new ExpandoObject();
person.Name Alice;
person.Age 30;
// 直接访问属性无需转换
Console.WriteLine(person.Name); // Alice优点语法简洁像普通对象一样访问属性。无需提前定义类型。缺点编译时无类型检查易出错。性能略低于静态类型。7. ArrayList非泛型不推荐特点来自 System.Collections 命名空间可存储任意类型实际存为 object。动态扩容但存在装箱 / 拆箱开销和类型安全问题。示例
using System.Collections;
ArrayList list new ArrayList();
list.Add(张三); // string → object装箱
list.Add(10); // int → object装箱
list.Add(2.2); // double → object装箱
// 访问时需手动拆箱可能引发InvalidCastException
int num (int)list[1]; // 拆箱方案装箱开销类型安全性能相对Listobject有否低Listdynamic无否中自定义类 / 结构体无是高Dictionarystring, object有否中ExpandoObject无否中低ArrayList有否低