加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C# – 对象创建

发布时间:2020-12-15 17:47:43 所属栏目:百科 来源:网络整理
导读:我有一段时间是 PHP程序员.两天前,我去了一个面试,他们给了我一个在ASP.NET(C#)做的分配.我真的想摆脱php领域的势力,学习一种可以挑战我的体面语言.所以,我有一个问题 是否必须在运行时实例化所有实例?在PHP中,我可以做这样的事情…… class SomeObject {}$
我有一段时间是 PHP程序员.两天前,我去了一个面试,他们给了我一个在ASP.NET(C#)做的分配.我真的想摆脱php领域的势力,学习一种可以挑战我的体面语言.所以,我有一个问题

是否必须在运行时实例化所有实例?在PHP中,我可以做这样的事情……

class SomeObject {}

$objString = "SomeObject";
$objInstance = new $objString();

我不能在C#中做到这一点,可能因为它是一种编译语言.在C#中,我是否必须创建一个将实例化对象的Factory模式.这也意味着如果我必须在该Factory中实例化10个对象,那么将有10个if语句是丑陋的.

我发现Activator对象的Activator :: createInstance()方法,但我无法让它工作.还有反思,但这两者(正如我所知)都会对性能产生影响.

那么,有没有办法动态创建对象,或者可能是在C#中,我可以立即创建我的程序将使用的所有对象,这真的很诱人?

编辑

好的,所以让我说我有5个对象用于5个不同的场合.我运行程序,程序评估它需要其中一个对象并实例化它.其他四个从未实例化.我关闭了程序.

第二次,我使用不同的参数运行程序,并创建了这5个对象中的2个,其他三个永远不会出现.

这在PHP中很容易.让我们把Activator和其他工具放在一边,在C#世界中创建所有5个对象是不错的做法,当我知道可能只使用其中一个时?

解决方法

我不知道我的问题是否错误,但是在C#中创建给定类SomeObject的对象就像下面这样简单:
var obj = new SomeObject();

使用Activator-Class它应该看起来……喜欢以下之一

var obj2 = Activator.CreateInstance(typeof(SomeObject)); 
var obj3 = Activator.CreateInstance<SomeObject>();`

var someObjType = Type.GetType("SomeObject");  // if you have to use a string
var obj4 = Activator.CreateInstance(someObjType);

请注意,在大多数情况下,不需要使用Activator-Class来实例化对象.如果您在编译时知道类的类型,那么第一个示例是标准方法.

UPDATE

关于你的更新,因为我不知道我的想法的细节是懒惰的instanciation.由于所有内容(包括应用程序的入口点都是C#中的对象),您可以使用带有支持字段的属性来解决问题,如下例所示

class Program
{
    // backing fields
    private SomeObject obj1;
    private SomeObject obj2;
    private SomeObject obj3;
    private SomeObject obj4;
    private SomeObject obj5;

    // this way,obj1 only gets instanciated when needed
    public SomeObject Obj1 
    {
        get
        {
            if (obj1 == null)
            { 
                 obj1 = new SomeObject(); 
            }
            return obj1;
        }
    }

    // same for the other objects

    [...]

}

我担心你的对象的内存使用情况,我建议你学习如何正确实现IDisposable

更新2

为了提供@Mad Sorcerer评论中推荐的可能性,您可以使用Lazy-Class来支持字段,这需要您的肩膀,效果与之前的更新完全相同.

class Program
{
    // Lazy backing fields
    private Lazy<SomeObject> obj1 = new Lazy<SomeObject>();
    private Lazy<SomeObject> obj2 = new Lazy<SomeObject>();
    private Lazy<SomeObject> obj3 = new Lazy<SomeObject>();
    private Lazy<SomeObject> obj4 = new Lazy<SomeObject>();
    private Lazy<SomeObject> obj5 = new Lazy<SomeObject>();

    // this way,obj1 only gets instanciated when needed
    public SomeObject Obj1 
    {
        get { return obj1.Value; }
    }

    // same for the other objects

    [...]

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读