检查"价值"类型(包括字符串等类型)

时间:2013-12-22 12:30:20

标签: c# .net

如何确定是否可以复制变量,以便更改原件不会影响副本(反之亦然)?

我认为检查Type的IsValueType属性就足够了,但是注意到字符串不被视为值类型,尽管复制的字符串就是为了这个目的而行为,作为值类型。还有其他我需要检查的吗?

修改

是。我意识到string是不可变的。我只是意味着我的头脑似乎IsValueType正是我正在寻找的。我想要的只是copy = original,然后变量original永远不会影响变量copy。这适用于intstring s,而不适用于Form

编辑2

我正在寻找类似字符串,整数,小数,点,枚举,大小...而不是Forms,StringBuilders ......

1 个答案:

答案 0 :(得分:0)

我没有看到在运行时为任何给定类型确定此问题的方法。实现此目的的唯一方法是使用具有所需行为的所有已知类型创建集合。这应该是内置值类型,如intdouble等等+引用类型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的对象相同。

因此,创建具有所需行为的已知类型的自定义列表是最简单的方法。