如何确定是否可以复制变量,以便更改原件不会影响副本(反之亦然)?
我认为检查Type的IsValueType
属性就足够了,但是注意到字符串不被视为值类型,尽管复制的字符串就是为了这个目的而行为,作为值类型。还有其他我需要检查的吗?
修改
是。我意识到string
是不可变的。我只是意味着我的头脑似乎IsValueType
正是我正在寻找的。我想要的只是copy = original
,然后变量original
永远不会影响变量copy
。这适用于int
和string
s,而不适用于Form
。
编辑2
我正在寻找类似字符串,整数,小数,点,枚举,大小...而不是Forms,StringBuilders ......
答案 0 :(得分:0)
我没有看到在运行时为任何给定类型确定此问题的方法。实现此目的的唯一方法是使用具有所需行为的所有已知类型创建集合。这应该是内置值类型,如int
,double
等等+引用类型string
。
正如我在评论中提到的那样,您不能只检查类型的IsValueType
属性,因为true
的{{1}}是struct
,但struct
本身可以包含对象。请考虑以下代码:
class Program
{
static void Main(string[] args)
{
var dataTable = new DataTable();
dataTable.Columns.Add("ABC", typeof(string));
var a = new CustomStruct() { IntValue = 1, DataTable = dataTable };
Console.WriteLine("IsValueType: {0}", a.GetType().IsValueType);
Console.WriteLine();
var b = a;
a.IntValue = 2;
a.DataTable.Columns.Add("DEF", typeof(int));
Console.WriteLine("a.IntValue: {0}", a.IntValue);
Console.WriteLine("a.DataTable.Columns.Count: {0}", a.DataTable.Columns.Count);
Console.WriteLine();
Console.WriteLine("b.IntValue: {0}", b.IntValue);
Console.WriteLine("b.DataTable.Columns.Count: {0}", b.DataTable.Columns.Count);
}
}
public struct CustomStruct
{
public int IntValue;
public DataTable DataTable;
}
输出结果为:
IsValueType: True
a.IntValue: 2
a.DataTable.Columns.Count: 2
b.IntValue: 1
b.DataTable.Columns.Count: 2
所以你看,虽然CustomStruct
是值类型b
,但DataTable
对象与a
的对象相同。
因此,创建具有所需行为的已知类型的自定义列表是最简单的方法。