C#中创建对象的几种方式

一、使用new关键字

这个是我们使用最多的方式,创建简单,但是扩展性较差

二、使用工厂方法

工厂方法是一种设计模式,通过在类中定义静态方法来创建对象,把对象创建过程封装在方法内部

比如:

using System;
 
namespace SimpleFactorySample
{
    class ChartFactory
    {
        //静态工厂方法
        public static Chart GetChart(string type)
        {
            Chart chart = null;
            if(type.Equals("histogram"))
            {
                chart=new HistogramChart();
                Console.WriteLine("初始化设置柱状图");
            }
            else if(type.Equals("pie"))
            {
                chart=new PieChart();
                Console.WriteLine("初始化设置饼状图");
            }
            else if(type.Equals("pie"))
            {
                chart=new LineChart();
                Console.WriteLine("初始化设置折线图");
            }
            return chart;
        }
    }
}

创建的时候就是:

using System;
 
namespace SimpleFactorySample
{
    class Program
    {
        static void Main(string[]args)
        {
            Chart chart;
             //读取配置文件
            string chartStr=ConfigurationManager.AppSettings["chartType"];
            chart = ChartFactory.GetChart(chartStr);  //通过静态工厂方法创建产品
            chart.Display();
            Console.Read();
        }
    }
}

chart = ChartFactory.GetChart(chartStr);

三、使用反射

反射是一种在运行时动态创建对象的机制,通过使用System.Reflection,可以在运行时通过类型信息创建对象,比如:

ClassName obj = (ClassName)Activator.CreateInstance(typeof(ClassName));

但是这里我们得说一下反射得原理:

反射的原理基于.NET平台中的元数据和类型信息。每个类型在编译后都会包含一些元数据,这些元数据描述了类型的结构、成员、方法等信息。当我们使用反射时,运行时环境通过读取这些元数据来获取类型的详细信息,然后我们可以使用这些信息来创建对象、调用方法等操作。

这里可以说一下typeof和反射得关系,typeof运算符是获取了类型得元数据,这是在某些情况下可能用于编译时的类型检查或获取静态信息,而不涉及动态的成员访问或操作

Type type = typeof(MyClass);
MethodInfo method = type.GetMethod("MyMethod");

而使用反射是这样得

using System;
using System.Reflection;

public class MyClass
{
    public void MyMethod()
    {
        Console.WriteLine("Hello, Reflection!");
    }
}

public class Program
{
    public static void Main()
    {
        Type type = typeof(MyClass);
        object obj = Activator.CreateInstance(type);

        MethodInfo method = type.GetMethod("MyMethod");
        method.Invoke(obj, null);
    }
}

使用Activator.CreateInstance 方法创建了 MyClass 的实例 obj,

四、使用对象克隆

如果实现了ICloneable接口,使用Clone方法来创建对象副本:

ClassName obj = originalObj.CLone() as ClassName;

五、使用序列化和反序列化

将对象序列化转化为字节流或其他格式,然后反序列化位对象,可以创建对象的副本,这通常用于对象的深度复制或在进程之间传输对象,比如JSON或XML的序列化和反序列化

有关序列化和反序列化,可以说的再多一些,在C#中,序列化包括二进制序列化(BinaryFormatter),XML序列化(XML Serialization),JSON序列化(JSON Serialization),

在Unity中,当一个Private对象前加上[Serializable]后,序列化器就会使用反射来获取类型得所有字段和属性,并对它们进行序列化,底层就是通过反射来获取类或者对象的信息

猜你喜欢

转载自blog.csdn.net/leikang111/article/details/131698276