Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查是否有“错误”;“价值”;类型(包括字符串等类型)_C#_.net - Fatal编程技术网

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
可以包含引用类型的属性,并且这些属性不会被复制。