不了解C#中的对象实例化
这篇文章对我对C#类的理解以及为什么它们比静态函数更有优势。
我想获得一个对象列表。 列表中的每个对象代表表中的记录。 这在静态函数中很容易做到。
使用课程,我能够按如下方式进行:
调用例程:
ListOfBusinesses l = new ListOfBusinesses (); List b = l.listBusinesses();
课程:
public class Business { public string Bupk { get; set; } public string Bu_name { get; set; } } public class ListOfBusinesses { public List listBusinesses() { List businesses = new List(); businesses.Add(new Business("1", "Business Name 1")); businesses.Add(new Business("2", "Business Name 2")); return businesses; } }
我不能重写这个类,以便可以用一行完成:
ListOfBusinesses l = new ListOfBusinesses();
在我看来,上面的ListofBusinesses类只不过是一个包含在没有属性的类中的静态函数,只是为了拥有一个类。
我试过了:
public class ListOfBusinesses { List businesses; public List ListOfBusinesses() { List businesses = new List(); businesses.Add(new Business("1", "Business Name 1")); businesses.Add(new Business("2", "Business Name 2")); return businesses; } }
但收到编译器错误“成员名称不能与封闭类型相同”。 例如,我试图使用构造函数,但我遗漏了一些东西。
任何帮助都会在我误解了一段时间的地方启发我。
迈克托马斯
我认为你混淆了静态函数,构造函数和工厂方法的概念。
静态function
定义
这是一个无法访问(并且不与之关联) this
实例的方法。
例
public class BusinessHelper { public static List ListBusinesses() { List businesses = new List (); businesses.Add(new Business("1", "Business Name 1")); businesses.Add(new Business("2", "Business Name 2")); return businesses; } }
用法
使用类名称调用静态方法,而不是类的实例。
List businesses = BusinessHelper.ListBusinesses();
构造函数 :这是一个创建类的this
实例的方法。 它没有返回值,并在实例化对象时调用。
例
public class BusinessList { public List TheList; public BusinessList() { TheList = new List (); TheList.Add(new Business("1", "Business Name 1")); TheList.Add(new Business("2", "Business Name 2")); } }
用法
创建对象的新实例。
BusinessList myBusinessList = new BusinessList(); businesses = myBusinessList.TheList;
工厂方法
定义
这是一个创建对象实例的方法,以某种方式实例化它,并返回对它的引用。
例
public class BusinessList { public List TheList; public static BusinessList BusinessListWithTwoCompanies() { BusinessList instance = new BusinessList(); businesses = new List (); businesses.Add(new Business("1", "Business Name 1")); businesses.Add(new Business("2", "Business Name 2")); return instance; } }
用法
调用工厂方法而不是创建新对象。
BusinessList myBusinessList = BusinessList.BusinessListWithTwoCompanies(); businesses = myBusinessList.TheList;
另外要注意两件事:
-
您声明了一个
businesses
字段,但继续在ListOfBusinesses()
方法中实例化另一个名为businesses
变量并将其返回。businesses
领域什么都不会发生。 小心变量范围。 -
您不能拥有与该类同名的成员(字段,属性或方法)。 这是为构造函数保留的,它没有返回类型(参见上文)。 这就是您收到编译器错误的原因。
当然。 而不是封装List
,扩展它。 然后你只需要在构造函数中添加它。
public class ListOfBusinesses : List { public ListOfBusinesses() : base() { Add(new Business("1", "Business Name 1")); Add(new Business("2", "Business Name 2")); } }
要使用它:
List l = new ListOfBusinesses();
对于所有OO语言,对象实例化基本相同。 使用类而不是静态函数允许更大的灵活性并最终减少编码,尤其是在跟踪许多类似项目时。
想想书籍和图书馆。
如果您将该书作为对象类,则可以将其实例化以创建大量书籍并将其存储在库中。 你已经实施的每本书都是独一无二的。 如果您没有对其进行任何更改,则每个实例化的图书似乎都是原始图书的副本(尽管在较低级别,每本图书都有唯一的序列号)。 它具有相同的封面,页数和内容,但您可以轻松地将您的免费精选名字大全写在一个副本中,从而使其与其他副本不同。
如果你使这本书成为静态的,那么虽然你不能创建单独的副本,但是你看的是同一本书,但是从不同的角度来看。 如果您在其中写下您的免费精选名字大全,那么您的免费精选名字大全就会出现在本书的每个视图中。
我不会发布任何代码,因为在我打字的时候,很多其他代码已经为您的业务对象发布了代码示例。
您正在寻找工厂方法而不是构造函数。
您的编译器错误是因为您的类名是“ListOfBusinesses”,方法名称也是“ListOfBusinesses”。 如果它是一个构造函数,这将没有问题,但由于你有一个返回类型,C#认为你的意思是它是一个方法而不是一个构造函数。
至于获取业务列表,为什么不创建这样的类:
public class BusinessService { public List GetBusinesses() { // Build and return your list of objects here. } }
然后使用它:
BusinessService service = new BusinessService(); List businesses = service.GetBusinesses();
你试图在构造函数中返回与类不同的东西
public class ListOfBusinesses { ... public List ListOfBusinesses() { ...
您不能在构造函数中指定返回类型,您需要:
public ListOfBusinesses() { ...
正如迈克托马斯所说,如果那是你想要的,你应该使用工厂。
问题是你正在使用一个用于调用类的构造函数的保留字(new)。
构造函数的语义是返回正在创建的类的实例,它遵循没有返回值且具有相同名称的类的规则。
如果不是那样的话,那么,如果你做了任何new MyObject
……你怎么会(或编译器)应该知道返回的类型?
一般来说,除非ListOfBusinesses具有List
public class Business { //Business class methods/properties/fields static List GetList() { List businesses = new List (); businesses.Add(new Business("1", "Business Name 1")); businesses.Add(new Business("2", "Business Name 2")); return businesses; } }
虽然这是直截了当的方式,但沿着这条道路前进的最终结果是将此方法从Business类重构为对象工厂,通常通过像NHibernate或Castle Windsor这样的ORM框架提供。
如果我没有错,你想访问一个数据库,并通过一行调用检索一个对象列表。
首先,您需要一个封装db访问并公开List方法的DAO类。 在DAO中你可以使用NHibernate,Linq2XXX或任何你想要的(样本)
public class BusinessItem { public string Code { get; set; } public string Description { get; set; } } public class BusinessItemsDAO { ... public List List() { // fake... should retrieve from db var list = new List (); // returs the list return list; } ... }
您的客户端代码可以调用
var listOfBusinessItems = new BusinessItemsDAO().List();
如果您启用了Linq,则返回IQueryable而不是List可能会有所帮助。
正如人们之前所说 – 你的语法不正确。 ListOfBusiness()
是一个构造函数,不显式返回一个对象。 它改为在ListOfBusiness
的新实例上ListOfBusiness
并且应该处理任何必要的创建。
也就是说 – 如果创建List
很简单,那么绝对没有理由将它作为静态方法的一部分。 您甚至可以在List上定义一个扩展方法,该方法获取一个空列表并填充它。 这称为工厂模式,其中对象的方法或实例负责创建新实例。
如果存在需要跟踪的属性或状态,那么您希望将ListOfBusiness
扩展到实例化类中的位置。 如果List
每次调用时都会更改,或者如果您需要添加新业务的位置,则ListOfBusiness
类可能对此有用。
上述就是C#学习教程:不了解C#中的对象实例化分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1022059.html