首页 > 系统相关 >windows C#-对象

windows C#-对象

时间:2024-11-10 20:17:30浏览次数:3  
标签:p2 p1 Name Person windows Age C# 对象 public

类或结构定义的作用类似于蓝图,指定该类型可以进行哪些操作。 从本质上说,对象是按照此蓝图分配和配置的内存块。 程序可以创建同一个类的多个对象。 对象也称为实例,可以存储在命名变量中,也可以存储在数组或集合中。 使用这些变量来调用对象方法及访问对象公共属性的代码称为客户端代码。 在 C# 等面向对象的语言中,典型的程序由动态交互的多个对象组成。

静态类型的行为与此处介绍的不同。

结构实例与类实例

由于类是引用类型,因此类对象的变量引用该对象在托管堆上的地址。 如果将同一类型的第二个变量分配给第一个变量,则两个变量都引用该地址的对象。 本文稍后部分将更详细地讨论这一点。

类的实例是使用 new 运算符创建的。 在下面的示例中,Person 为类型,person1 和 person2 为该类型的实例(即对象)。

using System;

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);
    }
}
/*
    Output:
    person1 Name = Leopold Age = 6
    person2 Name = Molly Age = 16
    person1 Name = Molly Age = 16
*/

由于结构是值类型,因此结构对象的变量具有整个对象的副本。 结构的实例也可使用 new 运算符来创建,但这不是必需的,如下面的示例所示:

using System;

namespace Example
{
    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);
        }
    }
    /*
        Output:
        p1 Name = Alex Age = 9
        p2 Name = Spencer Age = 7
        p1 Name = Alex Age = 9
    */
}

p1 和 p2 的内存在线程堆栈上进行分配。 该内存随声明它的类型或方法一起回收。 这就是在赋值时复制结构的一个原因。 相比之下,当对类实例对象的所有引用都超出范围时,为该类实例分配的内存将由公共语言运行时自动回收(垃圾回收)。 无法像在 C++ 中那样明确地销毁类对象。 

公共语言运行时中高度优化了托管堆上内存的分配和释放。 在大多数情况下,在堆上分配类实例与在堆栈上分配结构实例在性能成本上没有显著的差别。

对象标识与值相等性

在比较两个对象是否相等时,首先必须明确是想知道两个变量是否表示内存中的同一对象,还是想知道这两个对象的一个或多个字段的值是否相等。 如果要对值进行比较,则必须考虑这两个对象是值类型(结构)的实例,还是引用类型(类、委托、数组)的实例。

  • 若要确定两个类实例是否引用内存中的同一位置(这意味着它们具有相同的标识),可使用静态 Object.Equals 方法。 (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 = new Person("", 42);
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 方法或 == 运算符。 但是,只有类通过重写或重载提供关于那种类型对象的“相等”含义的自定义时,才能使用它们。 类也可能实现 IEquatable<T> 接口或 IEqualityComparer<T> 接口。 这两个接口都提供可用于测试值相等性的方法。 设计好替代 Equals 的类后,请务必遵循如何为类型定义值相等性和 Object.Equals(Object) 中介绍的准则。

标签:p2,p1,Name,Person,windows,Age,C#,对象,public
From: https://blog.csdn.net/m0_72813396/article/details/143444532

相关文章

  • windows C#-匿名类型
    匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。类型名由编译器生成,并且不能在源代码级使用。每个属性的类型由编译器推断。可结合使用new运算符和对象初始值设定项创建匿名类型。 以下示例显示了用两个名为Amount和......
  • 小北的字节跳动青训营与LangChain实战课:深入探索Chain的奥秘(上)写一篇完美鲜花推文?用Se
     前言    最近,字节跳动的青训营再次扬帆起航,作为第二次参与其中的小北,深感荣幸能借此机会为那些尚未了解青训营的友友们带来一些详细介绍。青训营不仅是一个技术学习与成长的摇篮,更是一个连接未来与梦想的桥梁~小北的青训营XMarsCode技术训练营——AI加码,字节跳......
  • 【优化求解】蚁群算法ACO求解经济损失的航班延误恢复优化问题(目标函数:航班延误成本最
    ......
  • 【CRM系统选型指南:国内八大主流工具比较】
    本文将对十大主流CRM系统进行比较:纷享销客、ZohoCRM、Pipedrive、简信CRM、HubSpotCRM、八百客CRM、金蝶CRM、浪潮CRM、销售易CRM本文将深入评比2024年主流的CRM系统,帮助你了解各系统之间的主要区别、优缺点以及当前的发展趋势。通过详细的比较和分析,为你提供一个清晰的......
  • 【Python知识宝库】快速了解 `isinstance()` 的原理、作用和使用场景
    ......
  • C++实现命令行文本计数统计程序
    附上一位博主写的关于git的使用(个人感觉非常完整,对新手很友好):Git及Tortoisegit下载安装及使用详细配置过程_tortoisegit下载远程代码-CSDN博客 Gitee地址:https://gitee.com/wnmdsqwnhkmc/second-assignment注:本文并不包含主函数,完整代码请移步Gitee路径:[项目>>ConsoleAppl......
  • MDPI之Applied Science word 模板下载
    因为之前找过很多资料,都没有word模板下载的教程,所以在这里留个记号。官网点此一、进入如下页面 二、下拉找到Submissionchecklist在这里有 MicrosoftWord模板和 LaTeX模板(在此处单击或去官网点击即可自行下载)。......
  • docker的使用(使用docker部署ctf题目)
    最近实验室要举办一次ctf竞赛,本人web手兼杂项手,杂项的题在服务器上传附件就行,比较好弄,然后web的题目需要docker部署,就学了一下docker,前前后后忙了一天多,做了很多无用功。我太菜鸡了。记录一下配置过程还有docker的一些知识点。(学习尚浅,希望路过的大佬多多指导)0X01什么是DockerD......
  • Pyhthon实时行情接口WebSocket接入
    Python做量化,如果是日内策略,需要更实时的行情数据,不然策略滑点太大,容易跑偏结果。之前用行情网站提供的level1行情接口,实测平均更新延迟达到了6秒,超过10只股票并发请求频率过快很容易封IP。后面又尝试了买代理IP来请求,成本太高而且不稳定。在Github上看到一个可转债的Golang高频......
  • P2893 [USACO08FEB] Making the Grade G 题目分析
    P2893[USACO08FEB]MakingtheGradeG题目分析题目链接分析题目性质不难解析出题目中的序列\(B\)有“单调不下降”和“单调不上升”两种情况,不难想到分两种情况讨论答案即可。有一个性质:在满足答案最小化的情况,一定存在一种方案使得\(B\)中的数字一定在\(A\)中。......