C#编程(7_对象)

  程序可以创建同一个类的多个对象,对象也称为实例。可以存储在命名变量中,也可以存储在数组、集合中。使用这些变量来调用对象方法以及公共属性的代码称为客户端代码。在C#等面向对象的语言中,典型的程序往往使用多个对象。

  由于类是引用类型,因此类对象的的变量引用该对象在托管堆上的地址。如果将同一类的第二个对象分配给第一个对象,则两个对象都引用该地址的对象。

  类的实例使用new关键字创建的:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
    //Other properties, methods, events...
}

class Program
{
    static void Main()
    {
        Person person1 = new Person("Leopold", 6);
        Console.WriteLine("person1 Name = {0} Age = {1}", person1.Name, person1.Age);

        // Declare  new person, assign person1 to it.
        Person person2 = person1;

        //Change the name of person2, and person1 also changes.
        person2.Name = "Molly";
        person2.Age = 16;

        Console.WriteLine("person2 Name = {0} Age = {1}", person2.Name, person2.Age);
        Console.WriteLine("person1 Name = {0} Age = {1}", person1.Name, person1.Age);

        // Keep the console open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();

    }
}
/*
    Output:
    person1 Name = Leopold Age = 6
    person2 Name = Molly Age = 16
    person1 Name = Molly Age = 16
*/

  由于结构是值类型,因此结构对象的变量具有整个对象的副本。结构的实例也可以用new关键字来创建,但这不是必须的,如下:

public struct Person
{
    public string Name;
    public int Age;
    public Person(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

public class Application
{
    static void Main()
    {
        // Create  struct instance and initialize by using "new".
        // Memory is allocated on thread stack.
        Person p1 = new Person("Alex", 9);
        Console.WriteLine("p1 Name = {0} Age = {1}", p1.Name, p1.Age);

        // Create  new struct object. Note that  struct can be initialized
        // without using "new".
        Person p2 = p1;

        // Assign values to p2 members.
        p2.Name = "Spencer";
        p2.Age = 7;
        Console.WriteLine("p2 Name = {0} Age = {1}", p2.Name, p2.Age);

        // p1 values remain unchanged because p2 is  copy.
        Console.WriteLine("p1 Name = {0} Age = {1}", p1.Name, p1.Age);

        // Keep the console open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/*
  Output:
    p1 Name = Alex Age = 9
    p2 Name = Spencer Age = 7
    p1 Name = Alex Age = 9
*/

  p1和p2的内存在县城堆栈上进行分配。该内存随声明它的类型或方法一起回收,这就是在赋值时复制结构的一个原因,相比之下,当对类实例对象的所有引用都超出范围时,为该类实例分配的内存将由公共语言运行时自动回收(垃圾回收)。无法像在C++中那样明确地销毁类对象。
  在比较两个对象是否相等时,首先必须明确是想知道两个变量是否表示内存中的同一对象,还是想知道这两个对象的一个或多个字段的值是否相等。如果要对值进行比较,则必须考虑这两个对象是值类型(结构)的实例,还是引用类型(类、委托、数组)的实例。

  • 若要确定两个类型实例是否引用内存中的同一位置(意味具有相同的表示),可以使用静态(Equaals)方法。(System.Object是所有值类型和引用类型的隐式基类,其中包含用户定义的结构和类)
  • 若要确定两个结构实例中的实例字段是否具有相同的值,可使用ValueType.Equals方法。(由于所有的结构都隐式继承自System.ValueType,因此可以直接在对象上调用该方法,如下所示)
// Person is defined in the previous example.

//public struct Person
//{
//    public string Name;
//    public int Age;
//    public Person(string name, int age)
//    {
//        Name = name;
//        Age = age;
//    }
//}

Person p1 = new Person("Wallace", 75);
Person p2;
p2.Name = "Wallace";
p2.Age = 75;

if (p2.Equals(p1))
    Console.WriteLine("p2 and p1 have the same values.");

// Output: p2 and p1 have the same values.

  Equals 的 System.ValueType 实现使用反射,因为它必须能够确定任何结构中有哪些字段。在创建自己的结构时,重写Equals 方法可以提供针对类型的高效求等算法。要确定两个类实例中字段的值是否相等,可以使用Equals方法或==运算符。但是,只有类通过已重写或重载提供关于那种类型对象的相等含义的自定义时,才能使用它们。类也可以实现IEquatable<T>接口或IEqualityComparer<T>接口。这两个接口都提供可用于测试值相等性的方法。

时间: 2024-10-25 16:41:06

C#编程(7_对象)的相关文章

sdut 上机练习8面向对象编程(对象的数组)

上机练习8面向对象编程(对象的数组) Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 利用类对象数组完毕N个学生数据(学号是字符串类型.成绩是整型)的输入.输出. 输入 输入有N+1行: 第一行的整数N表示学生数目: 下面N行是N个学生的数据,每行中第一个是表示学号的字符串,第二个是表示学生成绩的整数. 输出 输出N个学生数据. 每一个学生的数据占一行. 演示样例输入 5 01 89 02 78 03 56 04 92 05 76 演示样例输出 01

描述性编程与对象库编程的对比

项目中一直使用的是描述性编程,维护期间的感触就是描述性编程的自动化脚本维护太费力,如果系统改版就要基本把脚本全部翻新,我们现在就面临这个问题.因为还没换过工作,所以对对象库编程还只是练习,我个人感觉对象库编程的优势还是很明显的,一直期望在项目中能真正应用对象库编程方式. 个人感觉 描述性编程的优点是脱离对象库,识别对象时不容易出错:缺点是维护脚本太繁琐,尤其遇到系统改版时.幸亏我接手自动化的时候坚决强调要加强脚本的公用性和复用性,合并了好多公用的动作和用例,要不然会相当惨. 个人了解 对象库编程

10.JAVA编程思想——对象容纳

欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51040244 "如果一个程序只含有数量固定的对象,而且已知它们的存在时间,那么这个程序可以说是相当简单的." 通常,我们的程序需要根据程序运行时才知道的一些标准创建新对象.若非程序正式运行,否则我们根本不知道自己到底需要多少数量的对象,甚至不知道它们的准确类型.为了满足常规编程的需要,我们要求能在任何时候.任何地点创建任意数量的对象.所以不可依赖一个已命名的句柄来容

1.JAVA 编程思想——对象入门

对象入门 欢迎转载,转载请标明出处:    http://blog.csdn.net/notbaron/article/details/51040219 如果学JAVA,没有读透<JAVA 编程思想>这本书,实在不好意思和别人说自己学过JAVA.鉴于此,蛤蟆忙里偷闲,偷偷翻看这本传说中的牛书. 面向对象编程OOP具有多方面吸引力.实现了更快和更廉价的开发与维护过程.对分析与设计人员,建模处理变得更加简单,能生成清晰.已于维护的设计方案. 这些描述看上去非常吸引人的,不过蛤蟆还是没啥印象(至少到

js编程-面相对象

//js面相对象编程 //定义constructor构造方法 function myFn(name,sex){ this.name = name; this.sex = sex; } //用prototype追加属性方法 myFn.prototype.getName = function(inter){ console.log(this.name); console.log("兴趣:" + inter); return this.name; } //实例化myFn var newMy

Scala编程--函数式对象

本章的重点在于定义函数式对象,也就是说,没有任何可变状态的对象的类.作为运行的例子,我们将创造若干把分数作为不可变对象建模的类的变体.在这过程中,我们会展示给你Scala面向对象编程的更多方面:类参数和构造函数,方法和操作符,私有成员,子类方法重载,先决条件检查,同类方法重载和自指向. 6.1 类Rational的式样书 一个,或许不怎么重要的,发现是数学上,分数不具有可变的状态.一个分数加到另外一个分数上,产生的结果是一个新的分数.而原来的数不会被“改变”.我们将在本章设计的不可变的Ratio

scala actor编程之对象传递

scala 最吸引人的一点就是actor并发编程了.但是纵观scala官方文档,baidu文档,IBM文档都写的通过字符串传呀传,如果用作actor编程说明当然没有问题.但是在正式开放中,光传字符串就显的势单力薄了. 所以如何传对象呢? 先看通过字符串传递消息的模型: 消息接收类: import scala.actors.Actor import org.andy.rtbd.actor.ActorDeal class ActorRev1 extends Actor{ def act()={ wh

面向对象编程-何为对象

转自知乎 面向对象,那么对象就是主导因素.因此我们首先实现的不是函数,而是"类",也即对象.. 面向对象:对象就是物体,这种编程思想就是设定一个有一定功能的物体,然后利用这个物体的功能做你想做的事情.(这个物体有attributes,比如名字啊,年龄啊等等等等,有methods,比如吃喝拉撒睡等等等等,功能==methods)面向过程:你想干嘛,就直接写个功能,然后做你想做的事情. 借楼上的例子,你想写个程序洗衣服,面向对象就是设定一个人,把这个对象赋予拿衣服,搭车,交易,取衣服,回家

游戏编程模式-对象池

“使用固定的对象池重用对象,取代单独的分配和释放对象,以此来达到提升性能和优化内存使用的目的.” 动机 假设我们正在致力于游戏的视觉效果优化.当英雄释放魔法时,我们想让一个火花在屏幕上炸裂.这通常需要一个粒子系统(一个用来生成大量小的图形并在它们生存周期产生动画的引擎)来实现.而这个粒子系统实现这个火花的时候会产生大量的粒子,我们需要非常快速的创建这些粒子同时在这些粒子“死亡”的时候释放这些粒子对象.在这里,我们会碰到一个严重的问题——内存碎片化. 碎片化地害处 为游戏和移动设备编程在很多方面都