关于C# 类和对象详情

目录
  • 一、对象的定义和创建
  • 二、、对象的初始化
    • 1. 借助构造函数或使用
    • 2. 实例构造函数
    • 3. 静态构造
  • 三、对象的引用

一、对象的定义和创建

定义类对象的方法为:

类名 对象名;

类是引用类型的,当定义了对象之后,系统会为数据引用分配存储空间,但是用来保存对象的实际数据的空间并没有分配。

对象的创建

创建对象时需要使用new运算符new运算符可以为任意指定类类型的实例分配并初始化内存。

创建对象的语法形式如下: 对象名 = new类名();

代码示例,对象的定义和创建:

class Program
{
    static void Main(string[] args)
    {
        //对象的定义和创建
        Test t = new Test();

        //或者 先定义
        Test t1;
        // 使用时创建
        t1 = new Test();
    }
}

class Test
{

}

行对象的创建时,需要注意:

  • new运算符后为要创建的对象所属类的类名
  • 类名后的圆括号不能省略
  • 可以将对象的定义和创建合并在一起

二、、对象的初始化

C#中实现对象初始化的方式有两种:

  1. 借助构造函数或使用
  2. 对象初始化列表。

1. 借助构造函数或使用

new运算表达式的圆括号中所带参数并不是任意的,圆括号中是否支持参数、可以携带几个参数是由对象所属类的构造函数形式决定的。

C#的类支持两种构造函数:实例构造函数和静态构造函数

实例构造函数是实现初始化类实例所需操作的成员。

静态构造函数是一种用于在第一次加载类本身时实现其初始化所需操作的成员。

C#类的静态构造函数初始化类层次的项目。通常,静态构造函数初始化类的静态字段。

类层次的项目初始化必须在任何静态成员被引用之前,同时也必须在该类的所有对象创建之前。

2. 实例构造函数

实例构造函数是一个特殊的方法,它在创建类的每个新对象时执行,用以初始化对象的状态。

实例构造函数应该声明为public

下面是实例构造函数的一般定义形式:

// 无参构造
public 类名()
{
    函数体
}
// 带参构造
public 类名(参数列表)
{
    函数体
}

定义实例构造函数时需注意:

  • 实例构造函数可以带有参数,也可以不带参数,
  • 实例构造函数的参数设置决定了对象创建时new运算表达式中圆括号中的参数格式;
  • 实例构造函数可以重载。

其他说明:

  • 当类的声明中没有显式提供实例构造函数时,编译器会提供一个隐式的默认构造函数。
  • 默认构造函数不带参数,并且方法体为空。
  • 调用默认构造函数实现对象创建时,new运算表达式后的圆括号内不能带有参数。

3. 静态构造

静态构造函数:

  • C#类的静态构造函数初始化类层次的项目。
  • 通常,静态构造函数初始化类的静态字段。
  • 类层次的项目初始化必须在任何静态成员被引用之前,同时也必须在该类的所有对象创建之前。

使用静态构造函数时,需注意:

  • 静态构造函数只有一个,不能重载,并且不能带参数;
  • 静态构造函数不能有访问修饰符,它由系统自动调用;
  • 类的静态构造函数和实例构造函数可以共存;
  • 静态构造函数不能访问类的实例成员。

代码示例:

class Program
{
    static void Main(string[] args)
    {
        Test t = new Test();
        // 输出: 0,0,1
        Console.WriteLine(t.X + "," + t.Y + "," + Test.Z)

        Test t1 = new Test(1, 2);
        // 输出: 1,2,2
        Console.WriteLine(t1.X + "," + t1.Y + "," + Test.

        Test t2 = new Test(3, 4);
        // 输出: 3,4,3
        Console.WriteLine(t2.X + "," + t2.Y + "," + Test.

        Console.ReadLine();
    }
}

class Test
{
   public int X = 0;
   public int Y = 0;

   public static int Z = 0;

    // 无参构造
    public Test() { Z++; }

    // 带参构造
    public Test(int X, int Y)
    {
        this.X = X;
        this.Y = Y;
        Z++;
    }

    // 静态构造 -- 初始化Z值
    static Test()
    {
        Z = 0;
    }
}

三、对象的引用

对象成员的引用形式为:

对象名.实例成员名
// 或者
对象名.实例成员名(实参列表)

对象的运算同一类的两个对象支持赋值、相等与不相等运算如下所示:

Test t = new Test();
Test t1 = new Test();

// 输出:false
Console.WriteLine(t == t1);
// 对象的赋值操作
t = t1;
// 输出:true --> 此时t,t1表示为同一对象
Console.WriteLine(t == t1);

对象之间除了可以进行比较,赋值操作之外。还可以至此isas运算符,isas运算符更多的应用于基类和派生类之间进行类型转换,详细说明在继承处讲解。

到此这篇关于关于C# 类和对象详情的文章就介绍到这了,更多相关C# 类和对象内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • c#类的使用示例

    Notes: 数据private类型,大部分方法public类型: 如果有继承或者相互引用,注意数据的公有还是私有,保证数据的只读性质: C#不能够像C++一样在数据声明时调用构造函数,必须使用Myclass temp = new Myclass()来调用构造函数: C#不支持多重继承关系, 也就是说,一个派生类不允许有多个基类.简单点就是,父亲可能有好多儿子(父类可以派生出许多子类),但是一个孩子只能有一个爸爸(子类不允许多重继承关系): C#和其他面向对象一样,重载,多态,虚函数,抽象类这些

  • c#对象反序列化与对象序列化示例详解

    1.对象序列化的介绍 (1).NET支持对象序列化的几种方式二进制序列化:对象序列化之后是二进制形式的,通过BinaryFormatter类来实现的,这个类位于System.Runtime.Serialization.Formatters.Binary命名空间下.SOAP序列化:对象序列化之后的结果符合SOAP协议,也就是可以通过SOAP 协议传输,通过System.Runtime.Serialization.Formatters.Soap命名空间下的SoapFormatter类来实现的.XML

  • C#对象与XMl文件之间的相互转换

    C#提供三种序列化方式,分别为:1.是使用BinaryFormatter进行串行化: 2.使用SoapFormatter进行串行化: 3.使用XmlSerializer进行串行化.其中对于BinaryFormatter的方式需要实现ISerializable接口,而XmlSeriializ不需要实现对应的接口,可以直接序列化.在这里面我们主要采用XMlSerialize来实现对应的序列化操作进而实现对应的对象和XMl文件之间的转换关系. 在通过序列化实现对应的转换关系操作的功能时,我首先创建了D

  • C#类的多态性详解

    第一种:编译时的多态性,直接这样说不知道说啥?程序执行过程主要分为三步:编译,链接,运行.在编译时体现的多态性是通过方法的重载来实现的.方法的重载我们听过,就是一个类对象调用若干同名,但参数类型.个数不同.类对象是根据参数类型,个数来决定调用哪个同名方法,实现何种操作.C#语言的方法重载与C++.java基本是一样的,但是C#还包含C++的运算符重载,java里面没有这个概念. 第二种:运行时的多态性,是在系统运行时,调用一个名字相同,参数类型也相同以及个数也完全一样的方法,但会完成不同的操作.

  • 自定义实现Json字符串向C#对象转变的方法

    这里使用Atrribute的方式实现了Json字符串向C#对象的转变.因为功能局限,此版本只是针对于Json字符串,如"response":"Hello","id":21231513,"result":100,"msg":"OK."; 而不是Json数组.这里的Atrribute是作用在属性上,像NHibernate中的Atrribute一样,是在运行时通过反射来获取这个属性对应于Jso

  • C#类中属性与成员变量的使用小结

    属性实际上和成员变量没什么区别,属性代表类的某种特征, 让人更好理解而已. 使用中注意问题:1.属性名和变量名不能相同, 2.一般变量都是private,属性都是public的,属性用于给类外调用,变量限于类内使用,感觉封装性体现得要好些 3.属性必须和一个变量相联系,而这个变量必须要在类中定义.如果不定义,用成如下方法: 复制代码 代码如下: public int b //定义一个属性b  {      get   {    return b;   }   set   {    b = val

  • C#类的访问修饰符用法分析

    本文详细分析了C#类的访问修饰符用法,分享给大家供大家参考.具体用法分析如下: 默认情况下,类声明为内部的,即只有当前工程中的代码才能访问它.可以用internal访问修饰符关键字显式指定,但这不是必须的,类在定义时默认为此类型的类.但是C# 方法默认访问级别: private. 方法或者属性的修饰符的访问级别如下图: 访问修饰符 意 义 public 访问不受限制,可以类内和任何类外的代码中访问 protected 可访问域限定于类内或从该类派生的类内 internal 可访问域限定于类所在的

  • c#对象初始化顺序实例分析

    本文实例分析了c#对象初始化顺序.分享给大家供大家参考.具体如下: using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { A a = new B(); Console.ReadLine(); } } class A { //调用到这个构造函数时:x=1,y

  • C#类中static变量用法分析

    本文实例讲述了C#类中static变量用法.分享给大家供大家参考.具体分析如下: 先来看一段代码: 复制代码 代码如下: using System; namespace Param { class Class1 { static int i = getNum(); int j = getNum(); static int num = 1; static int getNum() { return num; } [STAThread] static void Main(string[] args)

  • C#类继承中构造函数的执行序列示例详解

    前言 大家都知道类的继承规则: 1.派生类自动包含基类的所有成员.但对于基类的私有成员,派生类虽然继承了,但是不能在派生类中访问. 2.所有的类都是按照继承链从顶层基类开始向下顺序构造.最顶层的基类是System.Object类,所有的类都隐式派生于它.只要记住这条规则,就能理解派生类在实例化时对构造函数的调用过程. 不知道大家在使用继承的过程中有木有遇到过调用构造函数时没有按照我们预期的那样执行呢?一般情况下,出现这样的问题往往是因为类继承结构中的某个基类没有被正确实例化,或者没有正确给基类构

  • C#类中方法的执行顺序是什么

    有些中级开发小伙伴还是搞不太明白在继承父类以及不同场景实例化的情况下,父类和子类的各种方法的执行顺序到底是什么,下面通过场景的举例来重新认识下方法的执行顺序: (下面内容涉及到了C#中的继承,构造函数,虚方法,虚方法的重写,new关键字等知识点) 场景一 有子类继承,但是只实例化父类:只执行A对象,输出A对象的信息 class A { public A() => Console.WriteLine("A的构造函数"); public virtual void Fun() =>

  • C#对象为Null模式(Null Object Pattern)实例教程

    本文以实例形式简单讲述了C#对象为Null模式(Null Object Pattern),分享给大家供大家参考.具体实现方法如下: 所谓的"对象为Null模式",就是要求开发者考虑对象为Null的情况,并设计出在这种情况下的应对方法. 以前面"C#策略模式(Strategy Pattern) "一文中的例子来说,在我们的客户端程序中只考虑了用户输入1,2,3的情况,如果用户输入其它数字,比如4,就没有一个对应的IBall接口实现类实例产生,于是会报如下的错: 为了应

  • C#类中的属性使用总结(详解类的属性)

    复制代码 代码如下: private int dd;  public int dd  {      get{ return xx*3;}      set{ xx = value/3;}  } 没有set的属性是一种只读属性,没有get的访问器是一种只写属性.(1) get访问器用来返回字段或者计算 并返回字段,它必须以return或者throw终结. 复制代码 代码如下: private string name;  public string Name  {      get      { 

随机推荐