C# 检查是否有“错误”;“价值”;类型(包括字符串等类型)
如何确定是否可以复制变量,以使更改原始变量不会影响副本(反之亦然) 我认为检查其类型的C# 检查是否有“错误”;“价值”;类型(包括字符串等类型),c#,.net,C#,.net,如何确定是否可以复制变量,以使更改原始变量不会影响副本(反之亦然) 我认为检查其类型的IsValueType属性就足够了,但注意到字符串不被视为值类型,尽管复制的字符串为此目的作为值类型。还有其他我要查的吗 编辑 对。我意识到字符串是不可变的。我的意思是,在我的脑海里,似乎IsValueType就是我要找的。我所希望的就是能够拥有copy=original,然后对变量original的更改永远不会影响变量copy。这适用于ints和strings,而不适用于Forms 编辑2 我在找字符串、整数
IsValueType
属性就足够了,但注意到字符串不被视为值类型,尽管复制的字符串为此目的作为值类型。还有其他我要查的吗
编辑
对。我意识到字符串
是不可变的。我的意思是,在我的脑海里,似乎IsValueType
就是我要找的。我所希望的就是能够拥有copy=original
,然后对变量original
的更改永远不会影响变量copy
。这适用于int
s和string
s,而不适用于Form
s
编辑2
我在找字符串、整数、小数、点、枚举、大小之类的。。。与表单相反,StringBuilders…我看不出一种方法可以在运行时为任何给定类型确定这一点。实现这一点的唯一方法是使用具有所需行为的所有已知类型创建集合。它可以是内置值类型,如
int
、double
等+引用类型string
正如我在评论中提到的,您不能只检查类型的IsValueType
属性,因为这对于struct
是true
,但是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
对象相同
因此,创建具有所需行为的已知类型的自定义列表是最简单的方法。这取决于您是如何克隆的?深拷贝还是浅拷贝?@RohitVats浅拷贝。简单的:
Type1副本=原件代码>字符串是引用类型。它们是不可变的,所以当任何人更改它时,它将创建字符串的新实例。@SergeyLitvinov Yes。我知道。这就是为什么我写了“复制的字符串作为值类型用于此目的”。请仔细检查IsValueType
。struct
的值应该是true
,但是struct
可以包含引用类型的属性,并且这些属性不会被复制。