专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » c语言中的顺序结构:C#中的结构和类 »正文

c语言中的顺序结构:C#中的结构和类

来源: 发布时间:星期六, 2009年3月7日 浏览:0次 评论:0
C# Corner今天发表了Bechir Bejaoui篇文章What really make dference between structures and es?有关结构和类区别其实是老生常谈不过本文整理总结得较为全面所以翻译过来给大家共享

  整理总结起来两者共有如下区别:

  1、结构是值类型类则是引用类型因此前者是放在栈(Stack)里后者则仅仅是将引用地址存放在栈里而具体值则存放在堆(heap)里如下图所示:



  2、据第1点可以得出结论那就是类对象通常用来传递大数据而结构对象则用来传递小数据

  3、类可以被继承而结构则不支持

  4、结构对象不能像类对象样赋值为null

  5、结构不能像类样定义析构器

  6、结构不能像类样定义为抽象

  7、在结构中不能重写思路方法除非是object类型如下思路方法:

  Equals

  GetHashCode

  GetType

  

  若要让结构具有多态特性可以让其实现接口

  8、在类中定义事件是线程安全而结构则不是

  9、结构总是具有个默认公共无参构造但却不能像类样定义私有无参构造(结构也不能再定义公共无参构造这和类不相同):

    struct Me
    {
        private Me // compile-time error
        {
        }
    }
    
    Me
    {
        private Me // runs Ok{
    }


  10、类中静态构造会被而结构却不能因此在结构中定义静态构造虽然可以编译通过但却没有价值:

    struct myStructure
    {
        myStructure
        {
            Console.WriteLine("This is me a structure");
        }
    }
    myClass
        myClass
        {
            Console.WriteLine("This is me a ");
        }
    }
    Program
    {
        void Main( args)
        {
           myStructure s = myStructure;//Nothing happen
           myClass c = myClass;//Will out put This is me a
           Console.Read;
        }
    }


  11、结构不能像类样定义volatile字段volatile字段主要用于并发它相当于思路方法体lock

  12、可以对结构类型使用对类则不行

  13、类字段会被自动化为0/false/null而结构则不能

  14、在结构中不能直接对字段而类则可以     struct myStructure
    {
        public x = 2;//Not allowed
    }
    myClass
    {
        public x = 2; //Allowed
    }


  15、结构和类对于.Object.Equals思路方法体现是不相同例如定义这样结构和类:

    struct StructurePerson
    {
        public FirstName;
        public LastName;
    }
    ClassPerson
    {
        public FirstName;
        public LastName;
    }


  如果运行如下代码:

    Program
    {
        void Main( args)
        {
            StructurePerson strX = StructurePerson;
            strX.LastName = "Bejaoui";
            strX.FirstName = "Bechir";
            StructurePerson strY = StructurePerson;
            strY.LastName = "Bejaoui";
            strY.FirstName = "Bechir";

            (strX.Equals(strY))
            {
                Console.WriteLine("strX = strY");
            }
           
            {
                Console.WriteLine("strX != strY");
            }//This code displays strX = strY

            ClassPerson clsX = ClassPerson;
            clsX.LastName = "Bejaoui";
            clsX.FirstName = "Bechir";
            ClassPerson clsY = ClassPerson;
            clsY.LastName = "Bejaoui";
            clsY.FirstName = "Bechir";

            (clsX.Equals(clsY))
            {
                Console.WriteLine("clsX = clsY");
            }
           
            {
                Console.WriteLine("clsX != clsY");
            }//This code displays clsX != clsY
            Console.Read;
        }
    }


  由于结构类型是值类型因而Equals思路方法比较是两个对象值是否相等如果相等则返回true;而类类型为引用类型Equals思路方法比较是 2者引用地址(即指针)是否相等很显然clsX和clsY是两个区别对象它们在栈地址是不相等如果修改代码如下:

            ClassPerson clsX = ClassPerson;
            clsX.LastName = "Bejaoui";
            clsX.FirstName = "Bechir";
            ClassPerson clsY = clsX;
            (clsX.Equals(clsY))
            {
                Console.WriteLine("clsX = clsY");
            }
           
            {
                Console.WriteLine("clsX != clsY");

            }//This code displays clsX = clsY


  由于是直接将clsX赋值给clsY因此两个对象引用地址相等Equals思路方法返回true

  其实对于值类型和引用类型相等性比较个比较复杂问题例如我们可以通过重写Equals思路方法增强或修改比较逻辑重写Equals思路方法还必须重写GetHashCode思路方法对于引用类型还可以使用静态思路方法ReferenceEquals思路方法此外还可以重载操作符另外对于String对象则比较特殊它使用了Immutable模式虽然String类型是引用类型但如果直接定义两个String对象值相同由于采用了Immutable模式原因这两个对象其实是同个对象引用地址是相同因此不仅动态思路方法Equals返回是true且静态思路方法ReferenceEquals返回也是true

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: